react-bounded-overlay-manager 1.0.0-beta.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 (84) hide show
  1. package/README.md +30 -0
  2. package/dist/assets/Overlay.css +1 -0
  3. package/dist/assets/OverlaysContainer.css +1 -0
  4. package/dist/events-B7I8KoZ9.js +228 -0
  5. package/dist/index-7ofMxoL9.js +8811 -0
  6. package/dist/index.module-WXM1Xk0w.js +60 -0
  7. package/dist/main.d.ts +7 -0
  8. package/dist/main.js +12 -0
  9. package/dist/react.esm-GKFzux-6.js +12736 -0
  10. package/dist/src/api/BoundedOverlayManagerApi.d.ts +14 -0
  11. package/dist/src/api/BoundedOverlayManagerApi.js +24 -0
  12. package/dist/src/components/BoundedOverlayManager.d.ts +7 -0
  13. package/dist/src/components/BoundedOverlayManager.js +17 -0
  14. package/dist/src/components/BoundedOverlayManagerContent.d.ts +15 -0
  15. package/dist/src/components/BoundedOverlayManagerContent.js +46 -0
  16. package/dist/src/components/Overlay.d.ts +26 -0
  17. package/dist/src/components/Overlay.js +43 -0
  18. package/dist/src/components/OverlaysContainer.d.ts +11 -0
  19. package/dist/src/components/OverlaysContainer.js +12 -0
  20. package/dist/src/components/test/BoundedOverlayManager.test.d.ts +0 -0
  21. package/dist/src/components/test/BoundedOverlayManager.test.js +37 -0
  22. package/dist/src/components/test/BoundedOverlayManagerContent.test.d.ts +0 -0
  23. package/dist/src/components/test/BoundedOverlayManagerContent.test.js +92 -0
  24. package/dist/src/components/test/Overlay.test.d.ts +0 -0
  25. package/dist/src/components/test/Overlay.test.js +245 -0
  26. package/dist/src/components/test/OverlaysContainer.test.d.ts +0 -0
  27. package/dist/src/components/test/OverlaysContainer.test.js +36 -0
  28. package/dist/src/config.d.ts +6 -0
  29. package/dist/src/config.js +9 -0
  30. package/dist/src/context/OverlayManagerContext.d.ts +13 -0
  31. package/dist/src/context/OverlayManagerContext.js +23 -0
  32. package/dist/src/context/test/OverlayManagerContext.test.d.ts +1 -0
  33. package/dist/src/context/test/OverlayManagerContext.test.js +31 -0
  34. package/dist/src/enum/PredefinedPosition.d.ts +12 -0
  35. package/dist/src/enum/PredefinedPosition.js +4 -0
  36. package/dist/src/hooks/test/useApiUpdateHandler.test.d.ts +1 -0
  37. package/dist/src/hooks/test/useApiUpdateHandler.test.js +28 -0
  38. package/dist/src/hooks/test/useForwardBoundingComponentEvents.test.d.ts +1 -0
  39. package/dist/src/hooks/test/useForwardBoundingComponentEvents.test.js +62 -0
  40. package/dist/src/hooks/test/useForwardOverlayEvents.test.d.ts +1 -0
  41. package/dist/src/hooks/test/useForwardOverlayEvents.test.js +43 -0
  42. package/dist/src/hooks/test/useFullscreenChange.test.d.ts +1 -0
  43. package/dist/src/hooks/test/useFullscreenChange.test.js +33 -0
  44. package/dist/src/hooks/test/useOverlayManagerEvents.test.d.ts +1 -0
  45. package/dist/src/hooks/test/useOverlayManagerEvents.test.js +87 -0
  46. package/dist/src/hooks/test/useResizeObserver.test.d.ts +1 -0
  47. package/dist/src/hooks/test/useResizeObserver.test.js +47 -0
  48. package/dist/src/hooks/test/useScrollOnDocument.test.d.ts +1 -0
  49. package/dist/src/hooks/test/useScrollOnDocument.test.js +38 -0
  50. package/dist/src/hooks/test/useTimedEventManager.test.d.ts +1 -0
  51. package/dist/src/hooks/test/useTimedEventManager.test.js +41 -0
  52. package/dist/src/hooks/test/useWindowResize.test.d.ts +1 -0
  53. package/dist/src/hooks/test/useWindowResize.test.js +38 -0
  54. package/dist/src/hooks/test/util.d.ts +7 -0
  55. package/dist/src/hooks/test/util.js +20 -0
  56. package/dist/src/hooks/useApiUpdateHandler.d.ts +6 -0
  57. package/dist/src/hooks/useApiUpdateHandler.js +10 -0
  58. package/dist/src/hooks/useForwardBoundingComponentEvents.d.ts +2 -0
  59. package/dist/src/hooks/useForwardBoundingComponentEvents.js +20 -0
  60. package/dist/src/hooks/useForwardOverlayEvents.d.ts +6 -0
  61. package/dist/src/hooks/useForwardOverlayEvents.js +21 -0
  62. package/dist/src/hooks/useFullscreenChange.d.ts +5 -0
  63. package/dist/src/hooks/useFullscreenChange.js +16 -0
  64. package/dist/src/hooks/useOverlayManagerEvents.d.ts +8 -0
  65. package/dist/src/hooks/useOverlayManagerEvents.js +34 -0
  66. package/dist/src/hooks/useResizeObserver.d.ts +6 -0
  67. package/dist/src/hooks/useResizeObserver.js +19 -0
  68. package/dist/src/hooks/useScrollOnDocument.d.ts +5 -0
  69. package/dist/src/hooks/useScrollOnDocument.js +11 -0
  70. package/dist/src/hooks/useTimedEventManager.d.ts +6 -0
  71. package/dist/src/hooks/useTimedEventManager.js +15 -0
  72. package/dist/src/hooks/useWindowResize.d.ts +5 -0
  73. package/dist/src/hooks/useWindowResize.js +11 -0
  74. package/dist/src/timer/TimedEventManager.d.ts +16 -0
  75. package/dist/src/timer/TimedEventManager.js +25 -0
  76. package/dist/src/timer/test/TimedEventManager.test.d.ts +1 -0
  77. package/dist/src/timer/test/TimedEventManager.test.js +26 -0
  78. package/dist/src/types/OffsetProps.d.ts +37 -0
  79. package/dist/src/types/OffsetProps.js +1 -0
  80. package/dist/src/util/bbox.d.ts +7 -0
  81. package/dist/src/util/bbox.js +20 -0
  82. package/dist/vite-env.d.js +1 -0
  83. package/dist/vite.svg +1 -0
  84. package/package.json +70 -0
