@flowsterix/react 0.1.1 → 0.2.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.
@@ -5,7 +5,9 @@ export interface TourFocusManagerProps {
5
5
  target: TourTargetInfo;
6
6
  popoverNode: HTMLElement | null;
7
7
  highlightRect?: TourOverlayRect | null;
8
- targetRingOffset?: number;
8
+ guardElementFocusRing?: {
9
+ boxShadow: string;
10
+ };
9
11
  }
10
- export declare const TourFocusManager: ({ active, target, popoverNode, highlightRect, targetRingOffset, }: TourFocusManagerProps) => import("react").ReactPortal | null;
12
+ export declare const TourFocusManager: ({ active, target, popoverNode, highlightRect, guardElementFocusRing, }: TourFocusManagerProps) => import("react").ReactPortal | null;
11
13
  //# sourceMappingURL=TourFocusManager.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"TourFocusManager.d.ts","sourceRoot":"","sources":["../../src/components/TourFocusManager.tsx"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,yBAAyB,CAAA;AAC9D,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,wBAAwB,CAAA;AAgB5D,MAAM,WAAW,qBAAqB;IACpC,MAAM,EAAE,OAAO,CAAA;IACf,MAAM,EAAE,cAAc,CAAA;IACtB,WAAW,EAAE,WAAW,GAAG,IAAI,CAAA;IAC/B,aAAa,CAAC,EAAE,eAAe,GAAG,IAAI,CAAA;IACtC,gBAAgB,CAAC,EAAE,MAAM,CAAA;CAC1B;AAED,eAAO,MAAM,gBAAgB,GAAI,mEAM9B,qBAAqB,uCAkVvB,CAAA"}
