@flowsterix/react 0.13.0 → 0.14.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.
@@ -41,8 +41,8 @@ var expandRect = (rect, padding) => {
41
41
  const spaceBottom = viewport.height - rect.bottom;
42
42
  const spaceLeft = rect.left;
43
43
  const spaceRight = viewport.width - rect.right;
44
- const verticalPadding = Math.min(padding, spaceTop, spaceBottom);
45
- const horizontalPadding = Math.min(padding, spaceLeft, spaceRight);
44
+ const verticalPadding = Math.max(0, Math.min(padding, spaceTop, spaceBottom));
45
+ const horizontalPadding = Math.max(0, Math.min(padding, spaceLeft, spaceRight));
46
46
  return createRect({
47
47
  top: rect.top - verticalPadding,
48
48
  left: rect.left - horizontalPadding,
@@ -41,8 +41,8 @@ var expandRect = (rect, padding) => {
41
41
  const spaceBottom = viewport.height - rect.bottom;
42
42
  const spaceLeft = rect.left;
43
43
  const spaceRight = viewport.width - rect.right;
44
- const verticalPadding = Math.min(padding, spaceTop, spaceBottom);
45
- const horizontalPadding = Math.min(padding, spaceLeft, spaceRight);
44
+ const verticalPadding = Math.max(0, Math.min(padding, spaceTop, spaceBottom));
45
+ const horizontalPadding = Math.max(0, Math.min(padding, spaceLeft, spaceRight));
46
46
  return createRect({
47
47
  top: rect.top - verticalPadding,
48
48
  left: rect.left - horizontalPadding,
@@ -56,7 +56,13 @@ export interface TourPopoverPortalProps {
56
56
  * The backdrop will show but the popover content remains invisible.
57
57
  */
58
58
  isInGracePeriod?: boolean;
59
+ /**
60
+ * Callback reporting the popover's rendered height (plus margin).
61
+ * Use as `scrollLockBottomInset` so constrained scroll lets users
62
+ * reach all highlighted content above the popover.
63
+ */
64
+ onHeightChange?: (height: number) => void;
59
65
  }
60
- export declare const TourPopoverPortal: ({ target, children, offset, width, maxWidth, zIndex, placement, role, ariaLabel, ariaDescribedBy, ariaModal, descriptionId, descriptionText, onContainerChange, layoutId, containerComponent, contentComponent, transitionsOverride, isInGracePeriod, }: TourPopoverPortalProps) => import("react").ReactPortal | null;
66
+ export declare const TourPopoverPortal: ({ target, children, offset, width, maxWidth, zIndex, placement, role, ariaLabel, ariaDescribedBy, ariaModal, descriptionId, descriptionText, onContainerChange, layoutId, containerComponent, contentComponent, transitionsOverride, isInGracePeriod, onHeightChange, }: TourPopoverPortalProps) => import("react").ReactPortal | null;
61
67
  export {};
62
68
  //# sourceMappingURL=TourPopoverPortal.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"TourPopoverPortal.d.ts","sourceRoot":"","sources":["../../src/components/TourPopoverPortal.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,aAAa,EACb,aAAa,EACb,cAAc,EACd,mBAAmB,EACnB,SAAS,EACT,WAAW,EACZ,MAAM,OAAO,CAAA;AAYd,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAA;AACrD,OAAO,KAAK,EAAE,WAAW,EAAE,WAAW,EAAc,MAAM,cAAc,CAAA;AAExE,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,wBAAwB,CAAA;AAE5D,OAAO,KAAK,EAAE,2BAA2B,EAAE,MAAM,4BAA4B,CAAA;AAuB7E,KAAK,kBAAkB,GAAG,WAAW,GACnC,IAAI,CAAC,cAAc,CAAC,WAAW,CAAC,EAAE,OAAO,CAAC,GAAG;IAC3C,KAAK,CAAC,EAAE,aAAa,GAAG,WAAW,CAAA;CACpC,CAAA;AAEH,KAAK,sBAAsB,GAAG,aAAa,CAAC,kBAAkB,CAAC,CAAA;AAoB/D,MAAM,MAAM,qBAAqB,GAAG,UAAU,GAAG,QAAQ,GAAG,QAAQ,GAAG,QAAQ,CAAA;AAE/E,MAAM,WAAW,4BAA4B;IAC3C,SAAS,EAAE,sBAAsB,CAAA;IACjC,OAAO,EAAE,sBAAsB,CAAA;IAC/B,cAAc,EAAE,kBAAkB,GAChC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG;QACxB,GAAG,EAAE,WAAW,CAAC,WAAW,CAAC,CAAA;QAC7B,KAAK,EAAE,aAAa,CAAA;KACrB,CAAA;IACH,YAAY,EAAE,kBAAkB,GAC9B,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG;QAAE,GAAG,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;KAAE,CAAA;IACnD,UAAU,EAAE,qBAAqB,CAAA;IACjC,UAAU,EAAE,OAAO,CAAA;IACnB,cAAc,EAAE,OAAO,CAAA;IACvB,eAAe,EAAE;QACf,IAAI,EAAE,QAAQ,CAAA;QACd,YAAY,EAAE,MAAM,CAAA;QACpB,KAAK,EAAE,aAAa,CAAA;QACpB,aAAa,EAAE,mBAAmB,CAAC,iBAAiB,CAAC,CAAA;KACtD,CAAA;IACD,gBAAgB,EAAE;QAChB,EAAE,CAAC,EAAE,MAAM,CAAA;QACX,IAAI,CAAC,EAAE,MAAM,CAAA;KACd,CAAA;CACF;AAED,MAAM,WAAW,sBAAsB;IACrC,MAAM,EAAE,cAAc,CAAA;IACtB,QAAQ,EAAE,CAAC,KAAK,EAAE,4BAA4B,KAAK,SAAS,CAAA;IAC5D,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,KAAK,CAAC,EAAE,MAAM,GAAG,MAAM,CAAA;IACvB,QAAQ,CAAC,EAAE,MAAM,GAAG,MAAM,CAAA;IAC1B,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,SAAS,CAAC,EAAE,aAAa,CAAA;IACzB,IAAI,CAAC,EAAE,MAAM,CAAA;IACb,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,eAAe,CAAC,EAAE,MAAM,CAAA;IACxB,SAAS,CAAC,EAAE,OAAO,CAAA;IACnB,aAAa,CAAC,EAAE,MAAM,CAAA;IACtB,eAAe,CAAC,EAAE,MAAM,CAAA;IACxB,iBAAiB,CAAC,EAAE,CAAC,IAAI,EAAE,cAAc,GAAG,IAAI,KAAK,IAAI,CAAA;IACzD,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB,kBAAkB,CAAC,EAAE,sBAAsB,CAAA;IAC3C,gBAAgB,CAAC,EAAE,sBAAsB,CAAA;IACzC,mBAAmB,CAAC,EAAE,OAAO,CAAC,2BAA2B,CAAC,CAAA;IAC1D;;;OAGG;IACH,eAAe,CAAC,EAAE,OAAO,CAAA;CAC1B;AAED,eAAO,MAAM,iBAAiB,GAAI,yPAoB/B,sBAAsB,uCAstBxB,CAAA"}
1
+ {"version":3,"file":"TourPopoverPortal.d.ts","sourceRoot":"","sources":["../../src/components/TourPopoverPortal.tsx"],"names":[],"mappings":"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"}
package/dist/context.d.ts CHANGED
@@ -41,7 +41,7 @@ export interface TourContextValue {
41
41
  resume: () => MaybePromise<FlowState>;
42
42
  cancel: (reason?: FlowCancelReason) => MaybePromise<FlowState>;
43
43
  complete: () => MaybePromise<FlowState>;
44
- advanceStep: (stepId: string) => MaybePromise<FlowState>;
44
+ advanceStep: (stepId: string) => MaybePromise<FlowState | null>;
45
45
  events: EventBus<FlowEvents<ReactNode>> | null;
46
46
  debugEnabled: boolean;
47
47
  setDebugEnabled: (value: boolean) => void;
@@ -1 +1 @@
1
- {"version":3,"file":"context.d.ts","sourceRoot":"","sources":["../src/context.tsx"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"context.d.ts","sourceRoot":"","sources":["../src/context.tsx"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"globalBridge.d.ts","sourceRoot":"","sources":["../../src/devtools/globalBridge.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,KAAK,EAAE,cAAc,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAA;AACjE,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,OAAO,CAAA;AAEtC,MAAM,WAAW,mBAAmB;IAClC,KAAK,EAAE,GAAG,CAAC,MAAM,EAAE,cAAc,CAAC,SAAS,CAAC,CAAC,CAAA;IAC7C,YAAY,EAAE,MAAM,GAAG,IAAI,CAAA;IAC3B,KAAK,EAAE,SAAS,GAAG,IAAI,CAAA;IACvB,MAAM,EAAE,MAAM,IAAI,CAAA;IAClB,YAAY,EAAE,CAAC,MAAM,EAAE,MAAM,KAAK,OAAO,CAAC,SAAS,GAAG,IAAI,CAAC,CAAA;IAC3D,iBAAiB,EAAE,CAAC,MAAM,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,CAAA;IACpD,iBAAiB,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,SAAS,KAAK,OAAO,CAAC,IAAI,CAAC,CAAA;CACvE;AAED,KAAK,QAAQ,GAAG,CAAC,KAAK,EAAE,mBAAmB,GAAG,IAAI,KAAK,IAAI,CAAA;AAqB3D,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,mBAAmB,GAAG,IAAI,GAAG,IAAI,CAMzE;AAED,wBAAgB,iBAAiB,IAAI,mBAAmB,GAAG,IAAI,CAE9D;AAED,wBAAgB,uBAAuB,CAAC,QAAQ,EAAE,QAAQ,GAAG,MAAM,IAAI,CAMtE"}
1
+ {"version":3,"file":"globalBridge.d.ts","sourceRoot":"","sources":["../../src/devtools/globalBridge.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,KAAK,EAAE,cAAc,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAA;AACjE,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,OAAO,CAAA;AAEtC,MAAM,WAAW,mBAAmB;IAClC,KAAK,EAAE,GAAG,CAAC,MAAM,EAAE,cAAc,CAAC,SAAS,CAAC,CAAC,CAAA;IAC7C,YAAY,EAAE,MAAM,GAAG,IAAI,CAAA;IAC3B,KAAK,EAAE,SAAS,GAAG,IAAI,CAAA;IACvB,MAAM,EAAE,MAAM,IAAI,CAAA;IAClB,YAAY,EAAE,CAAC,MAAM,EAAE,MAAM,KAAK,OAAO,CAAC,SAAS,GAAG,IAAI,CAAC,CAAA;IAC3D,iBAAiB,EAAE,CAAC,MAAM,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,CAAA;IACpD,iBAAiB,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,SAAS,KAAK,OAAO,CAAC,IAAI,CAAC,CAAA;CACvE;AAED,KAAK,QAAQ,GAAG,CAAC,KAAK,EAAE,mBAAmB,GAAG,IAAI,KAAK,IAAI,CAAA;AAuB3D,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,mBAAmB,GAAG,IAAI,GAAG,IAAI,CAMzE;AAED,wBAAgB,iBAAiB,IAAI,mBAAmB,GAAG,IAAI,CAE9D;AAED,wBAAgB,uBAAuB,CAAC,QAAQ,EAAE,QAAQ,GAAG,MAAM,IAAI,CAMtE"}
@@ -1 +1 @@
1
- {"version":3,"file":"useStepStore.d.ts","sourceRoot":"","sources":["../../../src/devtools/hooks/useStepStore.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,cAAc,EAAE,WAAW,EAAE,WAAW,EAAE,MAAM,UAAU,CAAA;AAoCxE,MAAM,WAAW,kBAAkB;IACjC,KAAK,EAAE,WAAW,EAAE,CAAA;IACpB,OAAO,EAAE,CAAC,MAAM,EAAE;QAAE,IAAI,EAAE,WAAW,CAAA;KAAE,KAAK,WAAW,CAAA;IACvD,UAAU,EAAE,CAAC,MAAM,EAAE;QAAE,EAAE,EAAE,MAAM,CAAA;KAAE,KAAK,IAAI,CAAA;IAC5C,UAAU,EAAE,CAAC,MAAM,EAAE;QAAE,EAAE,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,OAAO,CAAC,WAAW,CAAC,CAAA;KAAE,KAAK,IAAI,CAAA;IAC3E,YAAY,EAAE,CAAC,MAAM,EAAE;QAAE,SAAS,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAA;KAAE,KAAK,IAAI,CAAA;IACtE,aAAa,EAAE,MAAM,IAAI,CAAA;IACzB,WAAW,EAAE,MAAM,cAAc,CAAA;CAClC;AAED,wBAAgB,YAAY,IAAI,kBAAkB,CAmIjD"}
1
+ {"version":3,"file":"useStepStore.d.ts","sourceRoot":"","sources":["../../../src/devtools/hooks/useStepStore.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,cAAc,EAAE,WAAW,EAAE,WAAW,EAAE,MAAM,UAAU,CAAA;AAsCxE,MAAM,WAAW,kBAAkB;IACjC,KAAK,EAAE,WAAW,EAAE,CAAA;IACpB,OAAO,EAAE,CAAC,MAAM,EAAE;QAAE,IAAI,EAAE,WAAW,CAAA;KAAE,KAAK,WAAW,CAAA;IACvD,UAAU,EAAE,CAAC,MAAM,EAAE;QAAE,EAAE,EAAE,MAAM,CAAA;KAAE,KAAK,IAAI,CAAA;IAC5C,UAAU,EAAE,CAAC,MAAM,EAAE;QAAE,EAAE,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,OAAO,CAAC,WAAW,CAAC,CAAA;KAAE,KAAK,IAAI,CAAA;IAC3E,YAAY,EAAE,CAAC,MAAM,EAAE;QAAE,SAAS,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAA;KAAE,KAAK,IAAI,CAAA;IACtE,aAAa,EAAE,MAAM,IAAI,CAAA;IACzB,WAAW,EAAE,MAAM,cAAc,CAAA;CAClC;AAED,wBAAgB,YAAY,IAAI,kBAAkB,CAmIjD"}
@@ -1469,9 +1469,10 @@ function TabNav(props) {
1469
1469
 
1470
1470
  // src/devtools/globalBridge.ts
1471
1471
  var BRIDGE_KEY = "__FLOWSTERIX_DEVTOOLS_BRIDGE__";
1472
+ var SERVER_BRIDGE = { value: null, listeners: /* @__PURE__ */ new Set() };
1472
1473
  function getBridge() {
1473
1474
  if (typeof window === "undefined") {
1474
- return { value: null, listeners: /* @__PURE__ */ new Set() };
1475
+ return SERVER_BRIDGE;
1475
1476
  }
1476
1477
  const w = window;
1477
1478
  if (!w[BRIDGE_KEY]) {
@@ -2568,8 +2569,9 @@ function subscribe(listener) {
2568
2569
  function getSnapshot() {
2569
2570
  return store.steps;
2570
2571
  }
2572
+ var SERVER_SNAPSHOT = [];
2571
2573
  function getServerSnapshot() {
2572
- return [];
2574
+ return SERVER_SNAPSHOT;
2573
2575
  }
2574
2576
  function generateId() {
2575
2577
  return `step-${Date.now()}-${Math.random().toString(36).slice(2, 6)}`;
@@ -1469,9 +1469,10 @@ import { useCallback as useCallback2, useEffect as useEffect4, useState as useSt
1469
1469
 
1470
1470
  // src/devtools/globalBridge.ts
1471
1471
  var BRIDGE_KEY = "__FLOWSTERIX_DEVTOOLS_BRIDGE__";
1472
+ var SERVER_BRIDGE = { value: null, listeners: /* @__PURE__ */ new Set() };
1472
1473
  function getBridge() {
1473
1474
  if (typeof window === "undefined") {
1474
- return { value: null, listeners: /* @__PURE__ */ new Set() };
1475
+ return SERVER_BRIDGE;
1475
1476
  }
1476
1477
  const w = window;
1477
1478
  if (!w[BRIDGE_KEY]) {
@@ -2568,8 +2569,9 @@ function subscribe(listener) {
2568
2569
  function getSnapshot() {
2569
2570
  return store.steps;
2570
2571
  }
2572
+ var SERVER_SNAPSHOT = [];
2571
2573
  function getServerSnapshot() {
2572
- return [];
2574
+ return SERVER_SNAPSHOT;
2573
2575
  }
2574
2576
  function generateId() {
2575
2577
  return `step-${Date.now()}-${Math.random().toString(36).slice(2, 6)}`;
@@ -18,6 +18,13 @@ export interface ConstrainedScrollLockOptions {
18
18
  * Default: 0
19
19
  */
20
20
  padding?: number;
21
+ /**
22
+ * Bottom inset in pixels (e.g. mobile drawer height) to account for
23
+ * when calculating scroll bounds. Increases maxY so users can scroll
24
+ * the target bottom into view above the inset area.
25
+ * Default: 0
26
+ */
27
+ bottomInset?: number;
21
28
  }
22
29
  /**
23
30
  * Enhanced scroll lock that allows constrained scrolling when target is larger than viewport.
@@ -25,5 +32,9 @@ export interface ConstrainedScrollLockOptions {
25
32
  * - If target fits in viewport: normal scroll lock (overflow: hidden)
26
33
  * - If target > viewport: allow scrolling within target bounds only
27
34
  */
28
- export declare const useConstrainedScrollLock: ({ enabled, targetRect, viewportHeight, padding, }: ConstrainedScrollLockOptions) => void;
35
+ export interface ConstrainedScrollLockResult {
36
+ /** Whether constrained scroll mode is active (target exceeds effective viewport). */
37
+ isConstrainedMode: boolean;
38
+ }
39
+ export declare const useConstrainedScrollLock: ({ enabled, targetRect, viewportHeight, padding, bottomInset, }: ConstrainedScrollLockOptions) => ConstrainedScrollLockResult;
29
40
  //# sourceMappingURL=useConstrainedScrollLock.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"useConstrainedScrollLock.d.ts","sourceRoot":"","sources":["../../src/hooks/useConstrainedScrollLock.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,cAAc,CAAA;AAGlD,MAAM,WAAW,4BAA4B;IAC3C;;OAEG;IACH,OAAO,EAAE,OAAO,CAAA;IAChB;;;OAGG;IACH,UAAU,EAAE,cAAc,GAAG,IAAI,CAAA;IACjC;;OAEG;IACH,cAAc,EAAE,MAAM,CAAA;IACtB;;;OAGG;IACH,OAAO,CAAC,EAAE,MAAM,CAAA;CACjB;AAwBD;;;;;GAKG;AACH,eAAO,MAAM,wBAAwB,GAAI,mDAKtC,4BAA4B,SA6D9B,CAAA"}
1
+ {"version":3,"file":"useConstrainedScrollLock.d.ts","sourceRoot":"","sources":["../../src/hooks/useConstrainedScrollLock.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,cAAc,CAAA;AAGlD,MAAM,WAAW,4BAA4B;IAC3C;;OAEG;IACH,OAAO,EAAE,OAAO,CAAA;IAChB;;;OAGG;IACH,UAAU,EAAE,cAAc,GAAG,IAAI,CAAA;IACjC;;OAEG;IACH,cAAc,EAAE,MAAM,CAAA;IACtB;;;OAGG;IACH,OAAO,CAAC,EAAE,MAAM,CAAA;IAChB;;;;;OAKG;IACH,WAAW,CAAC,EAAE,MAAM,CAAA;CACrB;AAwBD;;;;;GAKG;AACH,MAAM,WAAW,2BAA2B;IAC1C,qFAAqF;IACrF,iBAAiB,EAAE,OAAO,CAAA;CAC3B;AAED,eAAO,MAAM,wBAAwB,GAAI,gEAMtC,4BAA4B,KAAG,2BAqEjC,CAAA"}
@@ -18,6 +18,12 @@ export interface UseTourHudOptions {
18
18
  * Enabled by default.
19
19
  */
20
20
  bodyScrollLock?: boolean;
21
+ /**
22
+ * Bottom inset in pixels for constrained scroll lock (e.g. mobile drawer height).
23
+ * When a target is taller than the viewport, this ensures users can scroll
24
+ * the target bottom into view above the inset area.
25
+ */
26
+ scrollLockBottomInset?: number;
21
27
  }
22
28
  export interface TourHudOverlayConfig {
23
29
  padding?: number;
@@ -59,6 +65,8 @@ export interface UseTourHudResult {
59
65
  targetIssue: UseHudTargetIssueResult;
60
66
  shouldLockBodyScroll: boolean;
61
67
  shortcutsEnabled: boolean;
68
+ /** Whether constrained scroll mode is active (target taller than viewport). */
69
+ isConstrainedScrollActive: boolean;
62
70
  }
63
71
  export declare const useTourHud: (options?: UseTourHudOptions) => UseTourHudResult;
64
72
  //# sourceMappingURL=useTourHud.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"useTourHud.d.ts","sourceRoot":"","sources":["../../src/hooks/useTourHud.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,uBAAuB,EAAE,IAAI,EAAE,MAAM,kBAAkB,CAAA;AACrE,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,OAAO,CAAA;AAMtC,OAAO,KAAK,EAAE,uBAAuB,EAAE,MAAM,qBAAqB,CAAA;AAElE,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,mBAAmB,CAAA;AAE/D,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,eAAe,CAAA;AAEtD,OAAO,KAAK,EAAE,uBAAuB,EAAE,MAAM,qBAAqB,CAAA;AAElE,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,iBAAiB,CAAA;AAErD,MAAM,WAAW,iBAAiB;IAChC,cAAc,CAAC,EAAE,MAAM,CAAA;IACvB,aAAa,CAAC,EAAE,MAAM,CAAA;IACtB;;;OAGG;IACH,SAAS,CAAC,EAAE,OAAO,GAAG,sBAAsB,CAAA;IAC5C;;;OAGG;IACH,cAAc,CAAC,EAAE,OAAO,CAAA;CACzB;AAED,MAAM,WAAW,oBAAoB;IACnC,OAAO,CAAC,EAAE,MAAM,CAAA;IAChB,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,eAAe,EAAE,uBAAuB,CAAA;CACzC;AAED,MAAM,WAAW,oBAAoB;IACnC,MAAM,EAAE,MAAM,CAAA;IACd,IAAI,EAAE,MAAM,CAAA;IACZ,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,eAAe,CAAC,EAAE,MAAM,CAAA;IACxB,SAAS,EAAE,OAAO,CAAA;IAClB,KAAK,CAAC,EAAE,MAAM,GAAG,MAAM,CAAA;IACvB,QAAQ,CAAC,EAAE,MAAM,GAAG,MAAM,CAAA;IAC1B,SAAS,CAAC,EAAE,IAAI,CAAC,SAAS,CAAC,CAAC,WAAW,CAAC,CAAA;CACzC;AAED,MAAM,WAAW,kBAAmB,SAAQ,uBAAuB;IACjE;;OAEG;IACH,IAAI,EAAE,MAAM,GAAG,IAAI,CAAA;CACpB;AAED,MAAM,WAAW,wBAAwB;IACvC,MAAM,EAAE,OAAO,CAAA;IACf,MAAM,EAAE,cAAc,CAAA;IACtB,WAAW,EAAE,WAAW,GAAG,IAAI,CAAA;IAC/B,cAAc,EAAE,CAAC,IAAI,EAAE,WAAW,GAAG,IAAI,KAAK,IAAI,CAAA;IAClD,qBAAqB,CAAC,EAAE;QAAE,SAAS,EAAE,MAAM,CAAA;KAAE,CAAA;CAC9C;AAED,MAAM,WAAW,gBAAgB;IAC/B,QAAQ,EAAE,iBAAiB,CAAA;IAC3B,iBAAiB,EAAE,OAAO,CAAA;IAC1B,OAAO,EAAE,oBAAoB,CAAA;IAC7B,OAAO,EAAE,oBAAoB,CAAA;IAC7B,WAAW,EAAE,kBAAkB,CAAA;IAC/B,YAAY,EAAE,wBAAwB,CAAA;IACtC,WAAW,EAAE,uBAAuB,CAAA;IACpC,oBAAoB,EAAE,OAAO,CAAA;IAC7B,gBAAgB,EAAE,OAAO,CAAA;CAC1B;AAKD,eAAO,MAAM,UAAU,GACrB,UAAS,iBAAsB,KAC9B,gBAqGF,CAAA"}
1
+ {"version":3,"file":"useTourHud.d.ts","sourceRoot":"","sources":["../../src/hooks/useTourHud.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,uBAAuB,EAAE,IAAI,EAAE,MAAM,kBAAkB,CAAA;AACrE,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,OAAO,CAAA;AAMtC,OAAO,KAAK,EAAE,uBAAuB,EAAE,MAAM,qBAAqB,CAAA;AAElE,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,mBAAmB,CAAA;AAE/D,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,eAAe,CAAA;AAEtD,OAAO,KAAK,EAAE,uBAAuB,EAAE,MAAM,qBAAqB,CAAA;AAElE,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,iBAAiB,CAAA;AAErD,MAAM,WAAW,iBAAiB;IAChC,cAAc,CAAC,EAAE,MAAM,CAAA;IACvB,aAAa,CAAC,EAAE,MAAM,CAAA;IACtB;;;OAGG;IACH,SAAS,CAAC,EAAE,OAAO,GAAG,sBAAsB,CAAA;IAC5C;;;OAGG;IACH,cAAc,CAAC,EAAE,OAAO,CAAA;IACxB;;;;OAIG;IACH,qBAAqB,CAAC,EAAE,MAAM,CAAA;CAC/B;AAED,MAAM,WAAW,oBAAoB;IACnC,OAAO,CAAC,EAAE,MAAM,CAAA;IAChB,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,eAAe,EAAE,uBAAuB,CAAA;CACzC;AAED,MAAM,WAAW,oBAAoB;IACnC,MAAM,EAAE,MAAM,CAAA;IACd,IAAI,EAAE,MAAM,CAAA;IACZ,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,eAAe,CAAC,EAAE,MAAM,CAAA;IACxB,SAAS,EAAE,OAAO,CAAA;IAClB,KAAK,CAAC,EAAE,MAAM,GAAG,MAAM,CAAA;IACvB,QAAQ,CAAC,EAAE,MAAM,GAAG,MAAM,CAAA;IAC1B,SAAS,CAAC,EAAE,IAAI,CAAC,SAAS,CAAC,CAAC,WAAW,CAAC,CAAA;CACzC;AAED,MAAM,WAAW,kBAAmB,SAAQ,uBAAuB;IACjE;;OAEG;IACH,IAAI,EAAE,MAAM,GAAG,IAAI,CAAA;CACpB;AAED,MAAM,WAAW,wBAAwB;IACvC,MAAM,EAAE,OAAO,CAAA;IACf,MAAM,EAAE,cAAc,CAAA;IACtB,WAAW,EAAE,WAAW,GAAG,IAAI,CAAA;IAC/B,cAAc,EAAE,CAAC,IAAI,EAAE,WAAW,GAAG,IAAI,KAAK,IAAI,CAAA;IAClD,qBAAqB,CAAC,EAAE;QAAE,SAAS,EAAE,MAAM,CAAA;KAAE,CAAA;CAC9C;AAED,MAAM,WAAW,gBAAgB;IAC/B,QAAQ,EAAE,iBAAiB,CAAA;IAC3B,iBAAiB,EAAE,OAAO,CAAA;IAC1B,OAAO,EAAE,oBAAoB,CAAA;IAC7B,OAAO,EAAE,oBAAoB,CAAA;IAC7B,WAAW,EAAE,kBAAkB,CAAA;IAC/B,YAAY,EAAE,wBAAwB,CAAA;IACtC,WAAW,EAAE,uBAAuB,CAAA;IACpC,oBAAoB,EAAE,OAAO,CAAA;IAC7B,gBAAgB,EAAE,OAAO,CAAA;IACzB,+EAA+E;IAC/E,yBAAyB,EAAE,OAAO,CAAA;CACnC;AAKD,eAAO,MAAM,UAAU,GACrB,UAAS,iBAAsB,KAC9B,gBAyGF,CAAA"}
package/dist/index.cjs CHANGED
@@ -15,7 +15,7 @@ require('./chunk-HPVLOLCD.cjs');
15
15
 
16
16
 
17
17
 
18
- var _chunkD5LQLRSUcjs = require('./chunk-D5LQLRSU.cjs');
18
+ var _chunk7SAJNRGZcjs = require('./chunk-7SAJNRGZ.cjs');
19
19
 
20
20
  // src/context.tsx
21
21
 
@@ -433,7 +433,7 @@ var TourProvider = ({
433
433
  if (!definition) {
434
434
  throw new Error(`Flow with id "${flowId}" is not registered.`);
435
435
  }
436
- if (!storageAdapter && !fallbackStorageRef.current && _chunkD5LQLRSUcjs.isBrowser) {
436
+ if (!storageAdapter && !fallbackStorageRef.current && _chunk7SAJNRGZcjs.isBrowser) {
437
437
  fallbackStorageRef.current = _core.createLocalStorageAdapter.call(void 0, );
438
438
  }
439
439
  const resolvedStorageAdapter2 = storageAdapter ? storageAdapter : fallbackStorageRef.current;
@@ -589,7 +589,7 @@ var TourProvider = ({
589
589
  setEligibleFlows([]);
590
590
  return;
591
591
  }
592
- if (!storageAdapter && !fallbackStorageRef.current && _chunkD5LQLRSUcjs.isBrowser) {
592
+ if (!storageAdapter && !fallbackStorageRef.current && _chunk7SAJNRGZcjs.isBrowser) {
593
593
  fallbackStorageRef.current = _core.createLocalStorageAdapter.call(void 0, );
594
594
  }
595
595
  const resolvedStorageAdapter2 = _nullishCoalesce(storageAdapter, () => ( fallbackStorageRef.current));
@@ -656,7 +656,7 @@ var TourProvider = ({
656
656
  const findMatchingFlow = (path) => {
657
657
  for (const { flow, stepIndex } of eligibleFlows) {
658
658
  const step = flow.steps[stepIndex];
659
- if (!step.route || _chunkD5LQLRSUcjs.matchRoute.call(void 0, { pattern: step.route, path })) {
659
+ if (!step.route || _chunk7SAJNRGZcjs.matchRoute.call(void 0, { pattern: step.route, path })) {
660
660
  return flow;
661
661
  }
662
662
  }
@@ -670,9 +670,9 @@ var TourProvider = ({
670
670
  startFlow(flow.id, { resume: true });
671
671
  }
672
672
  };
673
- const currentPath = _chunkD5LQLRSUcjs.getCurrentRoutePath.call(void 0, );
673
+ const currentPath = _chunk7SAJNRGZcjs.getCurrentRoutePath.call(void 0, );
674
674
  tryStart(currentPath);
675
- const unsubscribe = _chunkD5LQLRSUcjs.subscribeToRouteChanges.call(void 0, (path) => {
675
+ const unsubscribe = _chunk7SAJNRGZcjs.subscribeToRouteChanges.call(void 0, (path) => {
676
676
  tryStart(path);
677
677
  });
678
678
  return () => {
@@ -716,8 +716,12 @@ var TourProvider = ({
716
716
  [getActiveStore]
717
717
  );
718
718
  const advanceStep = _react.useCallback.call(void 0,
719
- (stepId) => getActiveStore().advanceStep(stepId),
720
- [getActiveStore]
719
+ (stepId) => {
720
+ const store = storeRef.current;
721
+ if (!store) return null;
722
+ return store.advanceStep(stepId);
723
+ },
724
+ []
721
725
  );
722
726
  const toggleDebug = _react.useCallback.call(void 0, () => {
723
727
  setDebugEnabled((previous) => !previous);
@@ -1133,7 +1137,7 @@ var computeRectSource = (rect, storedRect, isScreen) => {
1133
1137
  return "none";
1134
1138
  };
1135
1139
  var computeVisibilityState = (element, rect, isScreen) => {
1136
- if (!_chunkD5LQLRSUcjs.isBrowser) return "unknown";
1140
+ if (!_chunk7SAJNRGZcjs.isBrowser) return "unknown";
1137
1141
  if (isScreen) return "visible";
1138
1142
  if (!element) return "missing";
1139
1143
  if (!document.documentElement.contains(element)) return "detached";
@@ -1149,7 +1153,7 @@ var computeVisibilityState = (element, rect, isScreen) => {
1149
1153
  return "visible";
1150
1154
  };
1151
1155
  var scrollContainerBy = (container, topDelta, leftDelta, behavior) => {
1152
- if (!_chunkD5LQLRSUcjs.isBrowser) return;
1156
+ if (!_chunk7SAJNRGZcjs.isBrowser) return;
1153
1157
  if (Math.abs(topDelta) < 0.5 && Math.abs(leftDelta) < 0.5) {
1154
1158
  return;
1155
1159
  }
@@ -1176,8 +1180,8 @@ var scrollContainerBy = (container, topDelta, leftDelta, behavior) => {
1176
1180
  };
1177
1181
  var alignWithinViewport = (element, margin, behavior, mode) => {
1178
1182
  if (mode === "preserve") return;
1179
- const viewportRect = _chunkD5LQLRSUcjs.getViewportRect.call(void 0, );
1180
- const finalRect = _chunkD5LQLRSUcjs.getClientRect.call(void 0, element);
1183
+ const viewportRect = _chunk7SAJNRGZcjs.getViewportRect.call(void 0, );
1184
+ const finalRect = _chunk7SAJNRGZcjs.getClientRect.call(void 0, element);
1181
1185
  const availableHeight = viewportRect.height - (margin.top + margin.bottom);
1182
1186
  if (availableHeight <= 0) return;
1183
1187
  const desiredTop = mode === "center" ? margin.top + (availableHeight - finalRect.height) / 2 : margin.top;
@@ -1191,15 +1195,15 @@ var alignWithinViewport = (element, margin, behavior, mode) => {
1191
1195
  var ensureElementInView = (element, margin, options) => {
1192
1196
  const behavior = _nullishCoalesce(_optionalChain([options, 'optionalAccess', _37 => _37.behavior]), () => ( "auto"));
1193
1197
  const mode = _nullishCoalesce(_optionalChain([options, 'optionalAccess', _38 => _38.mode]), () => ( "preserve"));
1194
- if (!_chunkD5LQLRSUcjs.isBrowser) return;
1195
- const scrollParents = _chunkD5LQLRSUcjs.getScrollParents.call(void 0, element);
1198
+ if (!_chunk7SAJNRGZcjs.isBrowser) return;
1199
+ const scrollParents = _chunk7SAJNRGZcjs.getScrollParents.call(void 0, element);
1196
1200
  const rootScroller = document.scrollingElement;
1197
1201
  if (rootScroller && !scrollParents.includes(rootScroller)) {
1198
1202
  scrollParents.push(rootScroller);
1199
1203
  }
1200
1204
  for (const container of scrollParents) {
1201
- const containerRect = container === rootScroller || container === document.body || container === document.documentElement ? _chunkD5LQLRSUcjs.getViewportRect.call(void 0, ) : _chunkD5LQLRSUcjs.getClientRect.call(void 0, container);
1202
- const targetRect = _chunkD5LQLRSUcjs.getClientRect.call(void 0, element);
1205
+ const containerRect = container === rootScroller || container === document.body || container === document.documentElement ? _chunk7SAJNRGZcjs.getViewportRect.call(void 0, ) : _chunk7SAJNRGZcjs.getClientRect.call(void 0, container);
1206
+ const targetRect = _chunk7SAJNRGZcjs.getClientRect.call(void 0, element);
1203
1207
  let topDelta = 0;
1204
1208
  if (targetRect.top < containerRect.top + margin.top) {
1205
1209
  topDelta = targetRect.top - (containerRect.top + margin.top);
@@ -1216,8 +1220,8 @@ var ensureElementInView = (element, margin, options) => {
1216
1220
  scrollContainerBy(container, topDelta, leftDelta, behavior);
1217
1221
  }
1218
1222
  }
1219
- const viewportRect = _chunkD5LQLRSUcjs.getViewportRect.call(void 0, );
1220
- const finalRect = _chunkD5LQLRSUcjs.getClientRect.call(void 0, element);
1223
+ const viewportRect = _chunk7SAJNRGZcjs.getViewportRect.call(void 0, );
1224
+ const finalRect = _chunk7SAJNRGZcjs.getClientRect.call(void 0, element);
1221
1225
  let viewportTopDelta = 0;
1222
1226
  if (finalRect.top < viewportRect.top + margin.top) {
1223
1227
  viewportTopDelta = finalRect.top - (viewportRect.top + margin.top);
@@ -1240,7 +1244,7 @@ var ensureElementInView = (element, margin, options) => {
1240
1244
  alignWithinViewport(element, margin, behavior, mode);
1241
1245
  };
1242
1246
  var resolveStepTarget = (target) => {
1243
- if (!_chunkD5LQLRSUcjs.isBrowser) return null;
1247
+ if (!_chunk7SAJNRGZcjs.isBrowser) return null;
1244
1248
  if (target === "screen") {
1245
1249
  return document.body;
1246
1250
  }
@@ -1271,7 +1275,7 @@ var useTourTarget = () => {
1271
1275
  const lastRectRef = _react.useRef.call(void 0, null);
1272
1276
  const initialScrollStepRef = _react.useRef.call(void 0, null);
1273
1277
  const cancelAutoScrollLoop = () => {
1274
- if (!_chunkD5LQLRSUcjs.isBrowser) return;
1278
+ if (!_chunk7SAJNRGZcjs.isBrowser) return;
1275
1279
  if (autoScrollTimeoutRef.current !== null) {
1276
1280
  globalThis.clearTimeout(autoScrollTimeoutRef.current);
1277
1281
  autoScrollTimeoutRef.current = null;
@@ -1290,7 +1294,7 @@ var useTourTarget = () => {
1290
1294
  };
1291
1295
  }, [_optionalChain([activeStep, 'optionalAccess', _39 => _39.id])]);
1292
1296
  _react.useLayoutEffect.call(void 0, () => {
1293
- if (!_chunkD5LQLRSUcjs.isBrowser) return;
1297
+ if (!_chunk7SAJNRGZcjs.isBrowser) return;
1294
1298
  if (!activeStep) return;
1295
1299
  if (targetInfo.status !== "ready") return;
1296
1300
  if (targetInfo.isScreen) return;
@@ -1334,7 +1338,7 @@ var useTourTarget = () => {
1334
1338
  cancelAutoScrollLoop();
1335
1339
  return;
1336
1340
  }
1337
- if (!_chunkD5LQLRSUcjs.isBrowser) {
1341
+ if (!_chunk7SAJNRGZcjs.isBrowser) {
1338
1342
  const storedRect = _nullishCoalesce(lastResolvedRectByStep.get(activeStep.id), () => ( null));
1339
1343
  setTargetInfo({
1340
1344
  element: null,
@@ -1422,7 +1426,7 @@ var useTourTarget = () => {
1422
1426
  };
1423
1427
  function updateTargetState(status, rectOverride) {
1424
1428
  if (cancelled) return;
1425
- const rect = typeof rectOverride !== "undefined" ? rectOverride : isScreen ? _chunkD5LQLRSUcjs.getViewportRect.call(void 0, ) : element ? _chunkD5LQLRSUcjs.getClientRect.call(void 0, element) : null;
1429
+ const rect = typeof rectOverride !== "undefined" ? rectOverride : isScreen ? _chunk7SAJNRGZcjs.getViewportRect.call(void 0, ) : element ? _chunk7SAJNRGZcjs.getClientRect.call(void 0, element) : null;
1426
1430
  if (status === "ready" && hasWaitForSelector && waitForStartedAt === null) {
1427
1431
  waitForStartedAt = Date.now();
1428
1432
  }
@@ -1490,14 +1494,14 @@ var useTourTarget = () => {
1490
1494
  }
1491
1495
  }
1492
1496
  function startRafMonitor() {
1493
- if (isScreen || !_chunkD5LQLRSUcjs.isBrowser) return;
1497
+ if (isScreen || !_chunk7SAJNRGZcjs.isBrowser) return;
1494
1498
  stopRaf();
1495
1499
  const tick = () => {
1496
1500
  if (cancelled) return;
1497
1501
  if (!element) {
1498
1502
  updateTargetState("resolving", null);
1499
1503
  } else {
1500
- const rect = _chunkD5LQLRSUcjs.getClientRect.call(void 0, element);
1504
+ const rect = _chunk7SAJNRGZcjs.getClientRect.call(void 0, element);
1501
1505
  if (rectChanged(rect)) {
1502
1506
  updateTargetState("ready", rect);
1503
1507
  }
@@ -1562,7 +1566,7 @@ var useTourTarget = () => {
1562
1566
  window.removeEventListener("scroll", onReposition, true);
1563
1567
  });
1564
1568
  const onAncestorScroll = () => commitInfo("ready");
1565
- scrollParents = _chunkD5LQLRSUcjs.getScrollParents.call(void 0, element);
1569
+ scrollParents = _chunk7SAJNRGZcjs.getScrollParents.call(void 0, element);
1566
1570
  if (scrollParents.length > 0) {
1567
1571
  scrollParents.forEach(
1568
1572
  (parent) => parent.addEventListener("scroll", onAncestorScroll, {
@@ -1645,7 +1649,7 @@ var useTourTarget = () => {
1645
1649
  };
1646
1650
  }, [activeStep, activeFlowId, flows, state]);
1647
1651
  _react.useEffect.call(void 0, () => {
1648
- if (!_chunkD5LQLRSUcjs.isBrowser) return;
1652
+ if (!_chunk7SAJNRGZcjs.isBrowser) return;
1649
1653
  if (!activeStep) {
1650
1654
  cancelAutoScrollLoop();
1651
1655
  return;
@@ -1678,11 +1682,11 @@ var useTourTarget = () => {
1678
1682
  const scrollMode = _nullishCoalesce(_optionalChain([activeStep, 'access', _65 => _65.targetBehavior, 'optionalAccess', _66 => _66.scrollMode]), () => ( "center"));
1679
1683
  const runCheck = () => {
1680
1684
  autoScrollRafRef.current = null;
1681
- if (!_chunkD5LQLRSUcjs.isBrowser) return;
1685
+ if (!_chunk7SAJNRGZcjs.isBrowser) return;
1682
1686
  if (autoState.stepId !== activeStep.id) return;
1683
1687
  if (!element.isConnected) return;
1684
- const rect = _chunkD5LQLRSUcjs.getClientRect.call(void 0, element);
1685
- const viewport = _chunkD5LQLRSUcjs.getViewportRect.call(void 0, );
1688
+ const rect = _chunk7SAJNRGZcjs.getClientRect.call(void 0, element);
1689
+ const viewport = _chunk7SAJNRGZcjs.getViewportRect.call(void 0, );
1686
1690
  const margin = resolveScrollMargin(
1687
1691
  _optionalChain([activeStep, 'access', _67 => _67.targetBehavior, 'optionalAccess', _68 => _68.scrollMargin]),
1688
1692
  DEFAULT_SCROLL_MARGIN
@@ -1734,7 +1738,7 @@ var isListenerTarget = (value) => {
1734
1738
  return !!value && typeof value.addEventListener === "function" && typeof value.removeEventListener === "function";
1735
1739
  };
1736
1740
  var resolveEventTarget = (rule, target) => {
1737
- if (!_chunkD5LQLRSUcjs.isBrowser) return null;
1741
+ if (!_chunk7SAJNRGZcjs.isBrowser) return null;
1738
1742
  if (!rule.on || rule.on === "target") {
1739
1743
  return _nullishCoalesce(target.element, () => ( null));
1740
1744
  }
@@ -1768,7 +1772,7 @@ var useAdvanceRules = (target) => {
1768
1772
  setDelayInfo
1769
1773
  } = useTour();
1770
1774
  _react.useEffect.call(void 0, () => {
1771
- if (!_chunkD5LQLRSUcjs.isBrowser) return;
1775
+ if (!_chunk7SAJNRGZcjs.isBrowser) return;
1772
1776
  if (!state || state.status !== "running") return;
1773
1777
  if (!activeStep) return;
1774
1778
  const definition = activeFlowId ? flows.get(activeFlowId) : void 0;
@@ -1901,12 +1905,12 @@ var useAdvanceRules = (target) => {
1901
1905
  finish();
1902
1906
  }
1903
1907
  };
1904
- const initialPath = _chunkD5LQLRSUcjs.getCurrentRoutePath.call(void 0, );
1908
+ const initialPath = _chunk7SAJNRGZcjs.getCurrentRoutePath.call(void 0, );
1905
1909
  checkRoute(initialPath);
1906
1910
  if (hasResolved()) {
1907
1911
  break;
1908
1912
  }
1909
- const unsubscribe = _chunkD5LQLRSUcjs.subscribeToRouteChanges.call(void 0, (path) => {
1913
+ const unsubscribe = _chunk7SAJNRGZcjs.subscribeToRouteChanges.call(void 0, (path) => {
1910
1914
  checkRoute(path);
1911
1915
  });
1912
1916
  addCleanup(unsubscribe);
@@ -1983,7 +1987,7 @@ var useHiddenTargetFallback = ({
1983
1987
  };
1984
1988
  }, [_optionalChain([step, 'optionalAccess', _76 => _76.id])]);
1985
1989
  _react.useEffect.call(void 0, () => {
1986
- if (!_chunkD5LQLRSUcjs.isBrowser) return void 0;
1990
+ if (!_chunk7SAJNRGZcjs.isBrowser) return void 0;
1987
1991
  if (!step) return void 0;
1988
1992
  clearPendingTimeout();
1989
1993
  clearGraceTimeout();
@@ -2063,14 +2067,14 @@ var useHiddenTargetFallback = ({
2063
2067
  // src/hooks/useRouteMismatch.ts
2064
2068
 
2065
2069
  var useRouteMismatch = (step) => {
2066
- const [currentPath, setCurrentPath] = _react.useState.call(void 0, () => _chunkD5LQLRSUcjs.getCurrentRoutePath.call(void 0, ));
2070
+ const [currentPath, setCurrentPath] = _react.useState.call(void 0, () => _chunk7SAJNRGZcjs.getCurrentRoutePath.call(void 0, ));
2067
2071
  _react.useEffect.call(void 0, () => {
2068
- return _chunkD5LQLRSUcjs.subscribeToRouteChanges.call(void 0, (path) => {
2072
+ return _chunk7SAJNRGZcjs.subscribeToRouteChanges.call(void 0, (path) => {
2069
2073
  setCurrentPath(path);
2070
2074
  });
2071
2075
  }, []);
2072
2076
  const expectedRoute = _optionalChain([step, 'optionalAccess', _77 => _77.route]);
2073
- const isRouteMismatch = step !== null && expectedRoute !== void 0 && !_chunkD5LQLRSUcjs.matchRoute.call(void 0, { pattern: expectedRoute, path: currentPath });
2077
+ const isRouteMismatch = step !== null && expectedRoute !== void 0 && !_chunk7SAJNRGZcjs.matchRoute.call(void 0, { pattern: expectedRoute, path: currentPath });
2074
2078
  return {
2075
2079
  isRouteMismatch,
2076
2080
  currentPath,
@@ -2082,14 +2086,14 @@ var useRouteMismatch = (step) => {
2082
2086
 
2083
2087
  var useViewportRect = () => {
2084
2088
  const [viewport, setViewport] = _react.useState.call(void 0,
2085
- () => _chunkD5LQLRSUcjs.getViewportRect.call(void 0, )
2089
+ () => _chunk7SAJNRGZcjs.getViewportRect.call(void 0, )
2086
2090
  );
2087
2091
  const rafRef = _react.useRef.call(void 0, null);
2088
2092
  _react.useEffect.call(void 0, () => {
2089
- if (!_chunkD5LQLRSUcjs.isBrowser) return;
2093
+ if (!_chunk7SAJNRGZcjs.isBrowser) return;
2090
2094
  const updateViewport = () => {
2091
2095
  rafRef.current = null;
2092
- setViewport(_chunkD5LQLRSUcjs.getViewportRect.call(void 0, ));
2096
+ setViewport(_chunk7SAJNRGZcjs.getViewportRect.call(void 0, ));
2093
2097
  };
2094
2098
  const scheduleUpdate = () => {
2095
2099
  if (rafRef.current !== null) return;
@@ -2395,7 +2399,7 @@ var useHudShortcuts = (target, options) => {
2395
2399
  const { state } = useTour();
2396
2400
  const { cancel, canGoBack, goBack, canGoNext, goNext, isActive } = useTourControls();
2397
2401
  _react.useEffect.call(void 0, () => {
2398
- if (!_chunkD5LQLRSUcjs.isBrowser) return void 0;
2402
+ if (!_chunk7SAJNRGZcjs.isBrowser) return void 0;
2399
2403
  if (!enabled) return void 0;
2400
2404
  if (!target) return void 0;
2401
2405
  if (!state || state.status !== "running") return void 0;
@@ -2465,7 +2469,7 @@ var useHudShortcuts = (target, options) => {
2465
2469
  var lockCount = 0;
2466
2470
  var previousOverflow = null;
2467
2471
  var acquireHardLock = () => {
2468
- if (!_chunkD5LQLRSUcjs.isBrowser) return;
2472
+ if (!_chunk7SAJNRGZcjs.isBrowser) return;
2469
2473
  if (lockCount === 0) {
2470
2474
  previousOverflow = document.body.style.overflow;
2471
2475
  document.body.style.overflow = "hidden";
@@ -2473,7 +2477,7 @@ var acquireHardLock = () => {
2473
2477
  lockCount += 1;
2474
2478
  };
2475
2479
  var releaseHardLock = () => {
2476
- if (!_chunkD5LQLRSUcjs.isBrowser) return;
2480
+ if (!_chunk7SAJNRGZcjs.isBrowser) return;
2477
2481
  if (lockCount === 0) return;
2478
2482
  lockCount -= 1;
2479
2483
  if (lockCount === 0) {
@@ -2485,14 +2489,19 @@ var useConstrainedScrollLock = ({
2485
2489
  enabled,
2486
2490
  targetRect,
2487
2491
  viewportHeight,
2488
- padding = 0
2492
+ padding = 0,
2493
+ bottomInset = 0
2489
2494
  }) => {
2490
2495
  const isConstrainedModeRef = _react.useRef.call(void 0, false);
2491
2496
  const boundsRef = _react.useRef.call(void 0, { minY: 0, maxY: 0 });
2497
+ const targetHeight = targetRect ? targetRect.height + padding * 2 : 0;
2498
+ const effectiveViewportHeight = viewportHeight - bottomInset;
2499
+ const isConstrainedMode = enabled && Boolean(targetRect) && targetHeight > effectiveViewportHeight;
2492
2500
  _react.useEffect.call(void 0, () => {
2493
- if (!enabled || !_chunkD5LQLRSUcjs.isBrowser) return;
2494
- const targetHeight = targetRect ? targetRect.height + padding * 2 : 0;
2495
- const targetExceedsViewport = targetRect && targetHeight > viewportHeight;
2501
+ if (!enabled || !_chunk7SAJNRGZcjs.isBrowser) return;
2502
+ const targetHeight2 = targetRect ? targetRect.height + padding * 2 : 0;
2503
+ const effectiveViewportHeight2 = viewportHeight - bottomInset;
2504
+ const targetExceedsViewport = targetRect && targetHeight2 > effectiveViewportHeight2;
2496
2505
  if (!targetExceedsViewport) {
2497
2506
  acquireHardLock();
2498
2507
  isConstrainedModeRef.current = false;
@@ -2505,7 +2514,7 @@ var useConstrainedScrollLock = ({
2505
2514
  const targetBottom = targetRect.bottom + padding;
2506
2515
  const currentScroll = window.scrollY;
2507
2516
  const minY = currentScroll + targetTop;
2508
- const maxY = currentScroll + targetBottom - viewportHeight;
2517
+ const maxY = currentScroll + targetBottom - effectiveViewportHeight2;
2509
2518
  boundsRef.current = {
2510
2519
  minY: Math.max(0, minY),
2511
2520
  maxY: Math.max(0, maxY)
@@ -2525,7 +2534,8 @@ var useConstrainedScrollLock = ({
2525
2534
  window.removeEventListener("scroll", handleScroll);
2526
2535
  isConstrainedModeRef.current = false;
2527
2536
  };
2528
- }, [enabled, targetRect, viewportHeight, padding]);
2537
+ }, [enabled, targetRect, viewportHeight, padding, bottomInset]);
2538
+ return { isConstrainedMode };
2529
2539
  };
2530
2540
 
2531
2541
  // src/hooks/useHudTargetIssue.ts
@@ -2572,7 +2582,7 @@ var useHudTargetIssue = (target, options) => {
2572
2582
  setArmed(false);
2573
2583
  return;
2574
2584
  }
2575
- if (!_chunkD5LQLRSUcjs.isBrowser) {
2585
+ if (!_chunk7SAJNRGZcjs.isBrowser) {
2576
2586
  setArmed(true);
2577
2587
  return;
2578
2588
  }
@@ -2595,7 +2605,8 @@ var useTourHud = (options = {}) => {
2595
2605
  const {
2596
2606
  overlayPadding,
2597
2607
  overlayRadius,
2598
- bodyScrollLock = DEFAULT_BODY_SCROLL_LOCK
2608
+ bodyScrollLock = DEFAULT_BODY_SCROLL_LOCK,
2609
+ scrollLockBottomInset
2599
2610
  } = options;
2600
2611
  const shortcuts = _nullishCoalesce(options.shortcuts, () => ( DEFAULT_SHORTCUTS));
2601
2612
  const { backdropInteraction, lockBodyScroll } = useTour();
@@ -2612,11 +2623,12 @@ var useTourHud = (options = {}) => {
2612
2623
  const shouldLockBodyScroll = Boolean(
2613
2624
  bodyScrollLock && (_nullishCoalesce(_optionalChain([hudState, 'access', _101 => _101.flowHudOptions, 'optionalAccess', _102 => _102.behavior, 'optionalAccess', _103 => _103.lockBodyScroll]), () => ( lockBodyScroll))) && hudState.focusTrapActive
2614
2625
  );
2615
- useConstrainedScrollLock({
2626
+ const { isConstrainedMode: isConstrainedScrollActive } = useConstrainedScrollLock({
2616
2627
  enabled: shouldLockBodyScroll,
2617
2628
  targetRect: hudState.hudTarget.rect,
2618
2629
  viewportHeight: viewport.height,
2619
- padding: _nullishCoalesce(overlayPadding, () => ( 12))
2630
+ padding: _nullishCoalesce(overlayPadding, () => ( 12)),
2631
+ bottomInset: scrollLockBottomInset
2620
2632
  });
2621
2633
  const shortcutOptions = typeof shortcuts === "object" ? shortcuts : {};
2622
2634
  const shortcutsEnabled = Boolean(
@@ -2674,7 +2686,8 @@ var useTourHud = (options = {}) => {
2674
2686
  focusManager,
2675
2687
  targetIssue,
2676
2688
  shouldLockBodyScroll,
2677
- shortcutsEnabled
2689
+ shortcutsEnabled,
2690
+ isConstrainedScrollActive
2678
2691
  };
2679
2692
  };
2680
2693
 
@@ -2695,7 +2708,7 @@ var useTourOverlay = (options) => {
2695
2708
  const hasShownRef = _react.useRef.call(void 0, false);
2696
2709
  const lastReadyTargetRef = _react.useRef.call(void 0, null);
2697
2710
  _react.useEffect.call(void 0, () => {
2698
- if (!_chunkD5LQLRSUcjs.isBrowser) return;
2711
+ if (!_chunk7SAJNRGZcjs.isBrowser) return;
2699
2712
  if (target.status === "ready") {
2700
2713
  hasShownRef.current = true;
2701
2714
  lastReadyTargetRef.current = {
@@ -2709,12 +2722,12 @@ var useTourOverlay = (options) => {
2709
2722
  lastReadyTargetRef.current = null;
2710
2723
  }
2711
2724
  }, [target, isInGracePeriod]);
2712
- const viewport = _chunkD5LQLRSUcjs.getViewportRect.call(void 0, );
2725
+ const viewport = _chunk7SAJNRGZcjs.getViewportRect.call(void 0, );
2713
2726
  const cachedTarget = lastReadyTargetRef.current;
2714
2727
  const highlightTarget = target.status === "ready" ? target : cachedTarget;
2715
2728
  const resolvedRect = _nullishCoalesce(_optionalChain([highlightTarget, 'optionalAccess', _122 => _122.rect]), () => ( target.rect));
2716
2729
  const resolvedIsScreen = _nullishCoalesce(_optionalChain([highlightTarget, 'optionalAccess', _123 => _123.isScreen]), () => ( target.isScreen));
2717
- const expandedRect = resolvedIsScreen || !resolvedRect ? viewport : _chunkD5LQLRSUcjs.expandRect.call(void 0, resolvedRect, padding);
2730
+ const expandedRect = resolvedIsScreen || !resolvedRect ? viewport : _chunk7SAJNRGZcjs.expandRect.call(void 0, resolvedRect, padding);
2718
2731
  const safeBuffer = Math.max(0, edgeBuffer);
2719
2732
  const insetTop = expandedRect.top <= 0 ? Math.min(safeBuffer, Math.max(0, expandedRect.height) / 2) : 0;
2720
2733
  const insetLeft = expandedRect.left <= 0 ? Math.min(safeBuffer, Math.max(0, expandedRect.width) / 2) : 0;
@@ -2744,7 +2757,7 @@ var useTourOverlay = (options) => {
2744
2757
  height: highlightHeight,
2745
2758
  radius: highlightRadius
2746
2759
  } : null;
2747
- const maskCapable = _react.useMemo.call(void 0, () => _chunkD5LQLRSUcjs.supportsMasking.call(void 0, ), []);
2760
+ const maskCapable = _react.useMemo.call(void 0, () => _chunk7SAJNRGZcjs.supportsMasking.call(void 0, ), []);
2748
2761
  const isActive = target.status === "ready" || target.status === "resolving" && cachedTarget !== null || isInGracePeriod;
2749
2762
  const shouldMask = maskCapable && isActive;
2750
2763
  const maskId = _react.useMemo.call(void 0,
@@ -3132,7 +3145,7 @@ var useDelayAdvance = () => {
3132
3145
  if (!delayInfo) return;
3133
3146
  if (!activeStep || activeStep.id !== delayInfo.stepId) return;
3134
3147
  if (!state || state.status !== "running") return;
3135
- if (!_chunkD5LQLRSUcjs.isBrowser) return;
3148
+ if (!_chunk7SAJNRGZcjs.isBrowser) return;
3136
3149
  let frameId = null;
3137
3150
  const tick = () => {
3138
3151
  setNow(getTimestamp());
@@ -3276,8 +3289,8 @@ var OverlayBackdrop = ({
3276
3289
  showInteractionBlocker = true,
3277
3290
  transitionsOverride
3278
3291
  }) => {
3279
- if (!_chunkD5LQLRSUcjs.isBrowser) return null;
3280
- const host = _chunkD5LQLRSUcjs.portalHost.call(void 0, );
3292
+ if (!_chunk7SAJNRGZcjs.isBrowser) return null;
3293
+ const host = _chunk7SAJNRGZcjs.portalHost.call(void 0, );
3281
3294
  if (!host) return null;
3282
3295
  const adapter = useAnimationAdapter();
3283
3296
  const {
@@ -3586,10 +3599,11 @@ var TourPopoverPortal = ({
3586
3599
  containerComponent,
3587
3600
  contentComponent,
3588
3601
  transitionsOverride,
3589
- isInGracePeriod = false
3602
+ isInGracePeriod = false,
3603
+ onHeightChange
3590
3604
  }) => {
3591
- if (!_chunkD5LQLRSUcjs.isBrowser) return null;
3592
- const host = _chunkD5LQLRSUcjs.portalHost.call(void 0, );
3605
+ if (!_chunk7SAJNRGZcjs.isBrowser) return null;
3606
+ const host = _chunk7SAJNRGZcjs.portalHost.call(void 0, );
3593
3607
  if (!host) return null;
3594
3608
  const adapter = useAnimationAdapter();
3595
3609
  const Container = _nullishCoalesce(containerComponent, () => ( adapter.components.MotionDiv));
@@ -3664,7 +3678,7 @@ var TourPopoverPortal = ({
3664
3678
  });
3665
3679
  const overflowRetryTimeoutRef = _react.useRef.call(void 0, null);
3666
3680
  _react.useLayoutEffect.call(void 0, () => {
3667
- if (!_chunkD5LQLRSUcjs.isBrowser) return;
3681
+ if (!_chunk7SAJNRGZcjs.isBrowser) return;
3668
3682
  const node = floatingRef.current;
3669
3683
  if (!node) return;
3670
3684
  const updateSize = () => {
@@ -3700,14 +3714,20 @@ var TourPopoverPortal = ({
3700
3714
  floatingPositionCache.set(cacheKey, floatingPosition);
3701
3715
  }
3702
3716
  }, [floatingPosition, target.isScreen, target.stepId]);
3703
- const dockedPosition = _react.useMemo.call(void 0,
3704
- () => ({
3717
+ const dockedPosition = _react.useMemo.call(void 0, () => {
3718
+ if (floatingSize) {
3719
+ return {
3720
+ top: viewport.height - DOCKED_MARGIN - floatingSize.height,
3721
+ left: viewport.width - DOCKED_MARGIN - floatingSize.width,
3722
+ transform: "translate3d(0px, 0px, 0px)"
3723
+ };
3724
+ }
3725
+ return {
3705
3726
  top: viewport.height - DOCKED_MARGIN,
3706
3727
  left: viewport.width - DOCKED_MARGIN,
3707
3728
  transform: "translate3d(-100%, -100%, 0px)"
3708
- }),
3709
- [viewport.height, viewport.width]
3710
- );
3729
+ };
3730
+ }, [viewport.height, viewport.width, floatingSize]);
3711
3731
  const mobilePosition = _react.useMemo.call(void 0,
3712
3732
  () => ({
3713
3733
  top: viewport.height - MOBILE_HORIZONTAL_GUTTER,
@@ -3721,6 +3741,10 @@ var TourPopoverPortal = ({
3721
3741
  setFloatingPosition(dockedPosition);
3722
3742
  }
3723
3743
  }, [dockedPosition, layoutMode]);
3744
+ _react.useEffect.call(void 0, () => {
3745
+ if (!onHeightChange) return;
3746
+ onHeightChange(floatingSize ? floatingSize.height + DOCKED_MARGIN : 0);
3747
+ }, [floatingSize, onHeightChange]);
3724
3748
  _react.useEffect.call(void 0, () => {
3725
3749
  if (layoutMode === "mobile") {
3726
3750
  setFloatingPosition(mobilePosition);
@@ -3818,7 +3842,7 @@ var TourPopoverPortal = ({
3818
3842
  };
3819
3843
  }, []);
3820
3844
  _react.useLayoutEffect.call(void 0, () => {
3821
- if (!_chunkD5LQLRSUcjs.isBrowser) return;
3845
+ if (!_chunk7SAJNRGZcjs.isBrowser) return;
3822
3846
  const floatingEl = floatingRef.current;
3823
3847
  const rectInfo = target.rect;
3824
3848
  if (!floatingEl) return;
@@ -3873,7 +3897,7 @@ var TourPopoverPortal = ({
3873
3897
  });
3874
3898
  if (cancelState.cancelled) return;
3875
3899
  const floatingBox = floatingEl.getBoundingClientRect();
3876
- const viewportRect = _chunkD5LQLRSUcjs.getViewportRect.call(void 0, );
3900
+ const viewportRect = _chunk7SAJNRGZcjs.getViewportRect.call(void 0, );
3877
3901
  const viewportTop = viewportRect.top;
3878
3902
  const viewportBottom = viewportRect.top + viewportRect.height;
3879
3903
  const viewportLeft = viewportRect.left;
@@ -3968,7 +3992,7 @@ var TourPopoverPortal = ({
3968
3992
  });
3969
3993
  }, [dragPosition, layoutMode]);
3970
3994
  const clampToViewport = (rawLeft, rawTop) => {
3971
- const rect = _chunkD5LQLRSUcjs.getViewportRect.call(void 0, );
3995
+ const rect = _chunk7SAJNRGZcjs.getViewportRect.call(void 0, );
3972
3996
  const floatingEl = floatingRef.current;
3973
3997
  const floatingElWidth = _nullishCoalesce(_optionalChain([floatingEl, 'optionalAccess', _161 => _161.offsetWidth]), () => ( 0));
3974
3998
  const floatingElHeight = _nullishCoalesce(_optionalChain([floatingEl, 'optionalAccess', _162 => _162.offsetHeight]), () => ( 0));
@@ -4235,7 +4259,7 @@ var TourFocusManager = ({
4235
4259
  }
4236
4260
  };
4237
4261
  _react.useLayoutEffect.call(void 0, () => {
4238
- if (!_chunkD5LQLRSUcjs.isBrowser) return;
4262
+ if (!_chunk7SAJNRGZcjs.isBrowser) return;
4239
4263
  if (!active) {
4240
4264
  restoreFocus();
4241
4265
  return;
@@ -4251,7 +4275,7 @@ var TourFocusManager = ({
4251
4275
  };
4252
4276
  }, [active, popoverNode, target.element]);
4253
4277
  _react.useEffect.call(void 0, () => {
4254
- if (!_chunkD5LQLRSUcjs.isBrowser) return;
4278
+ if (!_chunk7SAJNRGZcjs.isBrowser) return;
4255
4279
  if (!active) return;
4256
4280
  const doc = _nullishCoalesce(_nullishCoalesce(_optionalChain([popoverNode, 'optionalAccess', _167 => _167.ownerDocument]), () => ( _optionalChain([target, 'access', _168 => _168.element, 'optionalAccess', _169 => _169.ownerDocument]))), () => ( document));
4257
4281
  const createGuard = (key) => {
@@ -4451,8 +4475,8 @@ var TourFocusManager = ({
4451
4475
  setPopoverRect(null);
4452
4476
  }
4453
4477
  }, [popoverRingActive, popoverNode]);
4454
- if (!_chunkD5LQLRSUcjs.isBrowser) return null;
4455
- const host = _chunkD5LQLRSUcjs.portalHost.call(void 0, );
4478
+ if (!_chunk7SAJNRGZcjs.isBrowser) return null;
4479
+ const host = _chunk7SAJNRGZcjs.portalHost.call(void 0, );
4456
4480
  if (!host) return null;
4457
4481
  const boxShadow = _nullishCoalesce(_optionalChain([guardElementFocusRing, 'optionalAccess', _181 => _181.boxShadow]), () => ( DEFAULT_BOX_SHADOW));
4458
4482
  const showTargetRing = targetRingActive && highlightRect;
@@ -4549,7 +4573,7 @@ var useHudMotion = () => {
4549
4573
  var lockCount2 = 0;
4550
4574
  var previousOverflow2 = null;
4551
4575
  var acquireLock = () => {
4552
- if (!_chunkD5LQLRSUcjs.isBrowser) return;
4576
+ if (!_chunk7SAJNRGZcjs.isBrowser) return;
4553
4577
  if (lockCount2 === 0) {
4554
4578
  previousOverflow2 = document.body.style.overflow;
4555
4579
  document.body.style.overflow = "hidden";
@@ -4557,7 +4581,7 @@ var acquireLock = () => {
4557
4581
  lockCount2 += 1;
4558
4582
  };
4559
4583
  var releaseLock = () => {
4560
- if (!_chunkD5LQLRSUcjs.isBrowser) return;
4584
+ if (!_chunk7SAJNRGZcjs.isBrowser) return;
4561
4585
  if (lockCount2 === 0) return;
4562
4586
  lockCount2 -= 1;
4563
4587
  if (lockCount2 === 0) {
@@ -4615,4 +4639,4 @@ var useBodyScrollLock = (enabled) => {
4615
4639
 
4616
4640
 
4617
4641
 
4618
- exports.AnimationAdapterProvider = AnimationAdapterProvider; exports.DialogRegistryProvider = DialogRegistryProvider; exports.OverlayBackdrop = OverlayBackdrop; exports.TourFocusManager = TourFocusManager; exports.TourPopoverPortal = TourPopoverPortal; exports.TourProvider = TourProvider; exports.createPathString = _chunkD5LQLRSUcjs.createPathString; exports.createWaitForPredicateController = createWaitForPredicateController; exports.defaultAnimationAdapter = defaultAnimationAdapter; exports.defaultLabels = defaultLabels; exports.getCurrentRoutePath = _chunkD5LQLRSUcjs.getCurrentRoutePath; exports.notifyRouteChange = _chunkD5LQLRSUcjs.notifyRouteChange; exports.reducedMotionAnimationAdapter = reducedMotionAnimationAdapter; exports.subscribeToRouteChanges = _chunkD5LQLRSUcjs.subscribeToRouteChanges; exports.useAdvanceRules = useAdvanceRules; exports.useAnimationAdapter = useAnimationAdapter; exports.useBodyScrollLock = useBodyScrollLock; exports.useConstrainedScrollLock = useConstrainedScrollLock; exports.useDelayAdvance = useDelayAdvance; exports.useDialogRegistry = useDialogRegistry; exports.useDialogRegistryOptional = useDialogRegistryOptional; exports.useHiddenTargetFallback = useHiddenTargetFallback; exports.useHudDescription = useHudDescription; exports.useHudMotion = useHudMotion; exports.useHudShortcuts = useHudShortcuts; exports.useHudState = useHudState; exports.useHudTargetIssue = useHudTargetIssue; exports.usePreferredAnimationAdapter = usePreferredAnimationAdapter; exports.useRadixDialogAdapter = useRadixDialogAdapter; exports.useRadixTourDialog = useRadixTourDialog; exports.useTour = useTour; exports.useTourControls = useTourControls; exports.useTourEvents = useTourEvents; exports.useTourFocusDominance = useTourFocusDominance; exports.useTourHud = useTourHud; exports.useTourLabels = useTourLabels; exports.useTourOverlay = useTourOverlay; exports.useTourTarget = useTourTarget; exports.useViewportRect = useViewportRect; exports.waitForDom = waitForDom;
4642
+ exports.AnimationAdapterProvider = AnimationAdapterProvider; exports.DialogRegistryProvider = DialogRegistryProvider; exports.OverlayBackdrop = OverlayBackdrop; exports.TourFocusManager = TourFocusManager; exports.TourPopoverPortal = TourPopoverPortal; exports.TourProvider = TourProvider; exports.createPathString = _chunk7SAJNRGZcjs.createPathString; exports.createWaitForPredicateController = createWaitForPredicateController; exports.defaultAnimationAdapter = defaultAnimationAdapter; exports.defaultLabels = defaultLabels; exports.getCurrentRoutePath = _chunk7SAJNRGZcjs.getCurrentRoutePath; exports.notifyRouteChange = _chunk7SAJNRGZcjs.notifyRouteChange; exports.reducedMotionAnimationAdapter = reducedMotionAnimationAdapter; exports.subscribeToRouteChanges = _chunk7SAJNRGZcjs.subscribeToRouteChanges; exports.useAdvanceRules = useAdvanceRules; exports.useAnimationAdapter = useAnimationAdapter; exports.useBodyScrollLock = useBodyScrollLock; exports.useConstrainedScrollLock = useConstrainedScrollLock; exports.useDelayAdvance = useDelayAdvance; exports.useDialogRegistry = useDialogRegistry; exports.useDialogRegistryOptional = useDialogRegistryOptional; exports.useHiddenTargetFallback = useHiddenTargetFallback; exports.useHudDescription = useHudDescription; exports.useHudMotion = useHudMotion; exports.useHudShortcuts = useHudShortcuts; exports.useHudState = useHudState; exports.useHudTargetIssue = useHudTargetIssue; exports.usePreferredAnimationAdapter = usePreferredAnimationAdapter; exports.useRadixDialogAdapter = useRadixDialogAdapter; exports.useRadixTourDialog = useRadixTourDialog; exports.useTour = useTour; exports.useTourControls = useTourControls; exports.useTourEvents = useTourEvents; exports.useTourFocusDominance = useTourFocusDominance; exports.useTourHud = useTourHud; exports.useTourLabels = useTourLabels; exports.useTourOverlay = useTourOverlay; exports.useTourTarget = useTourTarget; exports.useViewportRect = useViewportRect; exports.waitForDom = waitForDom;
package/dist/index.mjs CHANGED
@@ -15,7 +15,7 @@ import {
15
15
  portalHost,
16
16
  subscribeToRouteChanges,
17
17
  supportsMasking
18
- } from "./chunk-B44EX7YT.mjs";
18
+ } from "./chunk-J2JMZXGD.mjs";
19
19
 
20
20
  // src/context.tsx
21
21
  import {
@@ -716,8 +716,12 @@ var TourProvider = ({
716
716
  [getActiveStore]
717
717
  );
718
718
  const advanceStep = useCallback2(
719
- (stepId) => getActiveStore().advanceStep(stepId),
720
- [getActiveStore]
719
+ (stepId) => {
720
+ const store = storeRef.current;
721
+ if (!store) return null;
722
+ return store.advanceStep(stepId);
723
+ },
724
+ []
721
725
  );
722
726
  const toggleDebug = useCallback2(() => {
723
727
  setDebugEnabled((previous) => !previous);
@@ -2485,14 +2489,19 @@ var useConstrainedScrollLock = ({
2485
2489
  enabled,
2486
2490
  targetRect,
2487
2491
  viewportHeight,
2488
- padding = 0
2492
+ padding = 0,
2493
+ bottomInset = 0
2489
2494
  }) => {
2490
2495
  const isConstrainedModeRef = useRef8(false);
2491
2496
  const boundsRef = useRef8({ minY: 0, maxY: 0 });
2497
+ const targetHeight = targetRect ? targetRect.height + padding * 2 : 0;
2498
+ const effectiveViewportHeight = viewportHeight - bottomInset;
2499
+ const isConstrainedMode = enabled && Boolean(targetRect) && targetHeight > effectiveViewportHeight;
2492
2500
  useEffect11(() => {
2493
2501
  if (!enabled || !isBrowser) return;
2494
- const targetHeight = targetRect ? targetRect.height + padding * 2 : 0;
2495
- const targetExceedsViewport = targetRect && targetHeight > viewportHeight;
2502
+ const targetHeight2 = targetRect ? targetRect.height + padding * 2 : 0;
2503
+ const effectiveViewportHeight2 = viewportHeight - bottomInset;
2504
+ const targetExceedsViewport = targetRect && targetHeight2 > effectiveViewportHeight2;
2496
2505
  if (!targetExceedsViewport) {
2497
2506
  acquireHardLock();
2498
2507
  isConstrainedModeRef.current = false;
@@ -2505,7 +2514,7 @@ var useConstrainedScrollLock = ({
2505
2514
  const targetBottom = targetRect.bottom + padding;
2506
2515
  const currentScroll = window.scrollY;
2507
2516
  const minY = currentScroll + targetTop;
2508
- const maxY = currentScroll + targetBottom - viewportHeight;
2517
+ const maxY = currentScroll + targetBottom - effectiveViewportHeight2;
2509
2518
  boundsRef.current = {
2510
2519
  minY: Math.max(0, minY),
2511
2520
  maxY: Math.max(0, maxY)
@@ -2525,7 +2534,8 @@ var useConstrainedScrollLock = ({
2525
2534
  window.removeEventListener("scroll", handleScroll);
2526
2535
  isConstrainedModeRef.current = false;
2527
2536
  };
2528
- }, [enabled, targetRect, viewportHeight, padding]);
2537
+ }, [enabled, targetRect, viewportHeight, padding, bottomInset]);
2538
+ return { isConstrainedMode };
2529
2539
  };
2530
2540
 
2531
2541
  // src/hooks/useHudTargetIssue.ts
@@ -2595,7 +2605,8 @@ var useTourHud = (options = {}) => {
2595
2605
  const {
2596
2606
  overlayPadding,
2597
2607
  overlayRadius,
2598
- bodyScrollLock = DEFAULT_BODY_SCROLL_LOCK
2608
+ bodyScrollLock = DEFAULT_BODY_SCROLL_LOCK,
2609
+ scrollLockBottomInset
2599
2610
  } = options;
2600
2611
  const shortcuts = options.shortcuts ?? DEFAULT_SHORTCUTS;
2601
2612
  const { backdropInteraction, lockBodyScroll } = useTour();
@@ -2612,11 +2623,12 @@ var useTourHud = (options = {}) => {
2612
2623
  const shouldLockBodyScroll = Boolean(
2613
2624
  bodyScrollLock && (hudState.flowHudOptions?.behavior?.lockBodyScroll ?? lockBodyScroll) && hudState.focusTrapActive
2614
2625
  );
2615
- useConstrainedScrollLock({
2626
+ const { isConstrainedMode: isConstrainedScrollActive } = useConstrainedScrollLock({
2616
2627
  enabled: shouldLockBodyScroll,
2617
2628
  targetRect: hudState.hudTarget.rect,
2618
2629
  viewportHeight: viewport.height,
2619
- padding: overlayPadding ?? 12
2630
+ padding: overlayPadding ?? 12,
2631
+ bottomInset: scrollLockBottomInset
2620
2632
  });
2621
2633
  const shortcutOptions = typeof shortcuts === "object" ? shortcuts : {};
2622
2634
  const shortcutsEnabled = Boolean(
@@ -2674,7 +2686,8 @@ var useTourHud = (options = {}) => {
2674
2686
  focusManager,
2675
2687
  targetIssue,
2676
2688
  shouldLockBodyScroll,
2677
- shortcutsEnabled
2689
+ shortcutsEnabled,
2690
+ isConstrainedScrollActive
2678
2691
  };
2679
2692
  };
2680
2693
 
@@ -3586,7 +3599,8 @@ var TourPopoverPortal = ({
3586
3599
  containerComponent,
3587
3600
  contentComponent,
3588
3601
  transitionsOverride,
3589
- isInGracePeriod = false
3602
+ isInGracePeriod = false,
3603
+ onHeightChange
3590
3604
  }) => {
3591
3605
  if (!isBrowser) return null;
3592
3606
  const host = portalHost();
@@ -3700,14 +3714,20 @@ var TourPopoverPortal = ({
3700
3714
  floatingPositionCache.set(cacheKey, floatingPosition);
3701
3715
  }
3702
3716
  }, [floatingPosition, target.isScreen, target.stepId]);
3703
- const dockedPosition = useMemo13(
3704
- () => ({
3717
+ const dockedPosition = useMemo13(() => {
3718
+ if (floatingSize) {
3719
+ return {
3720
+ top: viewport.height - DOCKED_MARGIN - floatingSize.height,
3721
+ left: viewport.width - DOCKED_MARGIN - floatingSize.width,
3722
+ transform: "translate3d(0px, 0px, 0px)"
3723
+ };
3724
+ }
3725
+ return {
3705
3726
  top: viewport.height - DOCKED_MARGIN,
3706
3727
  left: viewport.width - DOCKED_MARGIN,
3707
3728
  transform: "translate3d(-100%, -100%, 0px)"
3708
- }),
3709
- [viewport.height, viewport.width]
3710
- );
3729
+ };
3730
+ }, [viewport.height, viewport.width, floatingSize]);
3711
3731
  const mobilePosition = useMemo13(
3712
3732
  () => ({
3713
3733
  top: viewport.height - MOBILE_HORIZONTAL_GUTTER,
@@ -3721,6 +3741,10 @@ var TourPopoverPortal = ({
3721
3741
  setFloatingPosition(dockedPosition);
3722
3742
  }
3723
3743
  }, [dockedPosition, layoutMode]);
3744
+ useEffect17(() => {
3745
+ if (!onHeightChange) return;
3746
+ onHeightChange(floatingSize ? floatingSize.height + DOCKED_MARGIN : 0);
3747
+ }, [floatingSize, onHeightChange]);
3724
3748
  useEffect17(() => {
3725
3749
  if (layoutMode === "mobile") {
3726
3750
  setFloatingPosition(mobilePosition);
@@ -6,7 +6,7 @@
6
6
 
7
7
 
8
8
 
9
- var _chunkD5LQLRSUcjs = require('../chunk-D5LQLRSU.cjs');
9
+ var _chunk7SAJNRGZcjs = require('../chunk-7SAJNRGZ.cjs');
10
10
 
11
11
 
12
12
 
@@ -14,4 +14,4 @@ var _chunkD5LQLRSUcjs = require('../chunk-D5LQLRSU.cjs');
14
14
 
15
15
 
16
16
 
17
- exports.createPathString = _chunkD5LQLRSUcjs.createPathString; exports.getCurrentRoutePath = _chunkD5LQLRSUcjs.getCurrentRoutePath; exports.matchRoute = _chunkD5LQLRSUcjs.matchRoute; exports.notifyRouteChange = _chunkD5LQLRSUcjs.notifyRouteChange; exports.routeGatingChannel = _chunkD5LQLRSUcjs.routeGatingChannel; exports.subscribeToRouteChanges = _chunkD5LQLRSUcjs.subscribeToRouteChanges;
17
+ exports.createPathString = _chunk7SAJNRGZcjs.createPathString; exports.getCurrentRoutePath = _chunk7SAJNRGZcjs.getCurrentRoutePath; exports.matchRoute = _chunk7SAJNRGZcjs.matchRoute; exports.notifyRouteChange = _chunk7SAJNRGZcjs.notifyRouteChange; exports.routeGatingChannel = _chunk7SAJNRGZcjs.routeGatingChannel; exports.subscribeToRouteChanges = _chunk7SAJNRGZcjs.subscribeToRouteChanges;
@@ -6,7 +6,7 @@ import {
6
6
  notifyRouteChange,
7
7
  routeGatingChannel,
8
8
  subscribeToRouteChanges
9
- } from "../chunk-B44EX7YT.mjs";
9
+ } from "../chunk-J2JMZXGD.mjs";
10
10
  export {
11
11
  createPathString,
12
12
  getCurrentRoutePath,
@@ -1,7 +1,7 @@
1
1
  "use strict";Object.defineProperty(exports, "__esModule", {value: true}); function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) { newObj[key] = obj[key]; } } } newObj.default = obj; return newObj; } } function _nullishCoalesce(lhs, rhsFn) { if (lhs != null) { return lhs; } else { return rhsFn(); } } function _optionalChain(ops) { let lastAccessLHS = undefined; let value = ops[0]; let i = 1; while (i < ops.length) { const op = ops[i]; const fn = ops[i + 1]; i += 2; if ((op === 'optionalAccess' || op === 'optionalCall') && value == null) { return undefined; } if (op === 'access' || op === 'optionalAccess') { lastAccessLHS = value; value = fn(value); } else if (op === 'call' || op === 'optionalCall') { value = fn((...args) => value.call(lastAccessLHS, ...args)); lastAccessLHS = undefined; } } return value; }
2
2
 
3
3
 
4
- var _chunkD5LQLRSUcjs = require('../chunk-D5LQLRSU.cjs');
4
+ var _chunk7SAJNRGZcjs = require('../chunk-7SAJNRGZ.cjs');
5
5
 
6
6
  // src/router/nextAppRouterAdapter.tsx
7
7
  var _navigation = require('next/navigation'); var NextNavigation = _interopRequireWildcard(_navigation);
@@ -22,12 +22,12 @@ var useNextAppRouterTourAdapter = () => {
22
22
  const searchValue = _nullishCoalesce(_optionalChain([searchParams, 'optionalAccess', _ => _.toString, 'call', _2 => _2()]), () => ( ""));
23
23
  _react.useEffect.call(void 0, () => {
24
24
  if (typeof pathname !== "string") return;
25
- const path = _chunkD5LQLRSUcjs.createPathString.call(void 0,
25
+ const path = _chunk7SAJNRGZcjs.createPathString.call(void 0,
26
26
  pathname,
27
27
  searchValue.length > 0 ? `?${searchValue}` : "",
28
28
  void 0
29
29
  );
30
- _chunkD5LQLRSUcjs.notifyRouteChange.call(void 0, path);
30
+ _chunk7SAJNRGZcjs.notifyRouteChange.call(void 0, path);
31
31
  }, [pathname, searchValue]);
32
32
  };
33
33
 
@@ -1,7 +1,7 @@
1
1
  import {
2
2
  createPathString,
3
3
  notifyRouteChange
4
- } from "../chunk-B44EX7YT.mjs";
4
+ } from "../chunk-J2JMZXGD.mjs";
5
5
 
6
6
  // src/router/nextAppRouterAdapter.tsx
7
7
  import * as NextNavigation from "next/navigation";
@@ -1,7 +1,7 @@
1
1
  "use strict";Object.defineProperty(exports, "__esModule", {value: true}); function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) { newObj[key] = obj[key]; } } } newObj.default = obj; return newObj; } } function _nullishCoalesce(lhs, rhsFn) { if (lhs != null) { return lhs; } else { return rhsFn(); } }
2
2
 
3
3
 
4
- var _chunkD5LQLRSUcjs = require('../chunk-D5LQLRSU.cjs');
4
+ var _chunk7SAJNRGZcjs = require('../chunk-7SAJNRGZ.cjs');
5
5
 
6
6
  // src/router/nextPagesRouterAdapter.tsx
7
7
  var _router = require('next/router'); var NextRouter = _interopRequireWildcard(_router);
@@ -19,8 +19,8 @@ var useNextPagesRouterTourAdapter = () => {
19
19
  const router = useRouter2();
20
20
  const pathCandidate = typeof router.asPath === "string" && router.asPath.length > 0 ? router.asPath : router.pathname;
21
21
  _react.useEffect.call(void 0, () => {
22
- const path = typeof pathCandidate === "string" && pathCandidate.length > 0 ? pathCandidate : _chunkD5LQLRSUcjs.createPathString.call(void 0, _nullishCoalesce(router.pathname, () => ( "/")));
23
- _chunkD5LQLRSUcjs.notifyRouteChange.call(void 0, path);
22
+ const path = typeof pathCandidate === "string" && pathCandidate.length > 0 ? pathCandidate : _chunk7SAJNRGZcjs.createPathString.call(void 0, _nullishCoalesce(router.pathname, () => ( "/")));
23
+ _chunk7SAJNRGZcjs.notifyRouteChange.call(void 0, path);
24
24
  }, [pathCandidate, router.pathname]);
25
25
  };
26
26
 
@@ -1,7 +1,7 @@
1
1
  import {
2
2
  createPathString,
3
3
  notifyRouteChange
4
- } from "../chunk-B44EX7YT.mjs";
4
+ } from "../chunk-J2JMZXGD.mjs";
5
5
 
6
6
  // src/router/nextPagesRouterAdapter.tsx
7
7
  import * as NextRouter from "next/router";
@@ -1,7 +1,7 @@
1
1
  "use strict";Object.defineProperty(exports, "__esModule", {value: true}); function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) { newObj[key] = obj[key]; } } } newObj.default = obj; return newObj; } }
2
2
 
3
3
 
4
- var _chunkD5LQLRSUcjs = require('../chunk-D5LQLRSU.cjs');
4
+ var _chunk7SAJNRGZcjs = require('../chunk-7SAJNRGZ.cjs');
5
5
 
6
6
  // src/router/reactRouterAdapter.tsx
7
7
  var _react = require('react');
@@ -18,12 +18,12 @@ var useReactRouterTourAdapter = () => {
18
18
  }
19
19
  const location = useLocation2();
20
20
  _react.useEffect.call(void 0, () => {
21
- const path = _chunkD5LQLRSUcjs.createPathString.call(void 0,
21
+ const path = _chunk7SAJNRGZcjs.createPathString.call(void 0,
22
22
  location.pathname,
23
23
  location.search,
24
24
  location.hash
25
25
  );
26
- _chunkD5LQLRSUcjs.notifyRouteChange.call(void 0, path);
26
+ _chunk7SAJNRGZcjs.notifyRouteChange.call(void 0, path);
27
27
  }, [location.pathname, location.search, location.hash]);
28
28
  };
29
29
 
@@ -1,7 +1,7 @@
1
1
  import {
2
2
  createPathString,
3
3
  notifyRouteChange
4
- } from "../chunk-B44EX7YT.mjs";
4
+ } from "../chunk-J2JMZXGD.mjs";
5
5
 
6
6
  // src/router/reactRouterAdapter.tsx
7
7
  import { useEffect } from "react";
@@ -1,7 +1,7 @@
1
1
  "use strict";Object.defineProperty(exports, "__esModule", {value: true}); function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) { newObj[key] = obj[key]; } } } newObj.default = obj; return newObj; } } function _optionalChain(ops) { let lastAccessLHS = undefined; let value = ops[0]; let i = 1; while (i < ops.length) { const op = ops[i]; const fn = ops[i + 1]; i += 2; if ((op === 'optionalAccess' || op === 'optionalCall') && value == null) { return undefined; } if (op === 'access' || op === 'optionalAccess') { lastAccessLHS = value; value = fn(value); } else if (op === 'call' || op === 'optionalCall') { value = fn((...args) => value.call(lastAccessLHS, ...args)); lastAccessLHS = undefined; } } return value; }
2
2
 
3
3
 
4
- var _chunkD5LQLRSUcjs = require('../chunk-D5LQLRSU.cjs');
4
+ var _chunk7SAJNRGZcjs = require('../chunk-7SAJNRGZ.cjs');
5
5
 
6
6
  // src/router/tanstackRouterAdapter.tsx
7
7
  var _reactrouter = require('@tanstack/react-router'); var TanStackRouter = _interopRequireWildcard(_reactrouter);
@@ -55,8 +55,8 @@ var useTanStackRouterTourAdapter = () => {
55
55
  const resolvedPathname = typeof location.pathname === "string" && location.pathname.length > 0 ? location.pathname : "/";
56
56
  const resolvedSearch = "searchStr" in location && typeof location.searchStr === "string" ? location.searchStr : typeof location.search === "string" ? location.search : "";
57
57
  const resolvedHash = typeof location.hash === "string" ? location.hash : "";
58
- const path = typeof location.href === "string" && location.href.length > 0 ? location.href : _chunkD5LQLRSUcjs.createPathString.call(void 0, resolvedPathname, resolvedSearch, resolvedHash);
59
- _chunkD5LQLRSUcjs.notifyRouteChange.call(void 0, path);
58
+ const path = typeof location.href === "string" && location.href.length > 0 ? location.href : _chunk7SAJNRGZcjs.createPathString.call(void 0, resolvedPathname, resolvedSearch, resolvedHash);
59
+ _chunk7SAJNRGZcjs.notifyRouteChange.call(void 0, path);
60
60
  }, [location]);
61
61
  };
62
62
 
@@ -1,7 +1,7 @@
1
1
  import {
2
2
  createPathString,
3
3
  notifyRouteChange
4
- } from "../chunk-B44EX7YT.mjs";
4
+ } from "../chunk-J2JMZXGD.mjs";
5
5
 
6
6
  // src/router/tanstackRouterAdapter.tsx
7
7
  import { useRouterState } from "@tanstack/react-router";
@@ -1 +1 @@
1
- {"version":3,"file":"dom.d.ts","sourceRoot":"","sources":["../../src/utils/dom.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,SAAS,SAC4C,CAAA;AAElE,KAAK,QAAQ,GAAG;IACd,GAAG,EAAE,MAAM,CAAA;IACX,IAAI,EAAE,MAAM,CAAA;IACZ,KAAK,EAAE,MAAM,CAAA;IACb,MAAM,EAAE,MAAM,CAAA;CACf,CAAA;AAED,MAAM,MAAM,cAAc,GAAG,QAAQ,GAAG;IACtC,KAAK,EAAE,MAAM,CAAA;IACb,MAAM,EAAE,MAAM,CAAA;CACf,CAAA;AAED,eAAO,MAAM,UAAU,GAAI,+BAKxB,QAAQ,KAAG,cAOZ,CAAA;AAEF,eAAO,MAAM,YAAY,GAAI,MAAM,OAAO,GAAG,eAAe,KAAG,cAM3D,CAAA;AAEJ,eAAO,MAAM,eAAe,QAAO,cAgBlC,CAAA;AAED,eAAO,MAAM,UAAU,GACrB,MAAM,cAAc,EACpB,SAAS,MAAM,KACd,cAqBF,CAAA;AAED,eAAO,MAAM,gBAAgB,GAAI,MAAM,cAAc,EAAE,eAAU,YAUhE,CAAA;AAED,eAAO,MAAM,aAAa,GAAI,SAAS,OAAO,KAAG,cACF,CAAA;AAe/C,eAAO,MAAM,gBAAgB,GAAI,SAAS,OAAO,KAAG,KAAK,CAAC,OAAO,CA4BhE,CAAA;AAED,eAAO,MAAM,UAAU,0BAA2C,CAAA;AA4BlE,eAAO,MAAM,eAAe,eAM3B,CAAA"}
1
+ {"version":3,"file":"dom.d.ts","sourceRoot":"","sources":["../../src/utils/dom.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,SAAS,SAC4C,CAAA;AAElE,KAAK,QAAQ,GAAG;IACd,GAAG,EAAE,MAAM,CAAA;IACX,IAAI,EAAE,MAAM,CAAA;IACZ,KAAK,EAAE,MAAM,CAAA;IACb,MAAM,EAAE,MAAM,CAAA;CACf,CAAA;AAED,MAAM,MAAM,cAAc,GAAG,QAAQ,GAAG;IACtC,KAAK,EAAE,MAAM,CAAA;IACb,MAAM,EAAE,MAAM,CAAA;CACf,CAAA;AAED,eAAO,MAAM,UAAU,GAAI,+BAKxB,QAAQ,KAAG,cAOZ,CAAA;AAEF,eAAO,MAAM,YAAY,GAAI,MAAM,OAAO,GAAG,eAAe,KAAG,cAM3D,CAAA;AAEJ,eAAO,MAAM,eAAe,QAAO,cAgBlC,CAAA;AAED,eAAO,MAAM,UAAU,GACrB,MAAM,cAAc,EACpB,SAAS,MAAM,KACd,cAsBF,CAAA;AAED,eAAO,MAAM,gBAAgB,GAAI,MAAM,cAAc,EAAE,eAAU,YAUhE,CAAA;AAED,eAAO,MAAM,aAAa,GAAI,SAAS,OAAO,KAAG,cACF,CAAA;AAe/C,eAAO,MAAM,gBAAgB,GAAI,SAAS,OAAO,KAAG,KAAK,CAAC,OAAO,CA4BhE,CAAA;AAED,eAAO,MAAM,UAAU,0BAA2C,CAAA;AA4BlE,eAAO,MAAM,eAAe,eAM3B,CAAA"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@flowsterix/react",
3
- "version": "0.13.0",
3
+ "version": "0.14.1",
4
4
  "description": "React bindings for Flowsterix - guided tours and onboarding flows",
5
5
  "license": "MIT",
6
6
  "repository": {