@clue-ai/browser-sdk 0.0.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.
Files changed (102) hide show
  1. package/README.md +100 -0
  2. package/dist/authoring/overlay.d.ts +12 -0
  3. package/dist/authoring/overlay.js +468 -0
  4. package/dist/authoring/recording.d.ts +125 -0
  5. package/dist/authoring/recording.js +481 -0
  6. package/dist/authoring/service-logo.d.ts +1 -0
  7. package/dist/authoring/service-logo.generated.d.ts +1 -0
  8. package/dist/authoring/service-logo.generated.js +3 -0
  9. package/dist/authoring/service-logo.js +1 -0
  10. package/dist/authoring/session.d.ts +23 -0
  11. package/dist/authoring/session.js +127 -0
  12. package/dist/authoring/surface.d.ts +11 -0
  13. package/dist/authoring/surface.js +63 -0
  14. package/dist/authoring/toolbar-constants.d.ts +23 -0
  15. package/dist/authoring/toolbar-constants.js +42 -0
  16. package/dist/authoring/toolbar-drag.d.ts +29 -0
  17. package/dist/authoring/toolbar-drag.js +270 -0
  18. package/dist/authoring/toolbar-view.d.ts +21 -0
  19. package/dist/authoring/toolbar-view.js +2584 -0
  20. package/dist/capture/action.d.ts +2 -0
  21. package/dist/capture/action.js +62 -0
  22. package/dist/capture/dom.d.ts +23 -0
  23. package/dist/capture/dom.js +329 -0
  24. package/dist/capture/drag.d.ts +2 -0
  25. package/dist/capture/drag.js +75 -0
  26. package/dist/capture/error.d.ts +2 -0
  27. package/dist/capture/error.js +193 -0
  28. package/dist/capture/form.d.ts +2 -0
  29. package/dist/capture/form.js +137 -0
  30. package/dist/capture/frustration.d.ts +2 -0
  31. package/dist/capture/frustration.js +171 -0
  32. package/dist/capture/input.d.ts +2 -0
  33. package/dist/capture/input.js +109 -0
  34. package/dist/capture/location.d.ts +10 -0
  35. package/dist/capture/location.js +42 -0
  36. package/dist/capture/navigation.d.ts +2 -0
  37. package/dist/capture/navigation.js +100 -0
  38. package/dist/capture/network.d.ts +13 -0
  39. package/dist/capture/network.js +903 -0
  40. package/dist/capture/page.d.ts +2 -0
  41. package/dist/capture/page.js +78 -0
  42. package/dist/capture/performance.d.ts +2 -0
  43. package/dist/capture/performance.js +268 -0
  44. package/dist/context/account.d.ts +12 -0
  45. package/dist/context/account.js +129 -0
  46. package/dist/context/environment.d.ts +42 -0
  47. package/dist/context/environment.js +208 -0
  48. package/dist/context/identity.d.ts +14 -0
  49. package/dist/context/identity.js +123 -0
  50. package/dist/context/session.d.ts +28 -0
  51. package/dist/context/session.js +155 -0
  52. package/dist/context/tab.d.ts +22 -0
  53. package/dist/context/tab.js +142 -0
  54. package/dist/context/trace.d.ts +32 -0
  55. package/dist/context/trace.js +65 -0
  56. package/dist/core/config.d.ts +4 -0
  57. package/dist/core/config.js +199 -0
  58. package/dist/core/constants.d.ts +43 -0
  59. package/dist/core/constants.js +109 -0
  60. package/dist/core/contracts.d.ts +58 -0
  61. package/dist/core/contracts.js +53 -0
  62. package/dist/core/sdk.d.ts +2 -0
  63. package/dist/core/sdk.js +831 -0
  64. package/dist/core/types.d.ts +413 -0
  65. package/dist/core/types.js +1 -0
  66. package/dist/core/usage-governor.d.ts +7 -0
  67. package/dist/core/usage-governor.js +127 -0
  68. package/dist/index.d.ts +17 -0
  69. package/dist/index.js +36 -0
  70. package/dist/integrations/next-router.d.ts +16 -0
  71. package/dist/integrations/next-router.js +18 -0
  72. package/dist/integrations/react-router.d.ts +7 -0
  73. package/dist/integrations/react-router.js +37 -0
  74. package/dist/internal/metrics.d.ts +9 -0
  75. package/dist/internal/metrics.js +38 -0
  76. package/dist/normalize/builders.d.ts +15 -0
  77. package/dist/normalize/builders.js +786 -0
  78. package/dist/normalize/canonical.d.ts +13 -0
  79. package/dist/normalize/canonical.js +77 -0
  80. package/dist/normalize/event-id.d.ts +8 -0
  81. package/dist/normalize/event-id.js +39 -0
  82. package/dist/normalize/path-template.d.ts +1 -0
  83. package/dist/normalize/path-template.js +33 -0
  84. package/dist/privacy/local-minimization.d.ts +29 -0
  85. package/dist/privacy/local-minimization.js +88 -0
  86. package/dist/privacy/mask.d.ts +7 -0
  87. package/dist/privacy/mask.js +60 -0
  88. package/dist/privacy/parameter-snapshot.d.ts +14 -0
  89. package/dist/privacy/parameter-snapshot.js +206 -0
  90. package/dist/privacy/sanitize.d.ts +11 -0
  91. package/dist/privacy/sanitize.js +145 -0
  92. package/dist/privacy/schema-evidence.d.ts +20 -0
  93. package/dist/privacy/schema-evidence.js +238 -0
  94. package/dist/transport/batch.d.ts +37 -0
  95. package/dist/transport/batch.js +182 -0
  96. package/dist/transport/client.d.ts +61 -0
  97. package/dist/transport/client.js +267 -0
  98. package/dist/transport/queue.d.ts +22 -0
  99. package/dist/transport/queue.js +56 -0
  100. package/dist/transport/retry.d.ts +14 -0
  101. package/dist/transport/retry.js +46 -0
  102. package/package.json +38 -0
