@guided-tour-s4marth/recorder 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/capture.d.ts +25 -0
- package/dist/capture.d.ts.map +1 -0
- package/dist/capture.js +57 -0
- package/dist/capture.js.map +1 -0
- package/dist/export.d.ts +25 -0
- package/dist/export.d.ts.map +1 -0
- package/dist/export.js +24 -0
- package/dist/export.js.map +1 -0
- package/dist/index.d.ts +9 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +5 -0
- package/dist/index.js.map +1 -0
- package/dist/overlay/RecorderOverlay.d.ts +29 -0
- package/dist/overlay/RecorderOverlay.d.ts.map +1 -0
- package/dist/overlay/RecorderOverlay.js +480 -0
- package/dist/overlay/RecorderOverlay.js.map +1 -0
- package/dist/sourceMap.d.ts +18 -0
- package/dist/sourceMap.d.ts.map +1 -0
- package/dist/sourceMap.js +54 -0
- package/dist/sourceMap.js.map +1 -0
- package/package.json +55 -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,25 @@
|
|
|
1
|
+
import type { InteractionAction } from '@guided-tour-s4marth/core';
|
|
2
|
+
export interface CapturedTarget {
|
|
3
|
+
element: Element;
|
|
4
|
+
anchorId?: string;
|
|
5
|
+
sourceFile?: string;
|
|
6
|
+
sourceLine?: number;
|
|
7
|
+
componentName?: string;
|
|
8
|
+
interactionPath: InteractionAction[];
|
|
9
|
+
}
|
|
10
|
+
export interface CaptureSession {
|
|
11
|
+
targets: CapturedTarget[];
|
|
12
|
+
start(): void;
|
|
13
|
+
stop(): void;
|
|
14
|
+
clear(): void;
|
|
15
|
+
undo(): void;
|
|
16
|
+
}
|
|
17
|
+
/**
|
|
18
|
+
* Creates a capture session that records click targets and builds
|
|
19
|
+
* the interaction path (sequence of user actions) for each one.
|
|
20
|
+
*
|
|
21
|
+
* All clicks within a step are accumulated as the `prepare` path until
|
|
22
|
+
* the author explicitly "adds" the target to the step list.
|
|
23
|
+
*/
|
|
24
|
+
export declare function createCaptureSession(onTargetAdded: (target: CapturedTarget) => void): CaptureSession;
|
|
25
|
+
//# sourceMappingURL=capture.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"capture.d.ts","sourceRoot":"","sources":["../src/capture.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,2BAA2B,CAAC;AAEnE,MAAM,WAAW,cAAc;IAC7B,OAAO,EAAE,OAAO,CAAC;IACjB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,eAAe,EAAE,iBAAiB,EAAE,CAAC;CACtC;AAED,MAAM,WAAW,cAAc;IAC7B,OAAO,EAAE,cAAc,EAAE,CAAC;IAC1B,KAAK,IAAI,IAAI,CAAC;IACd,IAAI,IAAI,IAAI,CAAC;IACb,KAAK,IAAI,IAAI,CAAC;IACd,IAAI,IAAI,IAAI,CAAC;CACd;AAED;;;;;;GAMG;AACH,wBAAgB,oBAAoB,CAClC,aAAa,EAAE,CAAC,MAAM,EAAE,cAAc,KAAK,IAAI,GAC9C,cAAc,CAmDhB"}
|
package/dist/capture.js
ADDED
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Creates a capture session that records click targets and builds
|
|
3
|
+
* the interaction path (sequence of user actions) for each one.
|
|
4
|
+
*
|
|
5
|
+
* All clicks within a step are accumulated as the `prepare` path until
|
|
6
|
+
* the author explicitly "adds" the target to the step list.
|
|
7
|
+
*/
|
|
8
|
+
export function createCaptureSession(onTargetAdded) {
|
|
9
|
+
let active = false;
|
|
10
|
+
const targets = [];
|
|
11
|
+
const pendingPath = [];
|
|
12
|
+
function handleClick(e) {
|
|
13
|
+
if (!active)
|
|
14
|
+
return;
|
|
15
|
+
e.preventDefault();
|
|
16
|
+
e.stopPropagation();
|
|
17
|
+
const el = e.target;
|
|
18
|
+
if (!el)
|
|
19
|
+
return;
|
|
20
|
+
const anchorId = el.closest('[data-tour]')?.getAttribute('data-tour') ?? null;
|
|
21
|
+
if (anchorId) {
|
|
22
|
+
pendingPath.push({ action: 'click', anchorId });
|
|
23
|
+
}
|
|
24
|
+
}
|
|
25
|
+
function addTarget(element) {
|
|
26
|
+
const anchorId = element.closest('[data-tour]')?.getAttribute('data-tour') ?? null;
|
|
27
|
+
const target = {
|
|
28
|
+
element,
|
|
29
|
+
interactionPath: [...pendingPath],
|
|
30
|
+
};
|
|
31
|
+
if (anchorId)
|
|
32
|
+
target.anchorId = anchorId;
|
|
33
|
+
targets.push(target);
|
|
34
|
+
pendingPath.length = 0;
|
|
35
|
+
onTargetAdded(target);
|
|
36
|
+
return target;
|
|
37
|
+
}
|
|
38
|
+
return {
|
|
39
|
+
targets,
|
|
40
|
+
start() {
|
|
41
|
+
active = true;
|
|
42
|
+
document.addEventListener('click', handleClick, { capture: true });
|
|
43
|
+
},
|
|
44
|
+
stop() {
|
|
45
|
+
active = false;
|
|
46
|
+
document.removeEventListener('click', handleClick, { capture: true });
|
|
47
|
+
},
|
|
48
|
+
clear() {
|
|
49
|
+
targets.length = 0;
|
|
50
|
+
pendingPath.length = 0;
|
|
51
|
+
},
|
|
52
|
+
undo() {
|
|
53
|
+
targets.pop();
|
|
54
|
+
},
|
|
55
|
+
};
|
|
56
|
+
}
|
|
57
|
+
//# sourceMappingURL=capture.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"capture.js","sourceRoot":"","sources":["../src/capture.ts"],"names":[],"mappings":"AAmBA;;;;;;GAMG;AACH,MAAM,UAAU,oBAAoB,CAClC,aAA+C;IAE/C,IAAI,MAAM,GAAG,KAAK,CAAC;IACnB,MAAM,OAAO,GAAqB,EAAE,CAAC;IACrC,MAAM,WAAW,GAAwB,EAAE,CAAC;IAE5C,SAAS,WAAW,CAAC,CAAa;QAChC,IAAI,CAAC,MAAM;YAAE,OAAO;QACpB,CAAC,CAAC,cAAc,EAAE,CAAC;QACnB,CAAC,CAAC,eAAe,EAAE,CAAC;QAEpB,MAAM,EAAE,GAAG,CAAC,CAAC,MAAwB,CAAC;QACtC,IAAI,CAAC,EAAE;YAAE,OAAO;QAEhB,MAAM,QAAQ,GAAG,EAAE,CAAC,OAAO,CAAC,aAAa,CAAC,EAAE,YAAY,CAAC,WAAW,CAAC,IAAI,IAAI,CAAC;QAE9E,IAAI,QAAQ,EAAE,CAAC;YACb,WAAW,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,OAAO,EAAE,QAAQ,EAAE,CAAC,CAAC;QAClD,CAAC;IACH,CAAC;IAED,SAAS,SAAS,CAAC,OAAgB;QACjC,MAAM,QAAQ,GAAG,OAAO,CAAC,OAAO,CAAC,aAAa,CAAC,EAAE,YAAY,CAAC,WAAW,CAAC,IAAI,IAAI,CAAC;QACnF,MAAM,MAAM,GAAmB;YAC7B,OAAO;YACP,eAAe,EAAE,CAAC,GAAG,WAAW,CAAC;SAClC,CAAC;QACF,IAAI,QAAQ;YAAE,MAAM,CAAC,QAAQ,GAAG,QAAQ,CAAC;QACzC,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QACrB,WAAW,CAAC,MAAM,GAAG,CAAC,CAAC;QACvB,aAAa,CAAC,MAAM,CAAC,CAAC;QACtB,OAAO,MAAM,CAAC;IAChB,CAAC;IAED,OAAO;QACL,OAAO;QACP,KAAK;YACH,MAAM,GAAG,IAAI,CAAC;YACd,QAAQ,CAAC,gBAAgB,CAAC,OAAO,EAAE,WAAW,EAAE,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC;QACrE,CAAC;QACD,IAAI;YACF,MAAM,GAAG,KAAK,CAAC;YACf,QAAQ,CAAC,mBAAmB,CAAC,OAAO,EAAE,WAAW,EAAE,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC;QACxE,CAAC;QACD,KAAK;YACH,OAAO,CAAC,MAAM,GAAG,CAAC,CAAC;YACnB,WAAW,CAAC,MAAM,GAAG,CAAC,CAAC;QACzB,CAAC;QACD,IAAI;YACF,OAAO,CAAC,GAAG,EAAE,CAAC;QAChB,CAAC;KACF,CAAC;AACJ,CAAC"}
|
package/dist/export.d.ts
ADDED
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
import type { Tour, Step } from '@guided-tour-s4marth/core';
|
|
2
|
+
export interface RecorderStep {
|
|
3
|
+
anchorId?: string;
|
|
4
|
+
title: string;
|
|
5
|
+
body: string;
|
|
6
|
+
placement: Step['placement'];
|
|
7
|
+
interactionPath?: Step['prepare'];
|
|
8
|
+
}
|
|
9
|
+
export interface RecorderGap {
|
|
10
|
+
suggestedId: string;
|
|
11
|
+
sourceFile?: string;
|
|
12
|
+
sourceLine?: number;
|
|
13
|
+
componentName?: string;
|
|
14
|
+
/** Lowercase host tag of the clicked element (e.g. "button") — helps the
|
|
15
|
+
* codemod find the right element when the source line is approximate. */
|
|
16
|
+
tagName?: string;
|
|
17
|
+
}
|
|
18
|
+
export interface RecorderExport {
|
|
19
|
+
draft: Omit<Tour, 'status' | 'seen' | 'autoplay'> & {
|
|
20
|
+
status?: Tour['status'];
|
|
21
|
+
};
|
|
22
|
+
gaps: RecorderGap[];
|
|
23
|
+
}
|
|
24
|
+
export declare function exportRecording(tourId: string, tourType: Tour['type'], version: string | undefined, steps: RecorderStep[], gaps: RecorderGap[]): RecorderExport;
|
|
25
|
+
//# sourceMappingURL=export.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"export.d.ts","sourceRoot":"","sources":["../src/export.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,IAAI,EAAE,IAAI,EAAE,MAAM,2BAA2B,CAAC;AAE5D,MAAM,WAAW,YAAY;IAC3B,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,MAAM,CAAC;IACb,SAAS,EAAE,IAAI,CAAC,WAAW,CAAC,CAAC;IAC7B,eAAe,CAAC,EAAE,IAAI,CAAC,SAAS,CAAC,CAAC;CACnC;AAED,MAAM,WAAW,WAAW;IAC1B,WAAW,EAAE,MAAM,CAAC;IACpB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB;8EAC0E;IAC1E,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED,MAAM,WAAW,cAAc;IAG7B,KAAK,EAAE,IAAI,CAAC,IAAI,EAAE,QAAQ,GAAG,MAAM,GAAG,UAAU,CAAC,GAAG;QAAE,MAAM,CAAC,EAAE,IAAI,CAAC,QAAQ,CAAC,CAAA;KAAE,CAAC;IAChF,IAAI,EAAE,WAAW,EAAE,CAAC;CACrB;AAED,wBAAgB,eAAe,CAC7B,MAAM,EAAE,MAAM,EACd,QAAQ,EAAE,IAAI,CAAC,MAAM,CAAC,EACtB,OAAO,EAAE,MAAM,GAAG,SAAS,EAC3B,KAAK,EAAE,YAAY,EAAE,EACrB,IAAI,EAAE,WAAW,EAAE,GAClB,cAAc,CAuBhB"}
|
package/dist/export.js
ADDED
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
export function exportRecording(tourId, tourType, version, steps, gaps) {
|
|
2
|
+
const draftSteps = steps.map(s => ({
|
|
3
|
+
anchorId: s.anchorId,
|
|
4
|
+
title: s.title,
|
|
5
|
+
body: s.body,
|
|
6
|
+
placement: s.placement ?? 'auto',
|
|
7
|
+
prepare: s.interactionPath?.length ? s.interactionPath : undefined,
|
|
8
|
+
}));
|
|
9
|
+
return {
|
|
10
|
+
draft: {
|
|
11
|
+
id: tourId,
|
|
12
|
+
// The author-entered name is the tour's title AND the grouping key the
|
|
13
|
+
// consumer uses (e.g. "v4.14" for a release, "v4.14-feature" for a feature
|
|
14
|
+
// tour under it). The library stays agnostic — it just carries the title.
|
|
15
|
+
title: tourId,
|
|
16
|
+
type: tourType,
|
|
17
|
+
version,
|
|
18
|
+
conditions: [],
|
|
19
|
+
steps: draftSteps,
|
|
20
|
+
},
|
|
21
|
+
gaps,
|
|
22
|
+
};
|
|
23
|
+
}
|
|
24
|
+
//# sourceMappingURL=export.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"export.js","sourceRoot":"","sources":["../src/export.ts"],"names":[],"mappings":"AA2BA,MAAM,UAAU,eAAe,CAC7B,MAAc,EACd,QAAsB,EACtB,OAA2B,EAC3B,KAAqB,EACrB,IAAmB;IAEnB,MAAM,UAAU,GAAW,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;QACzC,QAAQ,EAAE,CAAC,CAAC,QAAQ;QACpB,KAAK,EAAE,CAAC,CAAC,KAAK;QACd,IAAI,EAAE,CAAC,CAAC,IAAI;QACZ,SAAS,EAAE,CAAC,CAAC,SAAS,IAAI,MAAM;QAChC,OAAO,EAAE,CAAC,CAAC,eAAe,EAAE,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,eAAe,CAAC,CAAC,CAAC,SAAS;KACnE,CAAC,CAAC,CAAC;IAEJ,OAAO;QACL,KAAK,EAAE;YACL,EAAE,EAAE,MAAM;YACV,uEAAuE;YACvE,2EAA2E;YAC3E,0EAA0E;YAC1E,KAAK,EAAE,MAAM;YACb,IAAI,EAAE,QAAQ;YACd,OAAO;YACP,UAAU,EAAE,EAAE;YACd,KAAK,EAAE,UAAU;SAClB;QACD,IAAI;KACL,CAAC;AACJ,CAAC"}
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
export { createCaptureSession } from './capture.js';
|
|
2
|
+
export type { CapturedTarget, CaptureSession } from './capture.js';
|
|
3
|
+
export { getSourceLocation } from './sourceMap.js';
|
|
4
|
+
export type { SourceLocation } from './sourceMap.js';
|
|
5
|
+
export { exportRecording } from './export.js';
|
|
6
|
+
export type { RecorderStep, RecorderGap, RecorderExport } from './export.js';
|
|
7
|
+
export { RecorderOverlay } from './overlay/RecorderOverlay.js';
|
|
8
|
+
export type { RecorderOverlayProps } from './overlay/RecorderOverlay.js';
|
|
9
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,oBAAoB,EAAE,MAAM,cAAc,CAAC;AACpD,YAAY,EAAE,cAAc,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC;AACnE,OAAO,EAAE,iBAAiB,EAAE,MAAM,gBAAgB,CAAC;AACnD,YAAY,EAAE,cAAc,EAAE,MAAM,gBAAgB,CAAC;AACrD,OAAO,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AAC9C,YAAY,EAAE,YAAY,EAAE,WAAW,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAC7E,OAAO,EAAE,eAAe,EAAE,MAAM,8BAA8B,CAAC;AAC/D,YAAY,EAAE,oBAAoB,EAAE,MAAM,8BAA8B,CAAC"}
|
package/dist/index.js
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,oBAAoB,EAAE,MAAM,cAAc,CAAC;AAEpD,OAAO,EAAE,iBAAiB,EAAE,MAAM,gBAAgB,CAAC;AAEnD,OAAO,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AAE9C,OAAO,EAAE,eAAe,EAAE,MAAM,8BAA8B,CAAC"}
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
import React from 'react';
|
|
2
|
+
import { exportRecording } from '../export.js';
|
|
3
|
+
import type { Tour } from '@guided-tour-s4marth/core';
|
|
4
|
+
export interface RecorderOverlayProps {
|
|
5
|
+
tourType?: Tour['type'];
|
|
6
|
+
/**
|
|
7
|
+
* Called when the author clicks Submit. Receives the recorded tour draft. Each
|
|
8
|
+
* step targets its element by an encoded locator+signature, so the tour works
|
|
9
|
+
* at runtime with no code change / deploy. The host decides what to do with it
|
|
10
|
+
* (e.g. publish to the backend, or create a ticket).
|
|
11
|
+
*/
|
|
12
|
+
onSubmit?: (result: ReturnType<typeof exportRecording>) => void;
|
|
13
|
+
/** Called when saving repairs to an existing tour (repair mode). The host
|
|
14
|
+
* should persist the edited steps to the existing tour (update by id) so the
|
|
15
|
+
* fix takes effect with no deploy. Falls back to onSubmit if not provided. */
|
|
16
|
+
onSaveRepair?: (result: ReturnType<typeof exportRecording>) => void;
|
|
17
|
+
/** Router navigate, used by Preview to replay `prepare` navigation steps.
|
|
18
|
+
* Without it, cross-screen preview can't change routes (same-screen still works). */
|
|
19
|
+
navigate?: (route: string) => void | Promise<void>;
|
|
20
|
+
/** When set, the overlay opens in repair mode preloaded with this tour's steps.
|
|
21
|
+
* Each step shows a live health badge; broken/mismatch steps can be re-captured
|
|
22
|
+
* in place. Saving calls onSubmit with the edited draft (host updates by id). */
|
|
23
|
+
repairTour?: Tour | null;
|
|
24
|
+
/** Fired once the overlay has consumed `repairTour` and loaded its steps. The
|
|
25
|
+
* host should clear its repairTour state so the same tour can be repaired again. */
|
|
26
|
+
onRepairConsumed?: () => void;
|
|
27
|
+
}
|
|
28
|
+
export declare function RecorderOverlay({ tourType: initialTourType, onSubmit, onSaveRepair, navigate, repairTour, onRepairConsumed }: RecorderOverlayProps): React.JSX.Element;
|
|
29
|
+
//# sourceMappingURL=RecorderOverlay.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"RecorderOverlay.d.ts","sourceRoot":"","sources":["../../src/overlay/RecorderOverlay.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAmD,MAAM,OAAO,CAAC;AACxE,OAAO,EAAE,eAAe,EAAE,MAAM,cAAc,CAAC;AAC/C,OAAO,KAAK,EAAE,IAAI,EAA2B,MAAM,2BAA2B,CAAC;AAmB/E,MAAM,WAAW,oBAAoB;IACnC,QAAQ,CAAC,EAAE,IAAI,CAAC,MAAM,CAAC,CAAC;IACxB;;;;;OAKG;IACH,QAAQ,CAAC,EAAE,CAAC,MAAM,EAAE,UAAU,CAAC,OAAO,eAAe,CAAC,KAAK,IAAI,CAAC;IAChE;;mFAE+E;IAC/E,YAAY,CAAC,EAAE,CAAC,MAAM,EAAE,UAAU,CAAC,OAAO,eAAe,CAAC,KAAK,IAAI,CAAC;IACpE;0FACsF;IACtF,QAAQ,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IACnD;;sFAEkF;IAClF,UAAU,CAAC,EAAE,IAAI,GAAG,IAAI,CAAC;IACzB;yFACqF;IACrF,gBAAgB,CAAC,EAAE,MAAM,IAAI,CAAC;CAC/B;AA6LD,wBAAgB,eAAe,CAAC,EAAE,QAAQ,EAAE,eAA2B,EAAE,QAAQ,EAAE,YAAY,EAAE,QAAQ,EAAE,UAAU,EAAE,gBAAgB,EAAE,EAAE,oBAAoB,qBAmmB9J"}
|
|
@@ -0,0 +1,480 @@
|
|
|
1
|
+
import { jsx as _jsx, Fragment as _Fragment, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
+
import { useCallback, useEffect, useRef, useState } from 'react';
|
|
3
|
+
import { exportRecording } from '../export.js';
|
|
4
|
+
import { playTour, parseTour, buildLocator, encodeLocator, decodeLocator, resolveLocator, PREVIEW_TOUR_ID } from '@guided-tour-s4marth/core';
|
|
5
|
+
function stepHealth(step) {
|
|
6
|
+
if (!step.anchorId)
|
|
7
|
+
return 'floating'; // centered modal — nothing to resolve
|
|
8
|
+
const loc = decodeLocator(step.anchorId);
|
|
9
|
+
if (loc)
|
|
10
|
+
return resolveLocator(loc).status;
|
|
11
|
+
if (document.querySelector(`[data-tour="${CSS.escape(step.anchorId)}"]`))
|
|
12
|
+
return 'legacy-ok';
|
|
13
|
+
return 'legacy-broken';
|
|
14
|
+
}
|
|
15
|
+
function healthBadge(h) {
|
|
16
|
+
switch (h) {
|
|
17
|
+
case 'ok': return { color: '#10b981', label: '✓ ok' };
|
|
18
|
+
case 'healed': return { color: '#22d3ee', label: '↻ healed' };
|
|
19
|
+
case 'mismatch': return { color: '#f59e0b', label: '⚠ wrong element' };
|
|
20
|
+
case 'legacy-ok': return { color: '#10b981', label: '✓ data-tour' };
|
|
21
|
+
case 'floating': return { color: '#94a3b8', label: '◇ modal' };
|
|
22
|
+
case 'broken':
|
|
23
|
+
case 'legacy-broken':
|
|
24
|
+
default: return { color: '#ef4444', label: '✕ broken' };
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
function tourToDraftSteps(tour) {
|
|
28
|
+
return tour.steps.map(s => {
|
|
29
|
+
const step = {
|
|
30
|
+
title: s.title,
|
|
31
|
+
body: s.body,
|
|
32
|
+
placement: s.placement ?? 'auto',
|
|
33
|
+
interactionPath: s.prepare ?? [],
|
|
34
|
+
};
|
|
35
|
+
if (s.anchorId)
|
|
36
|
+
step.anchorId = s.anchorId;
|
|
37
|
+
return step;
|
|
38
|
+
});
|
|
39
|
+
}
|
|
40
|
+
// ─── Helpers ──────────────────────────────────────────────────────────────────
|
|
41
|
+
const INTERACTIVE_SELECTOR = 'button,a,input,select,textarea,[role="button"],[role="tab"],[role="menuitem"],[role="option"]';
|
|
42
|
+
function findBestTarget(el) {
|
|
43
|
+
const interactive = el.closest(INTERACTIVE_SELECTOR);
|
|
44
|
+
return interactive ?? el;
|
|
45
|
+
}
|
|
46
|
+
// The recorder's own UI is marked with data-tour-recorder so neither capture nor
|
|
47
|
+
// the prepare-click tracker ever targets/records the panel, FAB, or banner.
|
|
48
|
+
// (panelRef alone misses the FAB and banner, which live outside the panel div.)
|
|
49
|
+
function isRecorderUI(el) {
|
|
50
|
+
return !!(el && el.closest?.('[data-tour-recorder]'));
|
|
51
|
+
}
|
|
52
|
+
// ── Readable label for a captured element / encoded locator ────────────────────
|
|
53
|
+
// (buildLocator + getXPath now live in @guided-tour-s4marth/core — single source shared with
|
|
54
|
+
// the offline health auditor, so there's no copy to keep in sync.)
|
|
55
|
+
function elementLabel(el) {
|
|
56
|
+
const tag = el.tagName.toLowerCase();
|
|
57
|
+
const name = el.getAttribute('aria-label')?.trim() ||
|
|
58
|
+
(el.textContent ?? '').trim().replace(/\s+/g, ' ').slice(0, 32);
|
|
59
|
+
return name ? `${tag} · ${name}` : tag;
|
|
60
|
+
}
|
|
61
|
+
function locatorLabel(anchorId) {
|
|
62
|
+
if (!anchorId)
|
|
63
|
+
return '◇ centered modal (no target)';
|
|
64
|
+
const loc = decodeLocator(anchorId);
|
|
65
|
+
if (!loc)
|
|
66
|
+
return anchorId;
|
|
67
|
+
const sig = loc.signature;
|
|
68
|
+
const primary = sig.name || sig.text || loc.testid || loc.domId;
|
|
69
|
+
return primary ? `${sig.tag} · ${primary}` : sig.tag;
|
|
70
|
+
}
|
|
71
|
+
function currentRoute() {
|
|
72
|
+
return window.location.pathname + window.location.search;
|
|
73
|
+
}
|
|
74
|
+
// ─── Navigation tracker ───────────────────────────────────────────────────────
|
|
75
|
+
// Patches history.pushState/replaceState and listens to popstate to detect
|
|
76
|
+
// all SPA route changes (React Router, Next.js, etc.) while recording.
|
|
77
|
+
function useNavigationTracking(enabled, onNavigate) {
|
|
78
|
+
useEffect(() => {
|
|
79
|
+
if (!enabled)
|
|
80
|
+
return;
|
|
81
|
+
const origPush = history.pushState.bind(history);
|
|
82
|
+
const origReplace = history.replaceState.bind(history);
|
|
83
|
+
history.pushState = (...args) => {
|
|
84
|
+
origPush(...args);
|
|
85
|
+
onNavigate(currentRoute());
|
|
86
|
+
};
|
|
87
|
+
history.replaceState = (...args) => {
|
|
88
|
+
origReplace(...args);
|
|
89
|
+
onNavigate(currentRoute());
|
|
90
|
+
};
|
|
91
|
+
const onPop = () => onNavigate(currentRoute());
|
|
92
|
+
window.addEventListener('popstate', onPop);
|
|
93
|
+
return () => {
|
|
94
|
+
history.pushState = origPush;
|
|
95
|
+
history.replaceState = origReplace;
|
|
96
|
+
window.removeEventListener('popstate', onPop);
|
|
97
|
+
};
|
|
98
|
+
}, [enabled, onNavigate]);
|
|
99
|
+
}
|
|
100
|
+
// ─── Spotlight ────────────────────────────────────────────────────────────────
|
|
101
|
+
function Spotlight({ rect }) {
|
|
102
|
+
const PAD = 4;
|
|
103
|
+
const W = window.innerWidth;
|
|
104
|
+
const H = window.innerHeight;
|
|
105
|
+
const l = rect.left - PAD, t = rect.top - PAD;
|
|
106
|
+
const r = rect.right + PAD, b = rect.bottom + PAD;
|
|
107
|
+
const dim = { position: 'fixed', background: 'rgba(0,0,0,0.42)', zIndex: 99997, pointerEvents: 'none' };
|
|
108
|
+
return (_jsxs(_Fragment, { children: [_jsx("div", { style: { ...dim, top: 0, left: 0, right: 0, height: Math.max(0, t) } }), _jsx("div", { style: { ...dim, top: Math.min(H, b), left: 0, right: 0, bottom: 0 } }), _jsx("div", { style: { ...dim, top: t, left: 0, width: Math.max(0, l), height: b - t } }), _jsx("div", { style: { ...dim, top: t, left: Math.min(W, r), right: 0, height: b - t } })] }));
|
|
109
|
+
}
|
|
110
|
+
// ─── Highlight ring ───────────────────────────────────────────────────────────
|
|
111
|
+
function HighlightRing({ rect, anchorId, isGap }) {
|
|
112
|
+
const color = !anchorId ? '#94a3b8' : isGap ? '#f59e0b' : '#6366f1';
|
|
113
|
+
const PAD = 4;
|
|
114
|
+
return (_jsxs(_Fragment, { children: [_jsx(Spotlight, { rect: rect }), _jsx("div", { style: {
|
|
115
|
+
position: 'fixed',
|
|
116
|
+
top: rect.top - PAD, left: rect.left - PAD,
|
|
117
|
+
width: rect.width + PAD * 2, height: rect.height + PAD * 2,
|
|
118
|
+
border: `2px solid ${color}`, borderRadius: 6,
|
|
119
|
+
boxShadow: `0 0 10px ${color}88`,
|
|
120
|
+
pointerEvents: 'none', zIndex: 99998,
|
|
121
|
+
transition: 'top 60ms ease,left 60ms ease,width 60ms ease,height 60ms ease',
|
|
122
|
+
} }), anchorId && (_jsxs("div", { style: {
|
|
123
|
+
position: 'fixed',
|
|
124
|
+
top: Math.max(4, rect.top - PAD - 24), left: rect.left - PAD,
|
|
125
|
+
background: color, color: '#fff',
|
|
126
|
+
fontSize: 11, fontWeight: 600, fontFamily: 'monospace',
|
|
127
|
+
padding: '2px 8px', borderRadius: 4,
|
|
128
|
+
whiteSpace: 'nowrap', pointerEvents: 'none', zIndex: 99999,
|
|
129
|
+
}, children: [anchorId, isGap ? ' ⚠ new anchor' : ''] }))] }));
|
|
130
|
+
}
|
|
131
|
+
// ─── Pending path pill ────────────────────────────────────────────────────────
|
|
132
|
+
function PathPills({ path }) {
|
|
133
|
+
if (!path.length)
|
|
134
|
+
return null;
|
|
135
|
+
return (_jsx("div", { style: { display: 'flex', gap: 4, flexWrap: 'wrap', marginTop: 6 }, children: path.map((a, i) => (_jsx("span", { style: {
|
|
136
|
+
fontSize: 10, padding: '2px 6px', borderRadius: 10,
|
|
137
|
+
background: a.action === 'navigate' ? '#1e3a5f' : '#1e293b',
|
|
138
|
+
color: a.action === 'navigate' ? '#7dd3fc' : '#94a3b8',
|
|
139
|
+
fontFamily: 'monospace', whiteSpace: 'nowrap',
|
|
140
|
+
}, children: a.action === 'navigate' ? `→ ${a.route}` : a.action === 'click' ? `click: ${locatorLabel(a.anchorId)}` : `wait` }, i))) }));
|
|
141
|
+
}
|
|
142
|
+
// ─── Main component ───────────────────────────────────────────────────────────
|
|
143
|
+
export function RecorderOverlay({ tourType: initialTourType = 'release', onSubmit, onSaveRepair, navigate, repairTour, onRepairConsumed }) {
|
|
144
|
+
const [isOpen, setIsOpen] = useState(false);
|
|
145
|
+
const [isCapturing, setIsCapturing] = useState(false);
|
|
146
|
+
// Repair mode: editing an existing tour. `recaptureIdx` is the step being
|
|
147
|
+
// re-targeted (the next capture click replaces that step's locator in place).
|
|
148
|
+
const [repairing, setRepairing] = useState(false);
|
|
149
|
+
const [recaptureIdx, setRecaptureIdx] = useState(null);
|
|
150
|
+
const loadedRepairId = useRef(null);
|
|
151
|
+
// The original tour id, preserved across an editable title so repair saves
|
|
152
|
+
// PATCH the right record even when title !== id.
|
|
153
|
+
const repairOriginalId = useRef(null);
|
|
154
|
+
// Tour type is selectable in the panel; seeded from the prop default.
|
|
155
|
+
const [tourType, setTourType] = useState(initialTourType);
|
|
156
|
+
// Accumulated interaction path since last step (navigations + anchor clicks)
|
|
157
|
+
const [pendingPath, setPendingPath] = useState([]);
|
|
158
|
+
// Hover state during capture mode
|
|
159
|
+
const [hoveredRect, setHoveredRect] = useState(null);
|
|
160
|
+
const [hoveredAnchorId, setHoveredAnchorId] = useState(null);
|
|
161
|
+
// Pending element — clicked, waiting for step form
|
|
162
|
+
const [pendingEl, setPendingEl] = useState(null);
|
|
163
|
+
const [pendingRect, setPendingRect] = useState(null);
|
|
164
|
+
// Floating (no-target) step being authored — shows the step form with no element,
|
|
165
|
+
// producing a centered-modal step (e.g. an intro/outro banner).
|
|
166
|
+
const [floatingForm, setFloatingForm] = useState(false);
|
|
167
|
+
// Step form
|
|
168
|
+
const [stepTitle, setStepTitle] = useState('');
|
|
169
|
+
const [stepBody, setStepBody] = useState('');
|
|
170
|
+
const [stepPlacement, setStepPlacement] = useState('auto');
|
|
171
|
+
// Tour
|
|
172
|
+
const [steps, setSteps] = useState([]);
|
|
173
|
+
const [tourId, setTourId] = useState('');
|
|
174
|
+
const [submitted, setSubmitted] = useState(false);
|
|
175
|
+
// Two phases: recording (capture steps) → review (preview tiles, then submit).
|
|
176
|
+
const [reviewing, setReviewing] = useState(false);
|
|
177
|
+
// Step hover highlight
|
|
178
|
+
const [stepHighlight, setStepHighlight] = useState(null);
|
|
179
|
+
const stepHighlightTimer = useRef(null);
|
|
180
|
+
const panelRef = useRef(null);
|
|
181
|
+
const titleInputRef = useRef(null);
|
|
182
|
+
const lastRouteRef = useRef(currentRoute());
|
|
183
|
+
// ── Navigation tracking ────────────────────────────────────────────────────
|
|
184
|
+
// Track route changes whenever the panel is open so navigations between
|
|
185
|
+
// steps get recorded as prepare actions on the next step.
|
|
186
|
+
const handleNavigate = useCallback((route) => {
|
|
187
|
+
if (route === lastRouteRef.current)
|
|
188
|
+
return;
|
|
189
|
+
lastRouteRef.current = route;
|
|
190
|
+
setPendingPath(prev => [...prev, { action: 'navigate', route }]);
|
|
191
|
+
}, []);
|
|
192
|
+
useNavigationTracking(isOpen, handleNavigate);
|
|
193
|
+
// ── Repair mode load ────────────────────────────────────────────────────────
|
|
194
|
+
// When the host hands us a tour to repair, preload its steps and jump straight
|
|
195
|
+
// to the review/repair view. Guard on id so we don't clobber edits on re-render.
|
|
196
|
+
useEffect(() => {
|
|
197
|
+
if (!repairTour) {
|
|
198
|
+
loadedRepairId.current = null;
|
|
199
|
+
return;
|
|
200
|
+
}
|
|
201
|
+
if (loadedRepairId.current === repairTour.id)
|
|
202
|
+
return;
|
|
203
|
+
loadedRepairId.current = repairTour.id;
|
|
204
|
+
repairOriginalId.current = repairTour.id;
|
|
205
|
+
setSteps(tourToDraftSteps(repairTour));
|
|
206
|
+
setTourId(repairTour.title || repairTour.id);
|
|
207
|
+
setTourType(repairTour.type);
|
|
208
|
+
// Clear any in-progress capture so it doesn't bleed into the repair session.
|
|
209
|
+
setPendingEl(null);
|
|
210
|
+
setPendingRect(null);
|
|
211
|
+
setPendingPath([]);
|
|
212
|
+
setFloatingForm(false);
|
|
213
|
+
setRecaptureIdx(null);
|
|
214
|
+
setIsCapturing(false);
|
|
215
|
+
setRepairing(true);
|
|
216
|
+
setReviewing(true);
|
|
217
|
+
setIsOpen(true);
|
|
218
|
+
setSubmitted(false);
|
|
219
|
+
onRepairConsumed?.();
|
|
220
|
+
}, [repairTour, onRepairConsumed]);
|
|
221
|
+
// ── Capture mode event listeners ──────────────────────────────────────────
|
|
222
|
+
useEffect(() => {
|
|
223
|
+
if (!isCapturing)
|
|
224
|
+
return;
|
|
225
|
+
const onMouseMove = (e) => {
|
|
226
|
+
const raw = document.elementFromPoint(e.clientX, e.clientY);
|
|
227
|
+
if (!raw || isRecorderUI(raw)) {
|
|
228
|
+
setHoveredRect(null);
|
|
229
|
+
setHoveredAnchorId(null);
|
|
230
|
+
return;
|
|
231
|
+
}
|
|
232
|
+
const best = findBestTarget(raw);
|
|
233
|
+
setHoveredRect(best.getBoundingClientRect());
|
|
234
|
+
setHoveredAnchorId(elementLabel(best));
|
|
235
|
+
};
|
|
236
|
+
const onClick = (e) => {
|
|
237
|
+
const raw = document.elementFromPoint(e.clientX, e.clientY);
|
|
238
|
+
if (!raw || isRecorderUI(raw))
|
|
239
|
+
return;
|
|
240
|
+
e.preventDefault();
|
|
241
|
+
e.stopPropagation();
|
|
242
|
+
const best = findBestTarget(raw);
|
|
243
|
+
// Repair mode: re-target an existing step in place (no step form).
|
|
244
|
+
if (recaptureIdx !== null) {
|
|
245
|
+
const anchorId = encodeLocator(buildLocator(best));
|
|
246
|
+
setSteps(prev => prev.map((s, i) => (i === recaptureIdx ? { ...s, anchorId, element: best } : s)));
|
|
247
|
+
setRecaptureIdx(null);
|
|
248
|
+
setIsCapturing(false);
|
|
249
|
+
setHoveredRect(null);
|
|
250
|
+
setHoveredAnchorId(null);
|
|
251
|
+
return;
|
|
252
|
+
}
|
|
253
|
+
setIsCapturing(false);
|
|
254
|
+
setHoveredRect(null);
|
|
255
|
+
setHoveredAnchorId(null);
|
|
256
|
+
setPendingEl(best);
|
|
257
|
+
setPendingRect(best.getBoundingClientRect());
|
|
258
|
+
setStepTitle('');
|
|
259
|
+
setStepBody('');
|
|
260
|
+
setStepPlacement('auto');
|
|
261
|
+
setTimeout(() => titleInputRef.current?.focus(), 50);
|
|
262
|
+
};
|
|
263
|
+
const onKeyDown = (e) => {
|
|
264
|
+
if (e.key === 'Escape') {
|
|
265
|
+
setIsCapturing(false);
|
|
266
|
+
setRecaptureIdx(null);
|
|
267
|
+
setHoveredRect(null);
|
|
268
|
+
setHoveredAnchorId(null);
|
|
269
|
+
}
|
|
270
|
+
};
|
|
271
|
+
document.addEventListener('mousemove', onMouseMove, { passive: true });
|
|
272
|
+
document.addEventListener('click', onClick, { capture: true });
|
|
273
|
+
document.addEventListener('keydown', onKeyDown);
|
|
274
|
+
return () => {
|
|
275
|
+
document.removeEventListener('mousemove', onMouseMove);
|
|
276
|
+
document.removeEventListener('click', onClick, { capture: true });
|
|
277
|
+
document.removeEventListener('keydown', onKeyDown);
|
|
278
|
+
};
|
|
279
|
+
}, [isCapturing, recaptureIdx]);
|
|
280
|
+
// ── Non-capture anchor clicks → add to pending path ────────────────────────
|
|
281
|
+
// When the panel is open but NOT in capture mode, clicks on anchored elements
|
|
282
|
+
// are recorded as prepare actions (e.g. opening a modal before the target step).
|
|
283
|
+
useEffect(() => {
|
|
284
|
+
if (!isOpen || isCapturing || pendingEl)
|
|
285
|
+
return;
|
|
286
|
+
const onClick = (e) => {
|
|
287
|
+
const target = e.target;
|
|
288
|
+
if (!target || isRecorderUI(target))
|
|
289
|
+
return;
|
|
290
|
+
const best = findBestTarget(target);
|
|
291
|
+
// Only interactive clicks are meaningful prepare actions (e.g. opening a
|
|
292
|
+
// menu/modal before the next step) — ignore stray clicks on plain text.
|
|
293
|
+
if (!best.matches(INTERACTIVE_SELECTOR))
|
|
294
|
+
return;
|
|
295
|
+
setPendingPath(prev => [...prev, { action: 'click', anchorId: encodeLocator(buildLocator(best)) }]);
|
|
296
|
+
};
|
|
297
|
+
document.addEventListener('click', onClick, { passive: true });
|
|
298
|
+
return () => document.removeEventListener('click', onClick);
|
|
299
|
+
}, [isOpen, isCapturing, pendingEl]);
|
|
300
|
+
// ── Confirm step ──────────────────────────────────────────────────────────
|
|
301
|
+
const confirmStep = useCallback(() => {
|
|
302
|
+
// A targeted step needs a captured element; a floating step needs neither.
|
|
303
|
+
if ((!pendingEl && !floatingForm) || !stepTitle.trim())
|
|
304
|
+
return;
|
|
305
|
+
const step = {
|
|
306
|
+
title: stepTitle.trim(),
|
|
307
|
+
body: stepBody.trim(),
|
|
308
|
+
placement: stepPlacement,
|
|
309
|
+
interactionPath: [...pendingPath],
|
|
310
|
+
};
|
|
311
|
+
if (pendingEl) {
|
|
312
|
+
step.anchorId = encodeLocator(buildLocator(pendingEl));
|
|
313
|
+
step.element = pendingEl;
|
|
314
|
+
}
|
|
315
|
+
setSteps(prev => [...prev, step]);
|
|
316
|
+
setPendingPath([]); // reset path — starts fresh for the next step
|
|
317
|
+
setPendingEl(null);
|
|
318
|
+
setPendingRect(null);
|
|
319
|
+
setFloatingForm(false);
|
|
320
|
+
setStepTitle('');
|
|
321
|
+
setStepBody('');
|
|
322
|
+
setStepPlacement('auto');
|
|
323
|
+
setSubmitted(false);
|
|
324
|
+
}, [pendingEl, floatingForm, stepTitle, stepBody, stepPlacement, pendingPath]);
|
|
325
|
+
const onTitleKeyDown = (e) => { if (e.key === 'Enter')
|
|
326
|
+
confirmStep(); };
|
|
327
|
+
// ── Step list interactions ────────────────────────────────────────────────
|
|
328
|
+
const highlightStep = (step) => {
|
|
329
|
+
if (!step.anchorId)
|
|
330
|
+
return; // floating step — no element to highlight
|
|
331
|
+
// Resolve order: live element while still mounted (exact) → encoded locator
|
|
332
|
+
// (signals + signature self-heal, resilient after a re-render).
|
|
333
|
+
let el = null;
|
|
334
|
+
if (step.element && step.element.isConnected)
|
|
335
|
+
el = step.element;
|
|
336
|
+
if (!el) {
|
|
337
|
+
const loc = decodeLocator(step.anchorId);
|
|
338
|
+
if (loc)
|
|
339
|
+
el = resolveLocator(loc).el;
|
|
340
|
+
}
|
|
341
|
+
if (!el)
|
|
342
|
+
return;
|
|
343
|
+
el.scrollIntoView({ behavior: 'smooth', block: 'center' });
|
|
344
|
+
// Draw immediately, then re-measure once the smooth scroll settles so the
|
|
345
|
+
// ring lands on the final position (not the pre-scroll rect).
|
|
346
|
+
const target = el;
|
|
347
|
+
const label = locatorLabel(step.anchorId);
|
|
348
|
+
const draw = () => setStepHighlight({ rect: target.getBoundingClientRect(), anchorId: label });
|
|
349
|
+
draw();
|
|
350
|
+
window.setTimeout(draw, 360);
|
|
351
|
+
if (stepHighlightTimer.current)
|
|
352
|
+
clearTimeout(stepHighlightTimer.current);
|
|
353
|
+
stepHighlightTimer.current = setTimeout(() => setStepHighlight(null), 2500);
|
|
354
|
+
};
|
|
355
|
+
const removeStep = (idx) => {
|
|
356
|
+
setSteps(prev => prev.filter((_, i) => i !== idx));
|
|
357
|
+
setSubmitted(false);
|
|
358
|
+
};
|
|
359
|
+
// Drop a step's target so it renders as a centered modal (no anchorId in payload).
|
|
360
|
+
const makeStepFloating = (idx) => {
|
|
361
|
+
setSteps(prev => prev.map((s, i) => {
|
|
362
|
+
if (i !== idx)
|
|
363
|
+
return s;
|
|
364
|
+
const { anchorId: _a, element: _e, ...rest } = s;
|
|
365
|
+
return rest;
|
|
366
|
+
}));
|
|
367
|
+
setSubmitted(false);
|
|
368
|
+
};
|
|
369
|
+
// ── Submit ──────────────────────────────────────────────────────────────────
|
|
370
|
+
// Hands the recorded tour draft to the host. Each step targets its element by
|
|
371
|
+
// an encoded locator+signature, so the tour works at runtime with no deploy.
|
|
372
|
+
const handleSubmit = () => {
|
|
373
|
+
const result = exportRecording(tourId, tourType, undefined, steps, []);
|
|
374
|
+
if (repairing && onSaveRepair) {
|
|
375
|
+
// Preserve the original id so we PATCH the existing record, not create a
|
|
376
|
+
// new one keyed by the (editable) title.
|
|
377
|
+
if (repairOriginalId.current)
|
|
378
|
+
result.draft.id = repairOriginalId.current;
|
|
379
|
+
onSaveRepair(result);
|
|
380
|
+
}
|
|
381
|
+
else {
|
|
382
|
+
onSubmit?.(result);
|
|
383
|
+
}
|
|
384
|
+
setSubmitted(true);
|
|
385
|
+
};
|
|
386
|
+
// ── Preview ───────────────────────────────────────────────────────────────
|
|
387
|
+
// Plays the recorded tour with the real @guided-tour-s4marth/core player. Steps resolve via
|
|
388
|
+
// their encoded locator (carried in anchorId). The panel is hidden while the
|
|
389
|
+
// tour plays, then restored.
|
|
390
|
+
const handlePreview = useCallback(async () => {
|
|
391
|
+
if (!steps.length)
|
|
392
|
+
return;
|
|
393
|
+
const result = exportRecording(tourId, tourType, undefined, steps, []);
|
|
394
|
+
let tour;
|
|
395
|
+
try {
|
|
396
|
+
// Preview is a dry run of an unsaved draft — use the preview id so the
|
|
397
|
+
// host ignores its telemetry (no health reporting / no 404 for an unsaved tour).
|
|
398
|
+
tour = { ...parseTour(result.draft), id: PREVIEW_TOUR_ID };
|
|
399
|
+
}
|
|
400
|
+
catch {
|
|
401
|
+
return;
|
|
402
|
+
}
|
|
403
|
+
setIsOpen(false); // hide the panel so the tour is visible
|
|
404
|
+
const restore = () => setIsOpen(true);
|
|
405
|
+
const opts = { tour, onComplete: restore, onSkip: restore, onUnavailable: restore };
|
|
406
|
+
if (navigate)
|
|
407
|
+
opts.navigate = navigate;
|
|
408
|
+
await playTour(opts);
|
|
409
|
+
}, [steps, tourId, tourType, navigate]);
|
|
410
|
+
// ── Reset to a fresh NEW-tour state ─────────────────────────────────────────
|
|
411
|
+
// Used by "Clear" and "Start new tour" — wipes steps AND exits repair mode, so
|
|
412
|
+
// the next Submit creates a new tour instead of PATCHing the one being repaired.
|
|
413
|
+
const resetAll = useCallback(() => {
|
|
414
|
+
setSteps([]);
|
|
415
|
+
setPendingPath([]);
|
|
416
|
+
setPendingEl(null);
|
|
417
|
+
setPendingRect(null);
|
|
418
|
+
setFloatingForm(false);
|
|
419
|
+
setReviewing(false);
|
|
420
|
+
setRepairing(false);
|
|
421
|
+
setRecaptureIdx(null);
|
|
422
|
+
setSubmitted(false);
|
|
423
|
+
setTourId('');
|
|
424
|
+
repairOriginalId.current = null;
|
|
425
|
+
loadedRepairId.current = null;
|
|
426
|
+
}, []);
|
|
427
|
+
return (_jsxs(_Fragment, { children: [isCapturing && hoveredRect && (_jsx(HighlightRing, { rect: hoveredRect, anchorId: hoveredAnchorId, isGap: false })), pendingRect && pendingEl && (_jsx(HighlightRing, { rect: pendingRect, anchorId: elementLabel(pendingEl), isGap: false })), stepHighlight && (_jsx(HighlightRing, { rect: stepHighlight.rect, anchorId: stepHighlight.anchorId, isGap: false })), isCapturing && (_jsxs("div", { "data-tour-recorder": "1", style: {
|
|
428
|
+
position: 'fixed', top: 0, left: 0, right: 0, height: 44,
|
|
429
|
+
background: '#6366f1', color: '#fff', zIndex: 100001,
|
|
430
|
+
display: 'flex', alignItems: 'center', justifyContent: 'center',
|
|
431
|
+
gap: 16, fontSize: 13, fontWeight: 600,
|
|
432
|
+
fontFamily: 'system-ui, -apple-system, sans-serif',
|
|
433
|
+
}, children: [_jsx("span", { children: recaptureIdx !== null
|
|
434
|
+
? `● Re-targeting step ${recaptureIdx + 1} — click the new element`
|
|
435
|
+
: '● Hover to target — click to capture | navigate freely, it will be recorded' }), _jsx("button", { onClick: () => { setIsCapturing(false); setRecaptureIdx(null); setHoveredRect(null); setHoveredAnchorId(null); }, style: btn('#ffffff33'), children: "ESC Cancel" })] })), _jsx("button", { "data-tour-recorder": "1", onClick: () => setIsOpen(o => !o), title: "Tour Recorder", style: {
|
|
436
|
+
position: 'fixed', bottom: 24, right: 24,
|
|
437
|
+
width: 48, height: 48, borderRadius: '50%',
|
|
438
|
+
background: isOpen ? '#334155' : '#6366f1',
|
|
439
|
+
border: 'none', color: '#fff', fontSize: 20,
|
|
440
|
+
cursor: 'pointer', zIndex: 100000,
|
|
441
|
+
boxShadow: '0 4px 16px rgba(99,102,241,0.45)',
|
|
442
|
+
display: 'flex', alignItems: 'center', justifyContent: 'center',
|
|
443
|
+
transition: 'background 0.15s',
|
|
444
|
+
}, children: isOpen ? '✕' : '⏺' }), isOpen && (_jsxs("div", { ref: panelRef, "data-tour-recorder": "1", style: {
|
|
445
|
+
position: 'fixed', bottom: 84, right: 24,
|
|
446
|
+
width: 370, maxHeight: '80vh',
|
|
447
|
+
background: '#0f172a', border: '1px solid #1e293b',
|
|
448
|
+
borderRadius: 12, boxShadow: '0 8px 32px rgba(0,0,0,0.6)',
|
|
449
|
+
color: '#f1f5f9', fontFamily: 'system-ui, -apple-system, sans-serif',
|
|
450
|
+
fontSize: 13, zIndex: 99999,
|
|
451
|
+
display: 'flex', flexDirection: 'column', overflow: 'scroll',
|
|
452
|
+
}, children: [_jsxs("div", { style: { padding: '12px 14px', borderBottom: '1px solid #1e293b', flexShrink: 0 }, children: [_jsxs("div", { style: { display: 'flex', alignItems: 'center', justifyContent: 'space-between', marginBottom: 10 }, children: [_jsx("div", { style: { fontSize: 11, fontWeight: 700, color: '#64748b', textTransform: 'uppercase', letterSpacing: '0.08em' }, children: repairing ? 'Repairing tour' : 'Tour Recorder' }), repairing && (_jsx("button", { onClick: resetAll, title: "Discard this edit and start a brand-new tour", style: { ...btn('#1e293b'), fontSize: 11, padding: '3px 8px', color: '#a5b4fc' }, children: "+ New tour" }))] }), repairing && (_jsx("div", { style: { fontSize: 11, color: '#fbbf24', marginBottom: 8 }, children: "\u270E Editing an existing tour \u2014 Save updates it in place. Use \u201C+ New tour\u201D to create a fresh one." })), _jsxs("div", { style: { display: 'flex', gap: 8 }, children: [_jsxs("div", { style: { flex: 1 }, children: [_jsx("label", { style: { display: 'block', fontSize: 11, color: '#64748b', marginBottom: 3 }, children: "Title" }), _jsx("input", { value: tourId, onChange: e => setTourId(e.target.value), placeholder: "e.g. v4.14 or v4.14-knowledge-center", style: INPUT })] }), _jsxs("div", { style: { width: 120, flexShrink: 0 }, children: [_jsx("label", { style: { display: 'block', fontSize: 11, color: '#64748b', marginBottom: 3 }, children: "Type" }), _jsxs("select", { value: tourType, onChange: e => setTourType(e.target.value), style: { ...INPUT, height: 31, padding: '0 8px' }, children: [_jsx("option", { value: "release", children: "release" }), _jsx("option", { value: "onboarding", children: "onboarding" })] })] })] }), _jsxs("div", { style: { fontSize: 10, color: '#475569', marginTop: 4 }, children: ["Full release tour: name it the version (", _jsx("code", { children: "v4.14" }), "). Feature tour: prefix it (", _jsx("code", { children: "v4.14-feature" }), ")."] })] }), !pendingEl && !floatingForm && pendingPath.length > 0 && (_jsxs("div", { style: { padding: '8px 14px', borderBottom: '1px solid #1e293b', background: '#060f1e', flexShrink: 0 }, children: [_jsx("div", { style: { fontSize: 11, color: '#475569', marginBottom: 2 }, children: "Recorded since last step:" }), _jsx(PathPills, { path: pendingPath })] })), (pendingEl || floatingForm) && (() => {
|
|
453
|
+
const loc = pendingEl ? buildLocator(pendingEl) : null;
|
|
454
|
+
const signals = loc
|
|
455
|
+
? [loc.testid && 'testid', loc.domId && 'id', loc.xpath && 'xpath'].filter(Boolean)
|
|
456
|
+
: [];
|
|
457
|
+
return (_jsxs("div", { style: { padding: '12px 14px', borderBottom: '1px solid #1e293b', background: '#060f1e', flexShrink: 0 }, children: [pendingEl ? (_jsxs(_Fragment, { children: [_jsxs("div", { style: { display: 'flex', alignItems: 'center', gap: 6, marginBottom: 6 }, children: [_jsx("span", { style: { width: 8, height: 8, borderRadius: '50%', flexShrink: 0, background: '#10b981' } }), _jsx("code", { style: {
|
|
458
|
+
fontSize: 11, flex: 1, overflow: 'hidden', textOverflow: 'ellipsis', whiteSpace: 'nowrap', color: '#6ee7b7',
|
|
459
|
+
}, children: elementLabel(pendingEl) }), _jsx("span", { style: { fontSize: 10, color: '#10b981' }, children: "\u2713 targetable" })] }), _jsxs("div", { style: { fontSize: 10, color: '#475569', marginBottom: 8 }, children: ["Targets via ", signals.join(' → '), " + signature \u2014 works at runtime with no code change."] })] })) : (_jsxs("div", { style: { display: 'flex', alignItems: 'center', gap: 6, marginBottom: 8 }, children: [_jsx("span", { style: { width: 8, height: 8, borderRadius: '50%', flexShrink: 0, background: '#94a3b8' } }), _jsx("code", { style: { fontSize: 11, flex: 1, color: '#cbd5e1' }, children: "\u25C7 Centered modal \u2014 no target" }), _jsx("span", { style: { fontSize: 10, color: '#94a3b8' }, children: "intro / banner" })] })), pendingPath.length > 0 && (_jsxs("div", { style: { marginBottom: 8 }, children: [_jsx("div", { style: { fontSize: 11, color: '#475569', marginBottom: 2 }, children: "Prepare path for this step:" }), _jsx(PathPills, { path: pendingPath })] })), _jsx("input", { ref: titleInputRef, placeholder: "Step title (required)", value: stepTitle, onChange: e => setStepTitle(e.target.value), onKeyDown: onTitleKeyDown, style: { ...INPUT, marginBottom: 6 } }), _jsx("textarea", { placeholder: "Description (optional)", value: stepBody, onChange: e => setStepBody(e.target.value), rows: 3, style: { ...INPUT, resize: 'vertical', height: 60 } }), _jsxs("div", { style: { display: 'flex', gap: 6, marginTop: 8 }, children: [_jsx("select", { value: stepPlacement, onChange: e => setStepPlacement(e.target.value), style: { ...INPUT, flex: 1, height: 30, padding: '0 8px' }, children: ['auto', 'top', 'bottom', 'left', 'right'].map(p => (_jsx("option", { value: p, children: p }, p))) }), _jsx("button", { onClick: confirmStep, disabled: !stepTitle.trim(), style: btn(stepTitle.trim() ? '#6366f1' : '#1e293b'), children: "Add Step" }), _jsx("button", { onClick: () => { setPendingEl(null); setPendingRect(null); setFloatingForm(false); }, style: btn('#374151'), children: "Cancel" })] })] }));
|
|
460
|
+
})(), reviewing && steps.length > 0 && (_jsx("div", { style: { padding: '8px 14px', borderBottom: '1px solid #1e293b', background: '#0b1220', flexShrink: 0, fontSize: 11, color: '#94a3b8' }, children: repairing
|
|
461
|
+
? 'Repairing — badges show live health on this screen. Click ⟳ to re-target a broken step, then Save. (Navigate to a step’s screen to check it.)'
|
|
462
|
+
: 'Preview — hover or click a step to highlight it on the page. Remove any you don’t want, then Submit.' })), _jsx("div", { style: { overflowY: 'auto', flex: 1 }, children: steps.length === 0 && !pendingEl ? (_jsxs("div", { style: { padding: '28px 14px', textAlign: 'center', color: '#475569', lineHeight: 1.7 }, children: ["No steps yet.", _jsx("br", {}), _jsxs("span", { style: { fontSize: 12 }, children: ["Navigate to the first element and click", _jsx("br", {}), "\"+ Capture element\"."] })] })) : (steps.map((step, idx) => (_jsxs("div", { onMouseEnter: () => highlightStep(step), onClick: () => highlightStep(step), style: { padding: '9px 14px', borderBottom: '1px solid #1e293b', display: 'flex', alignItems: 'flex-start', gap: 8, cursor: 'pointer' }, onMouseOver: e => (e.currentTarget.style.background = '#111827'), onMouseOut: e => (e.currentTarget.style.background = 'transparent'), children: [_jsx("span", { style: { color: '#334155', fontSize: 11, marginTop: 2, width: 16, flexShrink: 0 }, children: idx + 1 }), _jsxs("div", { style: { flex: 1, minWidth: 0 }, children: [_jsx("div", { style: { fontWeight: 500, whiteSpace: 'nowrap', overflow: 'hidden', textOverflow: 'ellipsis' }, children: step.title }), _jsxs("div", { style: { fontSize: 11, marginTop: 1, display: 'flex', alignItems: 'center', gap: 6 }, children: [_jsx("code", { style: { color: '#6ee7b7', overflow: 'hidden', textOverflow: 'ellipsis', whiteSpace: 'nowrap' }, children: locatorLabel(step.anchorId) }), reviewing && (() => {
|
|
463
|
+
const b = healthBadge(stepHealth(step));
|
|
464
|
+
return _jsx("span", { style: { fontSize: 10, color: b.color, flexShrink: 0 }, children: b.label });
|
|
465
|
+
})()] }), step.interactionPath.length > 0 && (_jsx(PathPills, { path: step.interactionPath }))] }), reviewing && (_jsx("button", { title: "Re-capture this step's target", onClick: e => { e.stopPropagation(); setRecaptureIdx(idx); setIsCapturing(true); }, style: { ...btn('#1e293b'), padding: '0 7px', minWidth: 24, flexShrink: 0 }, children: "\u27F3" })), step.anchorId && (_jsx("button", { title: "Remove target \u2014 show as a centered modal", onClick: e => { e.stopPropagation(); makeStepFloating(idx); }, style: { ...btn('#1e293b'), padding: '0 7px', minWidth: 24, flexShrink: 0 }, children: "\u25C7" })), _jsx("button", { onClick: e => { e.stopPropagation(); removeStep(idx); }, style: { ...btn('#1e293b'), padding: '0 7px', minWidth: 24, flexShrink: 0 }, children: "\u2715" })] }, idx)))) }), _jsxs("div", { style: { padding: '10px 14px', borderTop: '1px solid #1e293b', display: 'flex', flexWrap: 'wrap', gap: 6, flexShrink: 0 }, children: [!reviewing && (_jsxs(_Fragment, { children: [!pendingEl && !floatingForm && (_jsx("button", { onClick: () => setIsCapturing(true), style: btn('#6366f1'), children: "+ Capture element" })), !pendingEl && !floatingForm && (_jsx("button", { onClick: () => { setFloatingForm(true); setStepTitle(''); setStepBody(''); setStepPlacement('auto'); setTimeout(() => titleInputRef.current?.focus(), 50); }, title: "Add a centered modal step with no target (intro / banner)", style: btn('#334155'), children: "+ Modal step" })), steps.length > 0 && !pendingEl && !floatingForm && (_jsx("button", { onClick: () => { setReviewing(true); setSubmitted(false); }, style: btn('#0d9488'), children: "\u2713 Done" })), steps.length > 0 && (_jsx("button", { onClick: resetAll, style: btn('#374151'), children: "Clear" }))] })), reviewing && (_jsxs(_Fragment, { children: [_jsx("button", { onClick: () => void handlePreview(), style: btn('#0d9488'), children: "\u25B6 Preview" }), _jsx("button", { onClick: handleSubmit, disabled: !tourId.trim(), style: btn(tourId.trim() ? '#6366f1' : '#1e293b'), children: repairing ? '✓ Save repairs' : '✓ Submit tour' }), _jsx("button", { onClick: () => { setReviewing(false); setSubmitted(false); }, style: btn('#374151'), children: "\u2190 Add more" }), _jsx("button", { onClick: resetAll, style: btn('#374151'), children: "Clear" })] }))] }), submitted && (_jsx("div", { style: { padding: '10px 14px', background: '#052e16', borderTop: '1px solid #166534', flexShrink: 0 }, children: _jsxs("div", { style: { fontSize: 12, color: '#4ade80', fontWeight: 600 }, children: ["\u2713 Submitted \u2014 ", steps.length, " step", steps.length > 1 ? 's' : ''] }) }))] }))] }));
|
|
466
|
+
}
|
|
467
|
+
// ─── Shared styles ────────────────────────────────────────────────────────────
|
|
468
|
+
const INPUT = {
|
|
469
|
+
width: '100%', background: '#1e293b', border: '1px solid #334155',
|
|
470
|
+
borderRadius: 6, color: '#f1f5f9', padding: '6px 10px',
|
|
471
|
+
fontSize: 12, outline: 'none', boxSizing: 'border-box', fontFamily: 'inherit',
|
|
472
|
+
};
|
|
473
|
+
function btn(bg) {
|
|
474
|
+
return {
|
|
475
|
+
background: bg, border: 'none', borderRadius: 6, color: '#f1f5f9',
|
|
476
|
+
cursor: 'pointer', fontSize: 12, padding: '5px 12px', minHeight: 30,
|
|
477
|
+
fontWeight: 500, whiteSpace: 'nowrap', flexShrink: 0,
|
|
478
|
+
};
|
|
479
|
+
}
|
|
480
|
+
//# sourceMappingURL=RecorderOverlay.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"RecorderOverlay.js","sourceRoot":"","sources":["../../src/overlay/RecorderOverlay.tsx"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Maps a DOM element to its JSX source location.
|
|
3
|
+
*
|
|
4
|
+
* Two strategies:
|
|
5
|
+
* 1. @babel/plugin-transform-react-jsx-source stamps _debugSource on fiber nodes
|
|
6
|
+
* with { fileName, lineNumber, columnNumber } in dev builds.
|
|
7
|
+
* 2. React fiber traversal: walk up from the DOM node to find the owning fiber.
|
|
8
|
+
*
|
|
9
|
+
* This module only works in dev builds (NODE_ENV !== 'production').
|
|
10
|
+
*/
|
|
11
|
+
export interface SourceLocation {
|
|
12
|
+
fileName: string;
|
|
13
|
+
lineNumber: number;
|
|
14
|
+
columnNumber?: number;
|
|
15
|
+
componentName?: string;
|
|
16
|
+
}
|
|
17
|
+
export declare function getSourceLocation(el: Element): SourceLocation | null;
|
|
18
|
+
//# sourceMappingURL=sourceMap.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sourceMap.d.ts","sourceRoot":"","sources":["../src/sourceMap.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,MAAM,WAAW,cAAc;IAC7B,QAAQ,EAAE,MAAM,CAAC;IACjB,UAAU,EAAE,MAAM,CAAC;IACnB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,aAAa,CAAC,EAAE,MAAM,CAAC;CACxB;AAkDD,wBAAgB,iBAAiB,CAAC,EAAE,EAAE,OAAO,GAAG,cAAc,GAAG,IAAI,CAUpE"}
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Maps a DOM element to its JSX source location.
|
|
3
|
+
*
|
|
4
|
+
* Two strategies:
|
|
5
|
+
* 1. @babel/plugin-transform-react-jsx-source stamps _debugSource on fiber nodes
|
|
6
|
+
* with { fileName, lineNumber, columnNumber } in dev builds.
|
|
7
|
+
* 2. React fiber traversal: walk up from the DOM node to find the owning fiber.
|
|
8
|
+
*
|
|
9
|
+
* This module only works in dev builds (NODE_ENV !== 'production').
|
|
10
|
+
*/
|
|
11
|
+
function getFiberFromElement(el) {
|
|
12
|
+
const domEl = el;
|
|
13
|
+
// React 17+ stores the fiber on the element with a mangled key like __reactFiber$...
|
|
14
|
+
for (const key of Object.keys(domEl)) {
|
|
15
|
+
if (key.startsWith('__reactFiber$') || key.startsWith('__reactInternalInstance$')) {
|
|
16
|
+
return domEl[key] ?? null;
|
|
17
|
+
}
|
|
18
|
+
}
|
|
19
|
+
return null;
|
|
20
|
+
}
|
|
21
|
+
function walkFiberForSource(fiber) {
|
|
22
|
+
let current = fiber;
|
|
23
|
+
while (current) {
|
|
24
|
+
if (current._debugSource) {
|
|
25
|
+
const componentName = current._debugOwner?.name ??
|
|
26
|
+
(typeof current.type === 'function' || typeof current.type === 'object'
|
|
27
|
+
? current.type?.displayName ??
|
|
28
|
+
current.type?.name
|
|
29
|
+
: undefined);
|
|
30
|
+
const loc = {
|
|
31
|
+
fileName: current._debugSource.fileName,
|
|
32
|
+
lineNumber: current._debugSource.lineNumber,
|
|
33
|
+
};
|
|
34
|
+
if (current._debugSource.columnNumber !== undefined)
|
|
35
|
+
loc.columnNumber = current._debugSource.columnNumber;
|
|
36
|
+
if (componentName)
|
|
37
|
+
loc.componentName = componentName;
|
|
38
|
+
return loc;
|
|
39
|
+
}
|
|
40
|
+
current = current.return;
|
|
41
|
+
}
|
|
42
|
+
return null;
|
|
43
|
+
}
|
|
44
|
+
export function getSourceLocation(el) {
|
|
45
|
+
if (typeof process !== 'undefined' && process.env['NODE_ENV'] === 'production') {
|
|
46
|
+
console.warn('[tour-recorder] Source mapping is not available in production builds.');
|
|
47
|
+
return null;
|
|
48
|
+
}
|
|
49
|
+
const fiber = getFiberFromElement(el);
|
|
50
|
+
if (!fiber)
|
|
51
|
+
return null;
|
|
52
|
+
return walkFiberForSource(fiber);
|
|
53
|
+
}
|
|
54
|
+
//# sourceMappingURL=sourceMap.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sourceMap.js","sourceRoot":"","sources":["../src/sourceMap.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAqBH,SAAS,mBAAmB,CAAC,EAAW;IACtC,MAAM,KAAK,GAAG,EAAsB,CAAC;IAErC,qFAAqF;IACrF,KAAK,MAAM,GAAG,IAAI,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC;QACrC,IAAI,GAAG,CAAC,UAAU,CAAC,eAAe,CAAC,IAAI,GAAG,CAAC,UAAU,CAAC,0BAA0B,CAAC,EAAE,CAAC;YAClF,OAAO,KAAK,CAAC,GAAG,CAAC,IAAI,IAAI,CAAC;QAC5B,CAAC;IACH,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC;AAED,SAAS,kBAAkB,CAAC,KAAiB;IAC3C,IAAI,OAAO,GAA2B,KAAK,CAAC;IAC5C,OAAO,OAAO,EAAE,CAAC;QACf,IAAI,OAAO,CAAC,YAAY,EAAE,CAAC;YACzB,MAAM,aAAa,GACjB,OAAO,CAAC,WAAW,EAAE,IAAI;gBACzB,CAAC,OAAO,OAAO,CAAC,IAAI,KAAK,UAAU,IAAI,OAAO,OAAO,CAAC,IAAI,KAAK,QAAQ;oBACrE,CAAC,CAAE,OAAO,CAAC,IAAgD,EAAE,WAAW;wBACrE,OAAO,CAAC,IAA0B,EAAE,IAAI;oBAC3C,CAAC,CAAC,SAAS,CAAC,CAAC;YAEjB,MAAM,GAAG,GAAmB;gBAC1B,QAAQ,EAAE,OAAO,CAAC,YAAY,CAAC,QAAQ;gBACvC,UAAU,EAAE,OAAO,CAAC,YAAY,CAAC,UAAU;aAC5C,CAAC;YACF,IAAI,OAAO,CAAC,YAAY,CAAC,YAAY,KAAK,SAAS;gBAAE,GAAG,CAAC,YAAY,GAAG,OAAO,CAAC,YAAY,CAAC,YAAY,CAAC;YAC1G,IAAI,aAAa;gBAAE,GAAG,CAAC,aAAa,GAAG,aAAa,CAAC;YACrD,OAAO,GAAG,CAAC;QACb,CAAC;QACD,OAAO,GAAG,OAAO,CAAC,MAAM,CAAC;IAC3B,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC;AAED,MAAM,UAAU,iBAAiB,CAAC,EAAW;IAC3C,IAAI,OAAO,OAAO,KAAK,WAAW,IAAI,OAAO,CAAC,GAAG,CAAC,UAAU,CAAC,KAAK,YAAY,EAAE,CAAC;QAC/E,OAAO,CAAC,IAAI,CAAC,uEAAuE,CAAC,CAAC;QACtF,OAAO,IAAI,CAAC;IACd,CAAC;IAED,MAAM,KAAK,GAAG,mBAAmB,CAAC,EAAE,CAAC,CAAC;IACtC,IAAI,CAAC,KAAK;QAAE,OAAO,IAAI,CAAC;IAExB,OAAO,kBAAkB,CAAC,KAAK,CAAC,CAAC;AACnC,CAAC"}
|
package/package.json
ADDED
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@guided-tour-s4marth/recorder",
|
|
3
|
+
"version": "0.1.0",
|
|
4
|
+
"description": "DEV-ONLY: click-to-record guided tour authoring overlay",
|
|
5
|
+
"license": "MIT",
|
|
6
|
+
"author": "DataGenie",
|
|
7
|
+
"keywords": [
|
|
8
|
+
"guided-tour",
|
|
9
|
+
"onboarding",
|
|
10
|
+
"recorder",
|
|
11
|
+
"authoring",
|
|
12
|
+
"react"
|
|
13
|
+
],
|
|
14
|
+
"repository": {
|
|
15
|
+
"type": "git",
|
|
16
|
+
"url": "https://github.com/samarthrgb/guided-tour",
|
|
17
|
+
"directory": "packages/tour-recorder"
|
|
18
|
+
},
|
|
19
|
+
"publishConfig": {
|
|
20
|
+
"access": "public"
|
|
21
|
+
},
|
|
22
|
+
"type": "module",
|
|
23
|
+
"sideEffects": false,
|
|
24
|
+
"exports": {
|
|
25
|
+
".": {
|
|
26
|
+
"types": "./dist/index.d.ts",
|
|
27
|
+
"import": "./dist/index.js"
|
|
28
|
+
}
|
|
29
|
+
},
|
|
30
|
+
"main": "./dist/index.js",
|
|
31
|
+
"types": "./dist/index.d.ts",
|
|
32
|
+
"files": [
|
|
33
|
+
"dist"
|
|
34
|
+
],
|
|
35
|
+
"dependencies": {
|
|
36
|
+
"@guided-tour-s4marth/core": "0.1.0"
|
|
37
|
+
},
|
|
38
|
+
"peerDependencies": {
|
|
39
|
+
"react": ">=18.0.0",
|
|
40
|
+
"react-dom": ">=18.0.0"
|
|
41
|
+
},
|
|
42
|
+
"devDependencies": {
|
|
43
|
+
"@types/react": "^18.3.12",
|
|
44
|
+
"@types/react-dom": "^18.3.1",
|
|
45
|
+
"react": "^18.3.1",
|
|
46
|
+
"react-dom": "^18.3.1",
|
|
47
|
+
"typescript": "^5.7.2"
|
|
48
|
+
},
|
|
49
|
+
"scripts": {
|
|
50
|
+
"build": "tsc -p tsconfig.build.json",
|
|
51
|
+
"dev": "tsc -p tsconfig.build.json --watch",
|
|
52
|
+
"typecheck": "tsc --noEmit",
|
|
53
|
+
"clean": "rm -rf dist *.tsbuildinfo"
|
|
54
|
+
}
|
|
55
|
+
}
|