@@ -0,0 +1,13 @@
1
+ /// <reference types="node" />
2
+ import React, { PropsWithChildren } from 'react';
3
+ import { EventEmitter } from 'events';
4
+ interface OverlayManagerContextType {
5
+ overlayManagerEventEmitter: EventEmitter;
6
+ boundingComponentRef: React.RefObject<HTMLElement>;
7
+ }
8
+ type Props = {
9
+ boundingComponentRef: React.RefObject<HTMLElement>;
10
+ };
11
+ export declare const useOverlayManagerContext: () => OverlayManagerContextType;
12
+ export declare const OverlayManagerContextProvider: React.FC<PropsWithChildren<Props>>;
13
+ export {};
@@ -0,0 +1,23 @@
1
+ import { jsx as a } from "react/jsx-runtime";
2
+ import { createContext as s, useContext as v, useState as i, useEffect as u } from "react";
3
+ import { e as x } from "../../events-B7I8KoZ9.js";
4
+ const r = s(void 0), E = () => {
5
+ const e = v(r);
6
+ if (e === void 0)
7
+ throw new Error("useOverlayManagerContext must be used within a OverlayManagerContextProvider");
8
+ return e;
9
+ }, C = ({ children: e, boundingComponentRef: n }) => {
10
+ const [t] = i(new x.EventEmitter());
11
+ u(() => () => {
12
+ t.removeAllListeners();
13
+ }, [t]);
14
+ const o = {
15
+ overlayManagerEventEmitter: t,
16
+ boundingComponentRef: n
17
+ };
18
+ return /* @__PURE__ */ a(r.Provider, { value: o, children: e });
19
+ };
20
+ export {
21
+ C as OverlayManagerContextProvider,
22
+ E as useOverlayManagerContext
23
+ };
@@ -0,0 +1,31 @@
1
+ import { jsx as t, jsxs as d } from "react/jsx-runtime";
2
+ import { c as m, a as o, s as r } from "../../../react.esm-GKFzux-6.js";
3
+ import { OverlayManagerContextProvider as s, useOverlayManagerContext as c } from "../OverlayManagerContext.js";
4
+ import { e as a } from "../../../events-B7I8KoZ9.js";
5
+ const i = () => {
6
+ const { overlayManagerEventEmitter: e, boundingComponentRef: n } = c();
7
+ return /* @__PURE__ */ d("div", { children: [
8
+ e instanceof a.EventEmitter ? /* @__PURE__ */ t("div", { "data-testid": "eventEmitter" }) : null,
9
+ n.current ? /* @__PURE__ */ t("div", { "data-testid": "boundingComponentRef" }) : null
10
+ ] });
11
+ };
12
+ describe("OverlayManagerContext", () => {
13
+ afterEach(m), it("provides overlayManagerEventEmitter and boundingComponentRef", () => {
14
+ o(
15
+ /* @__PURE__ */ t(s, { boundingComponentRef: { current: document.createElement("div") }, children: /* @__PURE__ */ t(i, {}) })
16
+ ), expect(r.getByTestId("eventEmitter")).not.toBeNull(), expect(r.getByTestId("boundingComponentRef")).not.toBeNull();
17
+ }), it("throws error when used outside provider", () => {
18
+ const e = jest.spyOn(console, "error");
19
+ e.mockImplementation(() => {
20
+ });
21
+ const n = () => {
22
+ o(/* @__PURE__ */ t(i, {}));
23
+ };
24
+ expect(n).toThrow("useOverlayManagerContext must be used within a OverlayManagerContextProvider"), e.mockRestore();
25
+ }), it("cleans up eventEmitter listeners on unmount", () => {
26
+ const e = jest.spyOn(a.EventEmitter.prototype, "removeAllListeners"), { unmount: n } = o(
27
+ /* @__PURE__ */ t(s, { boundingComponentRef: { current: document.createElement("div") }, children: /* @__PURE__ */ t("div", { children: "Test Component" }) })
28
+ );
29
+ n(), expect(e).toHaveBeenCalled(), e.mockRestore();
30
+ });
31
+ });
@@ -0,0 +1,12 @@
1
+ declare enum PredefinedPosition {
2
+ TOP_LEFT = "top_left",
3
+ BOTTOM_CENTER = "bottom_center",
4
+ TOP_RIGHT = "top_right",
5
+ CENTER = "center",
6
+ BOTTOM_LEFT = "bottom_left",
7
+ TOP_CENTER = "top_center",
8
+ BOTTOM_RIGHT = "bottom_right",
9
+ MID_LEFT = "mid_left",
10
+ MID_RIGHT = "mid_right"
11
+ }
12
+ export default PredefinedPosition;
@@ -0,0 +1,4 @@
1
+ var _ = /* @__PURE__ */ ((T) => (T.TOP_LEFT = "top_left", T.BOTTOM_CENTER = "bottom_center", T.TOP_RIGHT = "top_right", T.CENTER = "center", T.BOTTOM_LEFT = "bottom_left", T.TOP_CENTER = "top_center", T.BOTTOM_RIGHT = "bottom_right", T.MID_LEFT = "mid_left", T.MID_RIGHT = "mid_right", T))(_ || {});
2
+ export {
3
+ _ as default
4
+ };
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,28 @@
1
+ import { r, w as n } from "../../../react.esm-GKFzux-6.js";
2
+ import d from "../useApiUpdateHandler.js";
3
+ jest.mock("../../api/BoundedOverlayManagerApi", () => ({
4
+ __esModule: !0,
5
+ // This property is needed for mocking default exports
6
+ default: jest.fn(({ timedEventManager: a }) => a)
7
+ }));
8
+ describe("useApiUpdateHandler", () => {
9
+ it("should recall onApiUpdated when an api parameter changes", async () => {
10
+ const a = { id: "initial" }, e = jest.fn(), t = jest.fn(), { rerender: i } = r(({ timedEventManager: p }) => d({ timedEventManager: p, onApiUpdated: e, updateOverlaysContainerBoundingBox: t }), {
11
+ initialProps: { timedEventManager: a }
12
+ });
13
+ await n(() => {
14
+ expect(e).toHaveBeenCalledWith(a);
15
+ }), e.mockClear();
16
+ const o = { id: "new" };
17
+ i({ timedEventManager: o }), await n(() => {
18
+ expect(e).toHaveBeenCalledWith(o);
19
+ });
20
+ }), it("should not recall onApiUpdated when no api parameter change", async () => {
21
+ const a = { id: "initial" }, e = jest.fn(), t = jest.fn(), { rerender: i } = r(() => d({ timedEventManager: a, onApiUpdated: e, updateOverlaysContainerBoundingBox: t }));
22
+ await n(() => {
23
+ expect(e).toHaveBeenCalledWith(a);
24
+ }), e.mockClear(), i(), await n(() => {
25
+ expect(e).not.toHaveBeenCalled();
26
+ });
27
+ });
28
+ });
@@ -0,0 +1,62 @@
1
+ import { r as o } from "../../../react.esm-GKFzux-6.js";
2
+ import { useOverlayManagerContext as m } from "../../context/OverlayManagerContext.js";
3
+ import a from "../useForwardBoundingComponentEvents.js";
4
+ import { makeEventOnlyMockComponentRef as s } from "./util.js";
5
+ const i = () => {
6
+ const e = document.createElement("div");
7
+ return e.className = "overlay", e;
8
+ }, v = () => {
9
+ const e = i(), n = document.createElement("div");
10
+ e.appendChild(n);
11
+ const t = document.createElement("div");
12
+ return n.appendChild(t), t;
13
+ }, c = (e) => {
14
+ expect(e.current.addEventListener).toHaveBeenCalledWith("mousemove", expect.any(Function)), expect(e.current.addEventListener).toHaveBeenCalledWith("mouseleave", expect.any(Function));
15
+ }, l = (e) => {
16
+ expect(e.current.removeEventListener).toHaveBeenCalledWith("mousemove", expect.any(Function)), expect(e.current.removeEventListener).toHaveBeenCalledWith("mouseleave", expect.any(Function));
17
+ };
18
+ jest.mock("../../context/OverlayManagerContext");
19
+ describe("useForwardBoundingComponentEvents", () => {
20
+ const e = {
21
+ emit: jest.fn()
22
+ };
23
+ let n;
24
+ beforeEach(() => {
25
+ n = s(), m.mockReturnValue({
26
+ overlayManagerEventEmitter: e,
27
+ boundingComponentRef: n
28
+ });
29
+ }), afterEach(() => {
30
+ jest.clearAllMocks();
31
+ }), it("sets up and tears down event listeners", () => {
32
+ const { unmount: t } = o(() => a());
33
+ c(n), t(), l(n);
34
+ }), it("emits mousemoveOnBoundingComponent when mousemove event occurs", () => {
35
+ o(() => a());
36
+ const t = new Event("mousemove");
37
+ n.current.dispatchEvent(t), expect(e.emit).toHaveBeenCalledWith("mousemoveOnBoundingComponent");
38
+ }), it("emits mouseleaveOnBoundingComponent when mouseleave event occurs", () => {
39
+ o(() => a());
40
+ const t = new Event("mouseleave");
41
+ n.current.dispatchEvent(t), expect(e.emit).toHaveBeenCalledWith("mouseleaveOnBoundingComponent");
42
+ }), it.each([
43
+ {
44
+ title: "does not emit mouseleaveOnBoundingComponent when related target is an overlay",
45
+ relatedTarget: i()
46
+ },
47
+ {
48
+ title: "does not emit mouseleaveOnBoundingComponent when related target is a descendant of an overlay",
49
+ relatedTarget: v()
50
+ }
51
+ ])("$title", ({ relatedTarget: t }) => {
52
+ o(() => a());
53
+ const r = new MouseEvent("mouseleave", { relatedTarget: t });
54
+ n.current.dispatchEvent(r), expect(e.emit).not.toHaveBeenCalledWith("mouseleaveOnBoundingComponent");
55
+ }), it("handles updates to boundingComponentRef correctly", () => {
56
+ const { rerender: t } = o(() => a()), r = s();
57
+ m.mockReturnValue({
58
+ overlayManagerEventEmitter: e,
59
+ boundingComponentRef: r
60
+ }), t(), l(n), c(r);
61
+ });
62
+ });
@@ -0,0 +1,43 @@
1
+ import { r as o, w as m } from "../../../react.esm-GKFzux-6.js";
2
+ import { useOverlayManagerContext as i } from "../../context/OverlayManagerContext.js";
3
+ import r from "../useForwardOverlayEvents.js";
4
+ import { makeEventOnlyMockComponentRef as s } from "./util.js";
5
+ jest.mock("../../context/OverlayManagerContext");
6
+ const v = (e) => {
7
+ expect(e.current.addEventListener).toHaveBeenCalledWith("mousemove", expect.any(Function)), expect(e.current.addEventListener).toHaveBeenCalledWith("mouseleave", expect.any(Function));
8
+ }, c = (e) => {
9
+ expect(e.current.removeEventListener).toHaveBeenCalledWith("mousemove", expect.any(Function)), expect(e.current.removeEventListener).toHaveBeenCalledWith("mouseleave", expect.any(Function));
10
+ };
11
+ describe("useForwardOverlayEvents", () => {
12
+ const e = {
13
+ emit: jest.fn()
14
+ }, n = s();
15
+ beforeEach(() => {
16
+ i.mockReturnValue({
17
+ overlayManagerEventEmitter: e
18
+ });
19
+ }), afterEach(() => {
20
+ jest.clearAllMocks();
21
+ }), it("sets up and tears down event listeners", () => {
22
+ const { unmount: t } = o(() => r({ overlayRef: n }));
23
+ v(n), t(), c(n);
24
+ }), it("emits mousemoveOnOverlay when mousemove event occurs", () => {
25
+ o(() => r({ overlayRef: n }));
26
+ const t = new Event("mousemove");
27
+ n.current.dispatchEvent(t), expect(e.emit).toHaveBeenCalledWith("mousemoveOnOverlay");
28
+ }), it("emits mousemoveOnOverlay when mouseleave event occurs", () => {
29
+ o(() => r({ overlayRef: n }));
30
+ const t = new Event("mouseleave");
31
+ n.current.dispatchEvent(t), expect(e.emit).toHaveBeenCalledWith("mouseleaveOnOverlay", t);
32
+ }), it("handles updates to overlayRef correctly", async () => {
33
+ const { rerender: t } = o(({ overlayRef: l }) => r({ overlayRef: l }), {
34
+ initialProps: { overlayRef: n }
35
+ }), a = s();
36
+ t({ overlayRef: a }), await m(() => {
37
+ c(n), v(a);
38
+ });
39
+ }), it("does not emit any mount events when overlay element is null", () => {
40
+ const t = { current: null };
41
+ o(() => r({ overlayRef: t })), expect(e.emit).not.toHaveBeenCalled();
42
+ });
43
+ });
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,33 @@
1
+ import { r as c, w as u } from "../../../react.esm-GKFzux-6.js";
2
+ import r from "../useFullscreenChange.js";
3
+ describe("useFullscreenChange", () => {
4
+ const n = jest.fn(), l = ["fullscreenchange", "webkitfullscreenchange", "mozfullscreenchange", "MSFullscreenChange"], a = (e, t) => {
5
+ l.forEach((s) => {
6
+ expect(e).toHaveBeenCalledWith(s, t);
7
+ });
8
+ }, o = (e, t) => {
9
+ l.forEach((s) => {
10
+ expect(e).toHaveBeenCalledWith(s, t);
11
+ });
12
+ };
13
+ afterEach(() => {
14
+ jest.clearAllMocks(), jest.restoreAllMocks();
15
+ }), it("adds fullscreen change event listeners when mounted", () => {
16
+ const e = jest.spyOn(document, "addEventListener");
17
+ c(() => r({ handleFullscreenChange: n })), o(e, n);
18
+ }), it("removes fullscreen change event listeners when unmounted", () => {
19
+ const e = jest.spyOn(document, "removeEventListener"), { unmount: t } = c(() => r({ handleFullscreenChange: n }));
20
+ t(), a(e, n);
21
+ }), it("calls handleFullscreenChange when a fullscreen change event occurs", () => {
22
+ c(() => r({ handleFullscreenChange: n })), l.forEach((e) => {
23
+ document.dispatchEvent(new Event(e)), expect(n).toHaveBeenCalledTimes(1), n.mockClear();
24
+ });
25
+ }), it("updates event listeners when handleFullscreenChange changes", async () => {
26
+ const e = jest.fn(), t = jest.spyOn(document, "addEventListener"), s = jest.spyOn(document, "removeEventListener"), { rerender: h } = c(({ handleFullscreenChange: d }) => r({ handleFullscreenChange: d }), {
27
+ initialProps: { handleFullscreenChange: n }
28
+ });
29
+ t.mockClear(), s.mockClear(), n.mockClear(), h({ handleFullscreenChange: e }), await u(() => {
30
+ o(t, e), a(s, n);
31
+ });
32
+ });
33
+ });
@@ -0,0 +1,87 @@
1
+ import { r as o } from "../../../react.esm-GKFzux-6.js";
2
+ import a from "../useOverlayManagerEvents.js";
3
+ import p from "../../timer/TimedEventManager.js";
4
+ import { useOverlayManagerContext as O } from "../../context/OverlayManagerContext.js";
5
+ import { e as y } from "../../../events-B7I8KoZ9.js";
6
+ jest.mock("../../context/OverlayManagerContext");
7
+ describe("useOverlayManagerEvents", () => {
8
+ let e, u, r, m;
9
+ const n = new y.EventEmitter(), l = jest.spyOn(n, "on"), v = jest.spyOn(n, "off"), i = () => {
10
+ expect(l).toHaveBeenCalledWith("mousemoveOnOverlay", expect.any(Function)), expect(l).toHaveBeenCalledWith("mousemoveOnBoundingComponent", expect.any(Function)), expect(l).toHaveBeenCalledWith("mouseleaveOnOverlay", expect.any(Function)), expect(l).toHaveBeenCalledWith("mouseleaveOnBoundingComponent", expect.any(Function));
11
+ }, c = () => {
12
+ expect(v).toHaveBeenCalledWith("mousemoveOnOverlay", expect.any(Function)), expect(v).toHaveBeenCalledWith("mousemoveOnBoundingComponent", expect.any(Function)), expect(v).toHaveBeenCalledWith("mouseleaveOnOverlay", expect.any(Function)), expect(v).toHaveBeenCalledWith("mouseleaveOnBoundingComponent", expect.any(Function));
13
+ };
14
+ beforeEach(() => {
15
+ m = {
16
+ current: document.createElement("div")
17
+ }, O.mockReturnValue({
18
+ overlayManagerEventEmitter: n,
19
+ boundingComponentRef: m
20
+ }), e = new p({
21
+ onStart: jest.fn(),
22
+ onStop: jest.fn(),
23
+ timeoutDuration: 1e3
24
+ }), u = jest.fn(), r = jest.fn(), jest.spyOn(e, "requestStart").mockImplementation(u), jest.spyOn(e, "requestStop").mockImplementation(r);
25
+ }), afterEach(() => {
26
+ jest.clearAllMocks();
27
+ }), it("adds events when mounted", () => {
28
+ o(() => a({ timedEventManager: e })), i();
29
+ }), it("removes events when unmounted", () => {
30
+ const { unmount: t } = o(() => a({ timedEventManager: e }));
31
+ t(), c();
32
+ }), it.each([
33
+ {
34
+ eventName: "mousemoveOnOverlay",
35
+ requestStartOnMouseMove: !0
36
+ },
37
+ {
38
+ eventName: "mousemoveOnBoundingComponent",
39
+ requestStartOnMouseMove: !0
40
+ },
41
+ {
42
+ eventName: "mousemoveOnOverlay",
43
+ requestStartOnMouseMove: !1
44
+ },
45
+ {
46
+ eventName: "mousemoveOnBoundingComponent",
47
+ requestStartOnMouseMove: !1
48
+ }
49
+ ])("calls requestStart when $eventName is emitted and requestStartOnMouseMove is $requestStartOnMouseMove", ({ eventName: t, requestStartOnMouseMove: s }) => {
50
+ o(() => a({ timedEventManager: e, requestStartOnMouseMove: s })), n.emit(t), expect(u).toHaveBeenCalledTimes(s ? 1 : 0);
51
+ }), it.each([
52
+ {
53
+ eventName: "mouseleaveOnBoundingComponent",
54
+ requestStopOnMouseMove: !0
55
+ },
56
+ {
57
+ eventName: "mouseleaveOnOverlay",
58
+ requestStopOnMouseMove: !1
59
+ },
60
+ {
61
+ eventName: "mouseleaveOnBoundingComponent",
62
+ requestStopOnMouseMove: !1
63
+ }
64
+ ])("calls requestStop when $eventName is emitted and requestStopOnMouseMove is $requestStopOnMouseMove", ({ eventName: t, requestStopOnMouseMove: s }) => {
65
+ o(() => a({ timedEventManager: e, requestStopOnMouseMove: s })), n.emit(t), expect(r).toHaveBeenCalledTimes(s ? 1 : 0);
66
+ }), it("calls requestStop when mouseleaveOnOverlay is emitted and the relatedTarget is not the boundingComponent or a descendant of it", () => {
67
+ o(() => a({ timedEventManager: e }));
68
+ const t = new MouseEvent("mouseleaveOnOverlay", {
69
+ relatedTarget: document.createElement("div")
70
+ });
71
+ n.emit("mouseleaveOnOverlay", t), expect(r).toHaveBeenCalled();
72
+ }), it("does not call requestStop when mouseleaveOnOverlay is emitted but the relatedTarget is the boundingComponent", () => {
73
+ o(() => a({ timedEventManager: e }));
74
+ const t = new MouseEvent("mouseleaveOnOverlay", {
75
+ relatedTarget: m.current
76
+ });
77
+ n.emit("mouseleaveOnOverlay", t), expect(r).not.toHaveBeenCalled();
78
+ }), it("does not call requestStop when mouseleaveOnOverlay is emitted but the relatedTarget is a descendant of the boundingComponent", () => {
79
+ o(() => a({ timedEventManager: e }));
80
+ const s = m.current.appendChild(document.createElement("div")).appendChild(document.createElement("div")), d = new MouseEvent("mouseleaveOnOverlay", {
81
+ relatedTarget: s
82
+ });
83
+ n.emit("mouseleaveOnOverlay", d), expect(r).not.toHaveBeenCalled();
84
+ }), it("does not register events when timedEventManager is null", () => {
85
+ o(() => a({ timedEventManager: null })), expect(l).not.toHaveBeenCalled();
86
+ });
87
+ });
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,47 @@
1
+ import { r as a, w as i } from "../../../react.esm-GKFzux-6.js";
2
+ import o from "../useResizeObserver.js";
3
+ jest.mock("use-debounce", () => ({
4
+ useDebouncedCallback: jest.fn((t) => t)
5
+ }));
6
+ describe("useResizeObserver", () => {
7
+ let t, s;
8
+ beforeEach(() => {
9
+ t = jest.fn(), s = jest.fn(), global.ResizeObserver = jest.fn().mockImplementation(() => ({
10
+ observe: t,
11
+ disconnect: s
12
+ }));
13
+ }), afterEach(() => {
14
+ jest.clearAllMocks();
15
+ });
16
+ const c = (e) => {
17
+ expect(t).toHaveBeenCalledWith(e.current);
18
+ }, l = () => {
19
+ expect(s).toHaveBeenCalled();
20
+ };
21
+ it("observes the target element", () => {
22
+ const e = { current: {} };
23
+ a(() => o(e, { handleResize: jest.fn() })), c(e);
24
+ }), it("disconnects the observer when unmounted", () => {
25
+ const e = { current: {} }, { unmount: n } = a(() => o(e, { handleResize: jest.fn() }));
26
+ n(), l();
27
+ }), it("does not update the observer when dependecies does not change", async () => {
28
+ const e = { current: {} }, n = () => {
29
+ }, { rerender: r } = a(() => o(e, { handleResize: n }));
30
+ t.mockClear(), r(), await i(() => {
31
+ expect(t).not.toHaveBeenCalled(), expect(s).not.toHaveBeenCalled();
32
+ });
33
+ }), it("updates the observer when targetElement or handleResize changes", async () => {
34
+ const e = { current: {} }, n = jest.fn(), { rerender: r } = a(({ targetElement: m, handleResize: u }) => o(m, { handleResize: u }), {
35
+ initialProps: { targetElement: e, handleResize: n }
36
+ });
37
+ jest.clearAllMocks();
38
+ const d = jest.fn();
39
+ r({ targetElement: e, handleResize: d }), await i(() => {
40
+ c(e), l();
41
+ }), jest.clearAllMocks();
42
+ const h = { current: {} };
43
+ r({ targetElement: h, handleResize: d }), await i(() => {
44
+ c(h), l();
45
+ });
46
+ });
47
+ });
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,38 @@
1
+ import { r as t, w as d } from "../../../react.esm-GKFzux-6.js";
2
+ import l from "../useScrollOnDocument.js";
3
+ jest.mock("use-debounce", () => ({
4
+ useDebouncedCallback: jest.fn((e) => e)
5
+ }));
6
+ describe("useScrollOnDocument", () => {
7
+ const e = jest.fn();
8
+ let o, c;
9
+ const s = (n) => {
10
+ expect(o).toHaveBeenCalledWith("scroll", n);
11
+ }, r = (n) => {
12
+ expect(c).toHaveBeenCalledWith("scroll", n);
13
+ };
14
+ beforeEach(() => {
15
+ o = jest.spyOn(document, "addEventListener"), c = jest.spyOn(document, "removeEventListener");
16
+ }), afterEach(() => {
17
+ jest.clearAllMocks();
18
+ }), it("adds a debounced scroll event listener", () => {
19
+ t(() => l({ handleScroll: e })), s(e);
20
+ }), it("removes the scroll event listener when unmounted", () => {
21
+ const { unmount: n } = t(() => l({ handleScroll: e }));
22
+ n(), r(e);
23
+ }), it("dees not update the scroll event listener when handleScroll does not change", async () => {
24
+ const { rerender: n } = t(() => l({ handleScroll: e }));
25
+ o.mockClear(), n(), await d(() => {
26
+ expect(o).not.toHaveBeenCalled(), expect(c).not.toHaveBeenCalled();
27
+ });
28
+ }), it("updates the scroll event listener when handleScroll changes", async () => {
29
+ const { rerender: n } = t(({ handleScroll: i }) => l({ handleScroll: i }), {
30
+ initialProps: { handleScroll: e }
31
+ }), a = jest.fn();
32
+ n({ handleScroll: a }), await d(() => {
33
+ r(e), s(a);
34
+ });
35
+ }), it("calls handleScroll on scroll on document", () => {
36
+ t(() => l({ handleScroll: e })), document.dispatchEvent(new Event("scroll")), expect(e).toHaveBeenCalled();
37
+ });
38
+ });
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,41 @@
1
+ import { r as o } from "../../../react.esm-GKFzux-6.js";
2
+ import r from "../useTimedEventManager.js";
3
+ import c, { NO_TIMEOUT as m } from "../../timer/TimedEventManager.js";
4
+ const i = jest.fn();
5
+ c.prototype.requestStop = i;
6
+ describe("useTimedEventManager", () => {
7
+ let e, n;
8
+ beforeEach(() => {
9
+ e = jest.fn(), n = jest.fn();
10
+ }), it("should return null when returnNull is true", () => {
11
+ const { result: t } = o(() => r({ onStart: e, onStop: n, timeoutDuration: 1e3, returnNull: !0 }));
12
+ expect(t.current).toBeNull();
13
+ }), it("should create a new TimedEventManager instance when returnNull is false", () => {
14
+ const { result: t } = o(() => r({ onStart: e, onStop: n, timeoutDuration: 1e3, returnNull: !1 }));
15
+ expect(t.current).toBeInstanceOf(c);
16
+ }), it("should call requestStop on unmount", () => {
17
+ const { unmount: t } = o(() => r({ onStart: e, onStop: n, timeoutDuration: 1e3 }));
18
+ t(), expect(i).toHaveBeenCalled();
19
+ }), it("should reuse the same TimedEventManager instance if dependencies are unchanged", () => {
20
+ const { result: t, rerender: u } = o(
21
+ () => r({ onStart: e, onStop: n, timeoutDuration: 1e3 })
22
+ ), a = t.current;
23
+ u();
24
+ const s = t.current;
25
+ expect(a).toBe(s);
26
+ }), it("should create a new instance when a dependency changes", () => {
27
+ let t = 1e3;
28
+ const { result: u, rerender: a } = o(
29
+ ({ timeoutDuration: d }) => r({ onStart: e, onStop: n, timeoutDuration: d }),
30
+ {
31
+ initialProps: { timeoutDuration: t }
32
+ }
33
+ ), s = u.current;
34
+ t = 2e3, a({ timeoutDuration: t });
35
+ const l = u.current;
36
+ expect(s).not.toBe(l);
37
+ }), it("should handle NO_TIMEOUT case correctly", () => {
38
+ const { result: t } = o(() => r({ onStart: e, onStop: n, timeoutDuration: m }));
39
+ expect(t.current).toBeDefined(), expect(t.current).toBeInstanceOf(c);
40
+ });
41
+ });
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,38 @@
1
+ import { r as t, w as l } from "../../../react.esm-GKFzux-6.js";
2
+ import s from "../useWindowResize.js";
3
+ jest.mock("use-debounce", () => ({
4
+ useDebouncedCallback: jest.fn((e) => e)
5
+ }));
6
+ describe("useWindowResize", () => {
7
+ const e = jest.fn();
8
+ let i, a;
9
+ const o = (n) => {
10
+ expect(i).toHaveBeenCalledWith("resize", n);
11
+ }, r = (n) => {
12
+ expect(a).toHaveBeenCalledWith("resize", n);
13
+ };
14
+ beforeEach(() => {
15
+ i = jest.spyOn(window, "addEventListener"), a = jest.spyOn(window, "removeEventListener");
16
+ }), afterEach(() => {
17
+ jest.clearAllMocks();
18
+ }), it("adds a debounced resize event listener", () => {
19
+ t(() => s({ handleResize: e })), o(e);
20
+ }), it("removes the resize event listener when unmounted", () => {
21
+ const { unmount: n } = t(() => s({ handleResize: e }));
22
+ n(), r(e);
23
+ }), it("dees not update the resize event listener when handleResize does not change", async () => {
24
+ const { rerender: n } = t(() => s({ handleResize: e }));
25
+ i.mockClear(), n(), await l(() => {
26
+ expect(i).not.toHaveBeenCalled(), expect(a).not.toHaveBeenCalled();
27
+ });
28
+ }), it("updates the resize event listener when handleResize changes", async () => {
29
+ const { rerender: n } = t(({ handleResize: c }) => s({ handleResize: c }), {
30
+ initialProps: { handleResize: e }
31
+ }), d = jest.fn();
32
+ n({ handleResize: d }), await l(() => {
33
+ r(e), o(d);
34
+ });
35
+ }), it("calls handleResize on window resize", () => {
36
+ t(() => s({ handleResize: e })), window.dispatchEvent(new Event("resize")), expect(e).toHaveBeenCalled();
37
+ });
38
+ });
@@ -0,0 +1,7 @@
1
+ export declare const makeEventOnlyMockComponentRef: () => {
2
+ current: {
3
+ addEventListener: jest.Mock<any, any, any>;
4
+ removeEventListener: jest.Mock<any, any, any>;
5
+ dispatchEvent: jest.Mock<any, any, any>;
6
+ };
7
+ };
@@ -0,0 +1,20 @@
1
+ import { e as o } from "../../../events-B7I8KoZ9.js";
2
+ const r = () => {
3
+ const t = new o.EventEmitter();
4
+ return {
5
+ current: {
6
+ addEventListener: jest.fn().mockImplementation((e, n) => {
7
+ t.on(e, n);
8
+ }),
9
+ removeEventListener: jest.fn().mockImplementation((e, n) => {
10
+ t.off(e, n);
11
+ }),
12
+ dispatchEvent: jest.fn().mockImplementation((e) => {
13
+ t.emit(e.type, e);
14
+ })
15
+ }
16
+ };
17
+ };
18
+ export {
19
+ r as makeEventOnlyMockComponentRef
20
+ };
@@ -0,0 +1,6 @@
1
+ import BoundedOverlayManagerApi, { BoundedOverlayManagerApiOptions } from "../api/BoundedOverlayManagerApi";
2
+ type Options = BoundedOverlayManagerApiOptions & {
3
+ onApiUpdated?: (api: BoundedOverlayManagerApi) => void;
4
+ };
5
+ declare const useApiUpdateHandler: ({ timedEventManager, onApiUpdated, updateOverlaysContainerBoundingBox }: Options) => void;
6
+ export default useApiUpdateHandler;
@@ -0,0 +1,10 @@
1
+ import { useEffect as m } from "react";
2
+ import s from "../api/BoundedOverlayManagerApi.js";
3
+ const l = ({ timedEventManager: f, onApiUpdated: r, updateOverlaysContainerBoundingBox: e }) => {
4
+ m(() => {
5
+ r && r(new s({ timedEventManager: f, updateOverlaysContainerBoundingBox: e }));
6
+ }, [f, r, e]);
7
+ };
8
+ export {
9
+ l as default
10
+ };
@@ -0,0 +1,2 @@
1
+ declare const useForwardBoundingComponentEvents: () => void;
2
+ export default useForwardBoundingComponentEvents;
@@ -0,0 +1,20 @@
1
+ import { useEffect as u } from "react";
2
+ import { useOverlayManagerContext as v } from "../context/OverlayManagerContext.js";
3
+ const i = () => {
4
+ const { overlayManagerEventEmitter: r, boundingComponentRef: e } = v(), a = () => {
5
+ r.emit("mousemoveOnBoundingComponent");
6
+ }, s = (t) => {
7
+ var n;
8
+ (n = t.relatedTarget) != null && n.closest(".overlay") || r.emit("mouseleaveOnBoundingComponent");
9
+ };
10
+ u(() => {
11
+ var t, o;
12
+ return (t = e.current) == null || t.addEventListener("mousemove", a), (o = e.current) == null || o.addEventListener("mouseleave", s), () => {
13
+ var n, m;
14
+ (n = e.current) == null || n.removeEventListener("mousemove", a), (m = e.current) == null || m.removeEventListener("mouseleave", s);
15
+ };
16
+ }, [e]);
17
+ };
18
+ export {
19
+ i as default
20
+ };
@@ -0,0 +1,6 @@
1
+ /// <reference types="react" />
2
+ type Options = {
3
+ overlayRef: React.RefObject<HTMLElement>;
4
+ };
5
+ declare const useForwardOverlayEvents: ({ overlayRef }: Options) => void;
6
+ export default useForwardOverlayEvents;