@@ -0,0 +1,63 @@
1
+ export const AUTHORING_ROOT_ATTRIBUTE = "data-clue-authoring-root";
2
+ export const AUTHORING_ROOT_ATTRIBUTE_VALUE = "true";
3
+ export const AUTHORING_INTERNAL_REQUEST_HEADER = "x-clue-authoring-request";
4
+ export const AUTHORING_INTERNAL_REQUEST_HEADER_VALUE = "true";
5
+ export const AUTHORING_INTERNAL_REQUEST_PATH_SEGMENT = "/business-events/authoring";
6
+ function debugAuthoringExclusion(payload) {
7
+ if (typeof console === "undefined" || typeof console.debug !== "function") {
8
+ return;
9
+ }
10
+ console.debug("[clue] excluded authoring observation", payload);
11
+ }
12
+ export function markAuthoringRoot(element) {
13
+ element.setAttribute(AUTHORING_ROOT_ATTRIBUTE, AUTHORING_ROOT_ATTRIBUTE_VALUE);
14
+ }
15
+ export function resolveAuthoringSurfaceRoot(target) {
16
+ if (!(target instanceof Element)) {
17
+ return null;
18
+ }
19
+ const markerSelector = `[${AUTHORING_ROOT_ATTRIBUTE}="${AUTHORING_ROOT_ATTRIBUTE_VALUE}"]`;
20
+ const markedRoot = target.closest(markerSelector);
21
+ if (markedRoot instanceof HTMLElement) {
22
+ return markedRoot;
23
+ }
24
+ return null;
25
+ }
26
+ export function isWithinAuthoringSurface(target) {
27
+ const root = resolveAuthoringSurfaceRoot(target);
28
+ if (!root) {
29
+ return false;
30
+ }
31
+ debugAuthoringExclusion({
32
+ excluded: true,
33
+ exclusion_reason: target === root ? "authoring_surface_dom" : "authoring_surface_descendant",
34
+ matched_authoring_root: root.id || root.getAttribute(AUTHORING_ROOT_ATTRIBUTE),
35
+ });
36
+ return true;
37
+ }
38
+ export function hasAuthoringInternalRequestHeader(headers) {
39
+ return Object.entries(headers).some(([key, value]) => {
40
+ return (key.trim().toLowerCase() === AUTHORING_INTERNAL_REQUEST_HEADER &&
41
+ value.trim().length > 0 &&
42
+ value.trim().toLowerCase() !== "false");
43
+ });
44
+ }
45
+ export function isAuthoringInternalRequestUrl(rawUrl) {
46
+ if (!rawUrl) {
47
+ return false;
48
+ }
49
+ try {
50
+ const resolved = new URL(rawUrl, globalThis.location?.href);
51
+ return resolved.pathname.includes(AUTHORING_INTERNAL_REQUEST_PATH_SEGMENT);
52
+ }
53
+ catch {
54
+ return rawUrl.includes(AUTHORING_INTERNAL_REQUEST_PATH_SEGMENT);
55
+ }
56
+ }
57
+ export function logAuthoringRequestExclusion(matchedRequestRule) {
58
+ debugAuthoringExclusion({
59
+ excluded: true,
60
+ exclusion_reason: "authoring_internal_request",
61
+ matched_request_rule: matchedRequestRule,
62
+ });
63
+ }
@@ -0,0 +1,23 @@
1
+ import { type IconNode } from "lucide";
2
+ export declare const TOOLBAR_ROOT_ID = "clue-business-event-authoring-toolbar";
3
+ export declare const TOOLBAR_INITIAL_TOP = 20;
4
+ export declare const TOOLBAR_VIEWPORT_GUTTER = 24;
5
+ export declare const TOOLBAR_CLUSTER_SIZE = 176;
6
+ export declare const TOOLBAR_CLUSTER_HEIGHT = 220;
7
+ export declare const TOOLBAR_PANEL_WIDTH = 288;
8
+ export declare const TOOLBAR_PANEL_HEIGHT = 540;
9
+ export declare const TOOLBAR_DOCK_GAP = 24;
10
+ export declare const TOOLBAR_BASE_BUTTON_SIZE = 40;
11
+ export declare const TOOLBAR_BASE_BUTTON_EDGE_OFFSET = 18;
12
+ export declare const TOOLBAR_COLLAPSED_WIDTH: number;
13
+ export declare const TOOLBAR_COLLAPSED_HEIGHT: number;
14
+ export declare const TOOLBAR_ACTION_BUTTON_SIZE = 44;
15
+ export declare const TOOLBAR_FALLBACK_HEIGHT = 540;
16
+ export type ToolbarActionDefinition = {
17
+ key: string;
18
+ label: string;
19
+ icon: IconNode;
20
+ x: number;
21
+ y: number;
22
+ };
23
+ export declare const AUTHORING_ACTIONS: readonly ToolbarActionDefinition[];
@@ -0,0 +1,42 @@
1
+ import { CircleDot, Download, LogOut } from "lucide";
2
+ export const TOOLBAR_ROOT_ID = "clue-business-event-authoring-toolbar";
3
+ export const TOOLBAR_INITIAL_TOP = 20;
4
+ export const TOOLBAR_VIEWPORT_GUTTER = 24;
5
+ export const TOOLBAR_CLUSTER_SIZE = 176;
6
+ export const TOOLBAR_CLUSTER_HEIGHT = 220;
7
+ export const TOOLBAR_PANEL_WIDTH = 288;
8
+ export const TOOLBAR_PANEL_HEIGHT = 540;
9
+ export const TOOLBAR_DOCK_GAP = 24;
10
+ export const TOOLBAR_BASE_BUTTON_SIZE = 40;
11
+ export const TOOLBAR_BASE_BUTTON_EDGE_OFFSET = 18;
12
+ export const TOOLBAR_COLLAPSED_WIDTH = TOOLBAR_BASE_BUTTON_EDGE_OFFSET * 2 + TOOLBAR_BASE_BUTTON_SIZE;
13
+ export const TOOLBAR_COLLAPSED_HEIGHT = TOOLBAR_BASE_BUTTON_EDGE_OFFSET * 2 + TOOLBAR_BASE_BUTTON_SIZE;
14
+ export const TOOLBAR_ACTION_BUTTON_SIZE = 44;
15
+ export const TOOLBAR_FALLBACK_HEIGHT = TOOLBAR_PANEL_HEIGHT;
16
+ const AUTHORING_ACTION_STACK_GAP = 8;
17
+ const AUTHORING_ACTION_STACK_START = (TOOLBAR_BASE_BUTTON_SIZE + TOOLBAR_ACTION_BUTTON_SIZE) / 2 +
18
+ AUTHORING_ACTION_STACK_GAP;
19
+ const AUTHORING_ACTION_STACK_STEP = TOOLBAR_ACTION_BUTTON_SIZE + AUTHORING_ACTION_STACK_GAP;
20
+ export const AUTHORING_ACTIONS = [
21
+ {
22
+ key: "record",
23
+ label: "イベントを記録する",
24
+ icon: CircleDot,
25
+ x: 0,
26
+ y: AUTHORING_ACTION_STACK_START,
27
+ },
28
+ {
29
+ key: "save",
30
+ label: "保存/下書き保存する",
31
+ icon: Download,
32
+ x: 0,
33
+ y: AUTHORING_ACTION_STACK_START + AUTHORING_ACTION_STACK_STEP,
34
+ },
35
+ {
36
+ key: "close",
37
+ label: "終了する",
38
+ icon: LogOut,
39
+ x: 0,
40
+ y: AUTHORING_ACTION_STACK_START + AUTHORING_ACTION_STACK_STEP * 2,
41
+ },
42
+ ];
@@ -0,0 +1,29 @@
1
+ export type ToolbarDragHandle = {
2
+ dispose: () => void;
3
+ updateBounds: () => void;
4
+ consumeSuppressedClick: () => boolean;
5
+ };
6
+ export declare function getViewportSize(): {
7
+ width: number;
8
+ height: number;
9
+ };
10
+ export declare function measureToolbar(toolbar: HTMLElement): {
11
+ width: number;
12
+ height: number;
13
+ };
14
+ export declare function clampToolbarPosition(input: {
15
+ x: number;
16
+ y: number;
17
+ width: number;
18
+ height: number;
19
+ }): {
20
+ x: number;
21
+ y: number;
22
+ };
23
+ export declare function applyToolbarPosition(shell: HTMLElement, position: {
24
+ x: number;
25
+ y: number;
26
+ }): void;
27
+ export declare function installToolbarDrag(shell: HTMLElement, handle: HTMLElement, options?: {
28
+ onPositionChange?: () => void;
29
+ }): Promise<ToolbarDragHandle>;
@@ -0,0 +1,270 @@
1
+ import { TOOLBAR_FALLBACK_HEIGHT, TOOLBAR_INITIAL_TOP, TOOLBAR_VIEWPORT_GUTTER, } from "./toolbar-constants";
2
+ export function getViewportSize() {
3
+ return {
4
+ width: Math.max(document.documentElement.clientWidth, window.innerWidth, 0),
5
+ height: Math.max(document.documentElement.clientHeight, window.innerHeight, 0),
6
+ };
7
+ }
8
+ function readConfiguredSize(value) {
9
+ const parsed = Number.parseFloat(value);
10
+ return Number.isFinite(parsed) ? parsed : 0;
11
+ }
12
+ export function measureToolbar(toolbar) {
13
+ const viewport = getViewportSize();
14
+ return {
15
+ width: toolbar.offsetWidth ||
16
+ readConfiguredSize(toolbar.style.width) ||
17
+ Math.max(0, viewport.width - TOOLBAR_VIEWPORT_GUTTER * 2),
18
+ height: toolbar.offsetHeight ||
19
+ readConfiguredSize(toolbar.style.height) ||
20
+ TOOLBAR_FALLBACK_HEIGHT,
21
+ };
22
+ }
23
+ export function clampToolbarPosition(input) {
24
+ const viewport = getViewportSize();
25
+ const minX = TOOLBAR_VIEWPORT_GUTTER;
26
+ const minY = TOOLBAR_INITIAL_TOP;
27
+ const maxX = Math.max(minX, viewport.width - input.width - TOOLBAR_VIEWPORT_GUTTER);
28
+ const maxY = Math.max(minY, viewport.height - input.height - TOOLBAR_VIEWPORT_GUTTER);
29
+ return {
30
+ x: Math.min(Math.max(input.x, minX), maxX),
31
+ y: Math.min(Math.max(input.y, minY), maxY),
32
+ };
33
+ }
34
+ export function applyToolbarPosition(shell, position) {
35
+ shell.style.left = `${position.x}px`;
36
+ shell.style.top = `${position.y}px`;
37
+ }
38
+ function readToolbarPosition(shell) {
39
+ const styleLeft = Number.parseFloat(shell.style.left);
40
+ const styleTop = Number.parseFloat(shell.style.top);
41
+ return {
42
+ x: Number.isFinite(styleLeft) ? styleLeft : shell.offsetLeft,
43
+ y: Number.isFinite(styleTop) ? styleTop : shell.offsetTop,
44
+ };
45
+ }
46
+ async function loadPlainDraggable() {
47
+ const module = (await import("plain-draggable/plain-draggable.esm.js"));
48
+ if (typeof module.default !== "function") {
49
+ throw new TypeError("plain-draggable constructor is unavailable");
50
+ }
51
+ return module.default;
52
+ }
53
+ function waitForNextFrame() {
54
+ return new Promise((resolve) => {
55
+ window.requestAnimationFrame(() => {
56
+ resolve();
57
+ });
58
+ });
59
+ }
60
+ async function ensureConnectedElement(element) {
61
+ if (element.isConnected) {
62
+ return;
63
+ }
64
+ await waitForNextFrame();
65
+ if (element.isConnected) {
66
+ return;
67
+ }
68
+ await waitForNextFrame();
69
+ }
70
+ function installNativeToolbarDrag(shell, handle, options) {
71
+ let suppressClick = false;
72
+ let pointerId = null;
73
+ let startPointerX = 0;
74
+ let startPointerY = 0;
75
+ let startLeft = 0;
76
+ let startTop = 0;
77
+ const readCurrentPosition = () => {
78
+ const currentToolbarPosition = readToolbarPosition(shell);
79
+ const nextPosition = clampToolbarPosition({
80
+ x: currentToolbarPosition.x,
81
+ y: currentToolbarPosition.y,
82
+ ...measureToolbar(shell),
83
+ });
84
+ applyToolbarPosition(shell, nextPosition);
85
+ return nextPosition;
86
+ };
87
+ const removeWindowListeners = () => {
88
+ window.removeEventListener("pointermove", handlePointerMove);
89
+ window.removeEventListener("pointerup", handlePointerUp);
90
+ window.removeEventListener("pointercancel", handlePointerUp);
91
+ };
92
+ const handlePointerMove = (event) => {
93
+ if (pointerId === null || event.pointerId !== pointerId) {
94
+ return;
95
+ }
96
+ const deltaX = event.clientX - startPointerX;
97
+ const deltaY = event.clientY - startPointerY;
98
+ const nextPosition = clampToolbarPosition({
99
+ x: startLeft + deltaX,
100
+ y: startTop + deltaY,
101
+ ...measureToolbar(shell),
102
+ });
103
+ applyToolbarPosition(shell, nextPosition);
104
+ if (Math.abs(deltaX) > 3 || Math.abs(deltaY) > 3) {
105
+ suppressClick = true;
106
+ }
107
+ options?.onPositionChange?.();
108
+ };
109
+ const handlePointerUp = (event) => {
110
+ if (pointerId === null || event.pointerId !== pointerId) {
111
+ return;
112
+ }
113
+ if (typeof handle.releasePointerCapture === "function") {
114
+ try {
115
+ handle.releasePointerCapture(pointerId);
116
+ }
117
+ catch {
118
+ // Ignore release failures from already-finished pointer sessions.
119
+ }
120
+ }
121
+ pointerId = null;
122
+ handle.style.cursor = "grab";
123
+ removeWindowListeners();
124
+ options?.onPositionChange?.();
125
+ };
126
+ const handlePointerDown = (event) => {
127
+ if (event.button !== 0) {
128
+ return;
129
+ }
130
+ const currentPosition = readCurrentPosition();
131
+ pointerId = event.pointerId;
132
+ startPointerX = event.clientX;
133
+ startPointerY = event.clientY;
134
+ startLeft = currentPosition.x;
135
+ startTop = currentPosition.y;
136
+ suppressClick = false;
137
+ handle.style.cursor = "grabbing";
138
+ if (typeof handle.setPointerCapture === "function") {
139
+ try {
140
+ handle.setPointerCapture(pointerId);
141
+ }
142
+ catch {
143
+ // Ignore capture failures and continue with window listeners.
144
+ }
145
+ }
146
+ window.addEventListener("pointermove", handlePointerMove);
147
+ window.addEventListener("pointerup", handlePointerUp);
148
+ window.addEventListener("pointercancel", handlePointerUp);
149
+ event.preventDefault();
150
+ };
151
+ handle.style.cursor = "grab";
152
+ handle.addEventListener("pointerdown", handlePointerDown);
153
+ return {
154
+ dispose() {
155
+ handle.style.cursor = "grab";
156
+ handle.removeEventListener("pointerdown", handlePointerDown);
157
+ removeWindowListeners();
158
+ },
159
+ updateBounds() {
160
+ readCurrentPosition();
161
+ options?.onPositionChange?.();
162
+ },
163
+ consumeSuppressedClick() {
164
+ if (!suppressClick) {
165
+ return false;
166
+ }
167
+ suppressClick = false;
168
+ return true;
169
+ },
170
+ };
171
+ }
172
+ export async function installToolbarDrag(shell, handle, options) {
173
+ let suppressClick = false;
174
+ let dragStartedFromMove = false;
175
+ await ensureConnectedElement(shell);
176
+ const PlainDraggable = await loadPlainDraggable().catch(() => null);
177
+ const buildContainmentRect = () => {
178
+ const size = measureToolbar(shell);
179
+ const viewport = getViewportSize();
180
+ return {
181
+ left: TOOLBAR_VIEWPORT_GUTTER,
182
+ top: TOOLBAR_INITIAL_TOP,
183
+ right: Math.max(TOOLBAR_VIEWPORT_GUTTER + size.width, viewport.width - TOOLBAR_VIEWPORT_GUTTER),
184
+ bottom: Math.max(TOOLBAR_INITIAL_TOP + size.height, viewport.height - TOOLBAR_VIEWPORT_GUTTER),
185
+ };
186
+ };
187
+ let draggable;
188
+ if (!PlainDraggable) {
189
+ return installNativeToolbarDrag(shell, handle, options);
190
+ }
191
+ const PlainDraggableConstructor = PlainDraggable;
192
+ const createDraggable = () => new PlainDraggableConstructor(shell, {
193
+ handle,
194
+ leftTop: true,
195
+ zIndex: false,
196
+ containment: buildContainmentRect(),
197
+ onMoveStart() {
198
+ dragStartedFromMove = true;
199
+ handle.style.cursor = "grabbing";
200
+ },
201
+ onDrag(position) {
202
+ const nextPosition = clampToolbarPosition({
203
+ x: position.left,
204
+ y: position.top,
205
+ ...measureToolbar(shell),
206
+ });
207
+ if (nextPosition.x === position.left &&
208
+ nextPosition.y === position.top) {
209
+ return;
210
+ }
211
+ draggable.left = nextPosition.x;
212
+ draggable.top = nextPosition.y;
213
+ draggable.position();
214
+ options?.onPositionChange?.();
215
+ },
216
+ onDragEnd() {
217
+ handle.style.cursor = "grab";
218
+ suppressClick = dragStartedFromMove;
219
+ dragStartedFromMove = false;
220
+ options?.onPositionChange?.();
221
+ },
222
+ });
223
+ try {
224
+ draggable = createDraggable();
225
+ }
226
+ catch (error) {
227
+ if (error instanceof Error &&
228
+ error.message.includes("This element is not accepted")) {
229
+ await waitForNextFrame();
230
+ try {
231
+ draggable = createDraggable();
232
+ }
233
+ catch {
234
+ return installNativeToolbarDrag(shell, handle, options);
235
+ }
236
+ }
237
+ else {
238
+ return installNativeToolbarDrag(shell, handle, options);
239
+ }
240
+ }
241
+ return {
242
+ dispose() {
243
+ handle.style.cursor = "grab";
244
+ draggable.remove();
245
+ },
246
+ updateBounds() {
247
+ const currentToolbarPosition = readToolbarPosition(shell);
248
+ const nextPosition = clampToolbarPosition({
249
+ x: currentToolbarPosition.x,
250
+ y: currentToolbarPosition.y,
251
+ ...measureToolbar(shell),
252
+ });
253
+ applyToolbarPosition(shell, nextPosition);
254
+ draggable.setOptions({
255
+ containment: buildContainmentRect(),
256
+ left: nextPosition.x,
257
+ top: nextPosition.y,
258
+ });
259
+ draggable.position();
260
+ options?.onPositionChange?.();
261
+ },
262
+ consumeSuppressedClick() {
263
+ if (!suppressClick) {
264
+ return false;
265
+ }
266
+ suppressClick = false;
267
+ return true;
268
+ },
269
+ };
270
+ }
@@ -0,0 +1,21 @@
1
+ import type { AuthoringRecordingController } from "./recording";
2
+ import type { BusinessEventAuthoringSession } from "./session";
3
+ export type ToolbarMountHandle = {
4
+ root: HTMLElement;
5
+ dispose: () => void;
6
+ };
7
+ type MountToolbarOptions = {
8
+ onClose: () => void;
9
+ onReady: () => void;
10
+ recording: AuthoringRecordingController;
11
+ onSetRecording: (isRecording: boolean) => Promise<void>;
12
+ onResetRecording: () => Promise<void>;
13
+ onSave: (input: {
14
+ title: string;
15
+ description: string;
16
+ saveMode: "draft" | "publish";
17
+ selectedActionUnitIds: string[];
18
+ }) => Promise<void>;
19
+ };
20
+ export declare function mountToolbar(session: BusinessEventAuthoringSession, options: MountToolbarOptions): Promise<ToolbarMountHandle>;
21
+ export {};