1
+ {"version":3,"file":"TourFocusManager.d.ts","sourceRoot":"","sources":["../../src/components/TourFocusManager.tsx"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,yBAAyB,CAAA;AAC9D,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,wBAAwB,CAAA;AAgB5D,MAAM,WAAW,qBAAqB;IACpC,MAAM,EAAE,OAAO,CAAA;IACf,MAAM,EAAE,cAAc,CAAA;IACtB,WAAW,EAAE,WAAW,GAAG,IAAI,CAAA;IAC/B,aAAa,CAAC,EAAE,eAAe,GAAG,IAAI,CAAA;IACtC,qBAAqB,CAAC,EAAE;QAAE,SAAS,EAAE,MAAM,CAAA;KAAE,CAAA;CAC9C;AAKD,eAAO,MAAM,gBAAgB,GAAI,wEAM9B,qBAAqB,uCA0VvB,CAAA"}
@@ -45,6 +45,9 @@ export interface TourHudFocusManagerState {
45
45
  target: TourTargetInfo;
46
46
  popoverNode: HTMLElement | null;
47
47
  setPopoverNode: (node: HTMLElement | null) => void;
48
+ guardElementFocusRing?: {
49
+ boxShadow: string;
50
+ };
48
51
  }
49
52
  export interface UseTourHudResult {
50
53
  hudState: UseHudStateResult;
@@ -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;AAKtC,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;CACnD;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,gBAwFF,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;AAKtC,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,gBA+FF,CAAA"}
package/dist/index.cjs CHANGED
@@ -2405,9 +2405,16 @@ var useTourHud = (options = {}) => {
2405
2405
  active: hudState.focusTrapActive,
2406
2406
  target: hudState.hudTarget,
2407
2407
  popoverNode,
2408
- setPopoverNode
2408
+ setPopoverNode,
2409
+ guardElementFocusRing: hudState.flowHudOptions?.guardElementFocusRing
2409
2410
  }),
2410
- [hudState.focusTrapActive, hudState.hudTarget, popoverNode, setPopoverNode]
2411
+ [
2412
+ hudState.focusTrapActive,
2413
+ hudState.hudTarget,
2414
+ popoverNode,
2415
+ setPopoverNode,
2416
+ hudState.flowHudOptions?.guardElementFocusRing
2417
+ ]
2411
2418
  );
2412
2419
  return {
2413
2420
  hudState,
@@ -3738,12 +3745,13 @@ var runMicrotask = (callback) => {
3738
3745
  setTimeout(callback, 0);
3739
3746
  }
3740
3747
  };
3748
+ var DEFAULT_BOX_SHADOW = "0 0 0 2px var(--primary), 0 0 8px 2px color-mix(in srgb, var(--primary) 40%, transparent)";
3741
3749
  var TourFocusManager = ({
3742
3750
  active,
3743
3751
  target,
3744
3752
  popoverNode,
3745
3753
  highlightRect,
3746
- targetRingOffset = -2
3754
+ guardElementFocusRing
3747
3755
  }) => {
3748
3756
  const previousFocusRef = (0, import_react21.useRef)(null);
3749
3757
  const guardNodesRef = (0, import_react21.useRef)({
@@ -3754,10 +3762,9 @@ var TourFocusManager = ({
3754
3762
  });
3755
3763
  const lastTabDirectionRef = (0, import_react21.useRef)("forward");
3756
3764
  const suppressGuardHopRef = (0, import_react21.useRef)(null);
3757
- const ringStylesRef = (0, import_react21.useRef)(
3758
- /* @__PURE__ */ new WeakMap()
3759
- );
3760
3765
  const [targetRingActive, setTargetRingActive] = (0, import_react21.useState)(false);
3766
+ const [popoverRingActive, setPopoverRingActive] = (0, import_react21.useState)(false);
3767
+ const [popoverRect, setPopoverRect] = (0, import_react21.useState)(null);
3761
3768
  const restoreFocus = () => {
3762
3769
  const previous = previousFocusRef.current;
3763
3770
  previousFocusRef.current = null;
@@ -3809,33 +3816,9 @@ var TourFocusManager = ({
3809
3816
  });
3810
3817
  return node;
3811
3818
  };
3812
- const applyRing = (element, activeRing) => {
3813
- if (!element) return;
3814
- const cache = ringStylesRef.current;
3815
- if (activeRing) {
3816
- if (!cache.has(element)) {
3817
- cache.set(element, {
3818
- outline: element.style.outline,
3819
- outlineOffset: element.style.outlineOffset
3820
- });
3821
- }
3822
- element.style.outline = "2px solid var(--tour-focus-ring-color, rgba(59, 130, 246, 0.8))";
3823
- element.style.outlineOffset = "3px";
3824
- return;
3825
- }
3826
- const previous = cache.get(element);
3827
- if (previous) {
3828
- element.style.outline = previous.outline;
3829
- element.style.outlineOffset = previous.outlineOffset;
3830
- cache.delete(element);
3831
- } else {
3832
- element.style.outline = "";
3833
- element.style.outlineOffset = "";
3834
- }
3835
- };
3836
3819
  const clearRings = () => {
3837
3820
  setTargetRingActive(false);
3838
- applyRing(popoverNode, false);
3821
+ setPopoverRingActive(false);
3839
3822
  };
3840
3823
  const removeGuards = () => {
3841
3824
  for (const key of Object.keys(guardNodesRef.current)) {
@@ -3972,10 +3955,10 @@ var TourFocusManager = ({
3972
3955
  const key = targetNode.getAttribute("data-tour-focus-guard");
3973
3956
  if (key?.startsWith("target")) {
3974
3957
  setTargetRingActive(true);
3975
- applyRing(popoverNode, false);
3958
+ setPopoverRingActive(false);
3976
3959
  } else if (key?.startsWith("popover")) {
3977
3960
  setTargetRingActive(false);
3978
- applyRing(popoverNode, true);
3961
+ setPopoverRingActive(true);
3979
3962
  }
3980
3963
  return;
3981
3964
  }
@@ -4001,25 +3984,59 @@ var TourFocusManager = ({
4001
3984
  target.stepId,
4002
3985
  target.visibility
4003
3986
  ]);
3987
+ (0, import_react21.useLayoutEffect)(() => {
3988
+ if (popoverRingActive && popoverNode) {
3989
+ setPopoverRect(popoverNode.getBoundingClientRect());
3990
+ } else {
3991
+ setPopoverRect(null);
3992
+ }
3993
+ }, [popoverRingActive, popoverNode]);
4004
3994
  if (!isBrowser) return null;
4005
3995
  const host = portalHost();
4006
- if (!host || !highlightRect || !targetRingActive) return null;
4007
- const offset = Math.max(0, targetRingOffset);
4008
- const ringStyle = {
4009
- position: "fixed",
4010
- top: highlightRect.top - offset,
4011
- left: highlightRect.left - offset,
4012
- width: highlightRect.width + offset * 2,
4013
- height: highlightRect.height + offset * 2,
4014
- borderRadius: highlightRect.radius + offset,
4015
- boxShadow: [
4016
- "0 0 0 2px var(--tour-focus-ring-offset-color, transparent)",
4017
- "0 0 0 2px var(--tour-focus-ring-color, rgba(59, 130, 246, 0.8))"
4018
- ].join(", "),
4019
- pointerEvents: "none",
4020
- zIndex: 2001
4021
- };
4022
- return (0, import_react_dom3.createPortal)(/* @__PURE__ */ (0, import_jsx_runtime4.jsx)("div", { style: ringStyle, "aria-hidden": true }), host);
3996
+ if (!host) return null;
3997
+ const boxShadow = guardElementFocusRing?.boxShadow ?? DEFAULT_BOX_SHADOW;
3998
+ const showTargetRing = targetRingActive && highlightRect;
3999
+ const showPopoverRing = popoverRingActive && popoverRect;
4000
+ if (!showTargetRing && !showPopoverRing) return null;
4001
+ return (0, import_react_dom3.createPortal)(
4002
+ /* @__PURE__ */ (0, import_jsx_runtime4.jsxs)(import_jsx_runtime4.Fragment, { children: [
4003
+ showTargetRing && /* @__PURE__ */ (0, import_jsx_runtime4.jsx)(
4004
+ "div",
4005
+ {
4006
+ style: {
4007
+ position: "fixed",
4008
+ top: highlightRect.top,
4009
+ left: highlightRect.left,
4010
+ width: highlightRect.width,
4011
+ height: highlightRect.height,
4012
+ borderRadius: highlightRect.radius,
4013
+ boxShadow,
4014
+ pointerEvents: "none",
4015
+ zIndex: 2001
4016
+ },
4017
+ "aria-hidden": true
4018
+ }
4019
+ ),
4020
+ showPopoverRing && /* @__PURE__ */ (0, import_jsx_runtime4.jsx)(
4021
+ "div",
4022
+ {
4023
+ style: {
4024
+ position: "fixed",
4025
+ top: popoverRect.top,
4026
+ left: popoverRect.left,
4027
+ width: popoverRect.width,
4028
+ height: popoverRect.height,
4029
+ borderRadius: 12,
4030
+ boxShadow,
4031
+ pointerEvents: "none",
4032
+ zIndex: 2001
4033
+ },
4034
+ "aria-hidden": true
4035
+ }
4036
+ )
4037
+ ] }),
4038
+ host
4039
+ );
4023
4040
  };
4024
4041
 
4025
4042
  // src/motion/useHudMotion.ts
package/dist/index.mjs CHANGED
@@ -2140,9 +2140,16 @@ var useTourHud = (options = {}) => {
2140
2140
  active: hudState.focusTrapActive,
2141
2141
  target: hudState.hudTarget,
2142
2142
  popoverNode,
2143
- setPopoverNode
2143
+ setPopoverNode,
2144
+ guardElementFocusRing: hudState.flowHudOptions?.guardElementFocusRing
2144
2145
  }),
2145
- [hudState.focusTrapActive, hudState.hudTarget, popoverNode, setPopoverNode]
2146
+ [
2147
+ hudState.focusTrapActive,
2148
+ hudState.hudTarget,
2149
+ popoverNode,
2150
+ setPopoverNode,
2151
+ hudState.flowHudOptions?.guardElementFocusRing
2152
+ ]
2146
2153
  );
2147
2154
  return {
2148
2155
  hudState,
@@ -3471,7 +3478,7 @@ var focusElement = (element, options) => {
3471
3478
  };
3472
3479
 
3473
3480
  // src/components/TourFocusManager.tsx
3474
- import { jsx as jsx4 } from "react/jsx-runtime";
3481
+ import { Fragment, jsx as jsx4, jsxs as jsxs2 } from "react/jsx-runtime";
3475
3482
  var runMicrotask = (callback) => {
3476
3483
  if (typeof queueMicrotask === "function") {
3477
3484
  queueMicrotask(callback);
@@ -3479,12 +3486,13 @@ var runMicrotask = (callback) => {
3479
3486
  setTimeout(callback, 0);
3480
3487
  }
3481
3488
  };
3489
+ var DEFAULT_BOX_SHADOW = "0 0 0 2px var(--primary), 0 0 8px 2px color-mix(in srgb, var(--primary) 40%, transparent)";
3482
3490
  var TourFocusManager = ({
3483
3491
  active,
3484
3492
  target,
3485
3493
  popoverNode,
3486
3494
  highlightRect,
3487
- targetRingOffset = -2
3495
+ guardElementFocusRing
3488
3496
  }) => {
3489
3497
  const previousFocusRef = useRef8(null);
3490
3498
  const guardNodesRef = useRef8({
@@ -3495,10 +3503,9 @@ var TourFocusManager = ({
3495
3503
  });
3496
3504
  const lastTabDirectionRef = useRef8("forward");
3497
3505
  const suppressGuardHopRef = useRef8(null);
3498
- const ringStylesRef = useRef8(
3499
- /* @__PURE__ */ new WeakMap()
3500
- );
3501
3506
  const [targetRingActive, setTargetRingActive] = useState11(false);
3507
+ const [popoverRingActive, setPopoverRingActive] = useState11(false);
3508
+ const [popoverRect, setPopoverRect] = useState11(null);
3502
3509
  const restoreFocus = () => {
3503
3510
  const previous = previousFocusRef.current;
3504
3511
  previousFocusRef.current = null;
@@ -3550,33 +3557,9 @@ var TourFocusManager = ({
3550
3557
  });
3551
3558
  return node;
3552
3559
  };
3553
- const applyRing = (element, activeRing) => {
3554
- if (!element) return;
3555
- const cache = ringStylesRef.current;
3556
- if (activeRing) {
3557
- if (!cache.has(element)) {
3558
- cache.set(element, {
3559
- outline: element.style.outline,
3560
- outlineOffset: element.style.outlineOffset
3561
- });
3562
- }
3563
- element.style.outline = "2px solid var(--tour-focus-ring-color, rgba(59, 130, 246, 0.8))";
3564
- element.style.outlineOffset = "3px";
3565
- return;
3566
- }
3567
- const previous = cache.get(element);
3568
- if (previous) {
3569
- element.style.outline = previous.outline;
3570
- element.style.outlineOffset = previous.outlineOffset;
3571
- cache.delete(element);
3572
- } else {
3573
- element.style.outline = "";
3574
- element.style.outlineOffset = "";
3575
- }
3576
- };
3577
3560
  const clearRings = () => {
3578
3561
  setTargetRingActive(false);
3579
- applyRing(popoverNode, false);
3562
+ setPopoverRingActive(false);
3580
3563
  };
3581
3564
  const removeGuards = () => {
3582
3565
  for (const key of Object.keys(guardNodesRef.current)) {
@@ -3713,10 +3696,10 @@ var TourFocusManager = ({
3713
3696
  const key = targetNode.getAttribute("data-tour-focus-guard");
3714
3697
  if (key?.startsWith("target")) {
3715
3698
  setTargetRingActive(true);
3716
- applyRing(popoverNode, false);
3699
+ setPopoverRingActive(false);
3717
3700
  } else if (key?.startsWith("popover")) {
3718
3701
  setTargetRingActive(false);
3719
- applyRing(popoverNode, true);
3702
+ setPopoverRingActive(true);
3720
3703
  }
3721
3704
  return;
3722
3705
  }
@@ -3742,25 +3725,59 @@ var TourFocusManager = ({
3742
3725
  target.stepId,
3743
3726
  target.visibility
3744
3727
  ]);
3728
+ useLayoutEffect3(() => {
3729
+ if (popoverRingActive && popoverNode) {
3730
+ setPopoverRect(popoverNode.getBoundingClientRect());
3731
+ } else {
3732
+ setPopoverRect(null);
3733
+ }
3734
+ }, [popoverRingActive, popoverNode]);
3745
3735
  if (!isBrowser) return null;
3746
3736
  const host = portalHost();
3747
- if (!host || !highlightRect || !targetRingActive) return null;
3748
- const offset = Math.max(0, targetRingOffset);
3749
- const ringStyle = {
3750
- position: "fixed",
3751
- top: highlightRect.top - offset,
3752
- left: highlightRect.left - offset,
3753
- width: highlightRect.width + offset * 2,
3754
- height: highlightRect.height + offset * 2,
3755
- borderRadius: highlightRect.radius + offset,
3756
- boxShadow: [
3757
- "0 0 0 2px var(--tour-focus-ring-offset-color, transparent)",
3758
- "0 0 0 2px var(--tour-focus-ring-color, rgba(59, 130, 246, 0.8))"
3759
- ].join(", "),
3760
- pointerEvents: "none",
3761
- zIndex: 2001
3762
- };
3763
- return createPortal3(/* @__PURE__ */ jsx4("div", { style: ringStyle, "aria-hidden": true }), host);
3737
+ if (!host) return null;
3738
+ const boxShadow = guardElementFocusRing?.boxShadow ?? DEFAULT_BOX_SHADOW;
3739
+ const showTargetRing = targetRingActive && highlightRect;
3740
+ const showPopoverRing = popoverRingActive && popoverRect;
3741
+ if (!showTargetRing && !showPopoverRing) return null;
3742
+ return createPortal3(
3743
+ /* @__PURE__ */ jsxs2(Fragment, { children: [
3744
+ showTargetRing && /* @__PURE__ */ jsx4(
3745
+ "div",
3746
+ {
3747
+ style: {
3748
+ position: "fixed",
3749
+ top: highlightRect.top,
3750
+ left: highlightRect.left,
3751
+ width: highlightRect.width,
3752
+ height: highlightRect.height,
3753
+ borderRadius: highlightRect.radius,
3754
+ boxShadow,
3755
+ pointerEvents: "none",
3756
+ zIndex: 2001
3757
+ },
3758
+ "aria-hidden": true
3759
+ }
3760
+ ),
3761
+ showPopoverRing && /* @__PURE__ */ jsx4(
3762
+ "div",
3763
+ {
3764
+ style: {
3765
+ position: "fixed",
3766
+ top: popoverRect.top,
3767
+ left: popoverRect.left,
3768
+ width: popoverRect.width,
3769
+ height: popoverRect.height,
3770
+ borderRadius: 12,
3771
+ boxShadow,
3772
+ pointerEvents: "none",
3773
+ zIndex: 2001
3774
+ },
3775
+ "aria-hidden": true
3776
+ }
3777
+ )
3778
+ ] }),
3779
+ host
3780
+ );
3764
3781
  };
3765
3782
 
3766
3783
  // src/motion/useHudMotion.ts
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@flowsterix/react",
3
- "version": "0.1.1",
3
+ "version": "0.2.1",
4
4
  "description": "React bindings for Flowsterix - guided tours and onboarding flows",
5
5
  "license": "MIT",
6
6
  "repository": {
@@ -64,7 +64,7 @@
64
64
  ],
65
65
  "dependencies": {
66
66
  "@floating-ui/dom": "^1.7.4",
67
- "@flowsterix/core": "0.1.0"
67
+ "@flowsterix/core": "0.2.0"
68
68
  },
69
69
  "peerDependencies": {
70
70
  "react": ">=18",
@@ -74,6 +74,9 @@
74
74
  "next": ">=13",
75
75
  "react-router-dom": ">=6"
76
76
  },
77
+ "devDependencies": {
78
+ "motion": "^12.29.0"
79
+ },
77
80
  "peerDependenciesMeta": {
78
81
  "motion": {
79
82
  "optional": false