@monstermann/signals-modal 0.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (125) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +9 -0
  3. package/dist/anchor/getAnchorElement.d.ts +4 -0
  4. package/dist/anchor/getAnchorElement.js +9 -0
  5. package/dist/anchor/getAnchorMeasurement.d.ts +6 -0
  6. package/dist/anchor/getAnchorMeasurement.js +10 -0
  7. package/dist/anchor/internals.js +19 -0
  8. package/dist/anchor/setAnchorElement.d.ts +4 -0
  9. package/dist/anchor/setAnchorElement.js +9 -0
  10. package/dist/anchor/withAnchorElement.d.ts +6 -0
  11. package/dist/anchor/withAnchorElement.js +32 -0
  12. package/dist/anchor/withAnchorMeasurement.d.ts +12 -0
  13. package/dist/anchor/withAnchorMeasurement.js +56 -0
  14. package/dist/anchor/withMouseAnchor.d.ts +11 -0
  15. package/dist/anchor/withMouseAnchor.js +57 -0
  16. package/dist/createModal.d.ts +14 -0
  17. package/dist/createModal.js +47 -0
  18. package/dist/floating/getFloatingElement.d.ts +4 -0
  19. package/dist/floating/getFloatingElement.js +9 -0
  20. package/dist/floating/getFloatingMeasurement.d.ts +6 -0
  21. package/dist/floating/getFloatingMeasurement.js +10 -0
  22. package/dist/floating/internals.js +19 -0
  23. package/dist/floating/setFloatingElement.d.ts +4 -0
  24. package/dist/floating/setFloatingElement.js +9 -0
  25. package/dist/floating/withFloatingElement.d.ts +6 -0
  26. package/dist/floating/withFloatingElement.js +32 -0
  27. package/dist/floating/withFloatingMeasurement.d.ts +12 -0
  28. package/dist/floating/withFloatingMeasurement.js +67 -0
  29. package/dist/groups/getDialogs.d.ts +4 -0
  30. package/dist/groups/getDialogs.js +10 -0
  31. package/dist/groups/getGroupsForModal.d.ts +4 -0
  32. package/dist/groups/getGroupsForModal.js +10 -0
  33. package/dist/groups/getModalsForGroup.d.ts +4 -0
  34. package/dist/groups/getModalsForGroup.js +10 -0
  35. package/dist/groups/getPopovers.d.ts +4 -0
  36. package/dist/groups/getPopovers.js +10 -0
  37. package/dist/groups/getTooltips.d.ts +4 -0
  38. package/dist/groups/getTooltips.js +10 -0
  39. package/dist/groups/internals.js +26 -0
  40. package/dist/groups/isDialog.d.ts +4 -0
  41. package/dist/groups/isDialog.js +10 -0
  42. package/dist/groups/isModalInGroup.d.ts +4 -0
  43. package/dist/groups/isModalInGroup.js +9 -0
  44. package/dist/groups/isPopover.d.ts +4 -0
  45. package/dist/groups/isPopover.js +10 -0
  46. package/dist/groups/isTooltip.d.ts +4 -0
  47. package/dist/groups/isTooltip.js +10 -0
  48. package/dist/groups/modalGroups.d.ts +8 -0
  49. package/dist/groups/modalGroups.js +9 -0
  50. package/dist/groups/withModalGroups.d.ts +6 -0
  51. package/dist/groups/withModalGroups.js +29 -0
  52. package/dist/index.d.ts +57 -0
  53. package/dist/index.js +57 -0
  54. package/dist/internals/findParentElement.js +9 -0
  55. package/dist/internals/observeDimensions.js +23 -0
  56. package/dist/internals/observePosition.js +44 -0
  57. package/dist/internals/roundByDPR.js +8 -0
  58. package/dist/position/getModalPosition.d.ts +6 -0
  59. package/dist/position/getModalPosition.js +9 -0
  60. package/dist/position/internals.js +32 -0
  61. package/dist/position/withBoundary.d.ts +11 -0
  62. package/dist/position/withBoundary.js +45 -0
  63. package/dist/position/withPlacement.d.ts +14 -0
  64. package/dist/position/withPlacement.js +75 -0
  65. package/dist/position/withPosition.d.ts +22 -0
  66. package/dist/position/withPosition.js +207 -0
  67. package/dist/status/closeAllModals.d.ts +4 -0
  68. package/dist/status/closeAllModals.js +16 -0
  69. package/dist/status/closeModal.d.ts +4 -0
  70. package/dist/status/closeModal.js +16 -0
  71. package/dist/status/getClosedModals.d.ts +4 -0
  72. package/dist/status/getClosedModals.js +12 -0
  73. package/dist/status/getClosingModals.d.ts +4 -0
  74. package/dist/status/getClosingModals.js +12 -0
  75. package/dist/status/getModalStatus.d.ts +6 -0
  76. package/dist/status/getModalStatus.js +9 -0
  77. package/dist/status/getOpenedModals.d.ts +4 -0
  78. package/dist/status/getOpenedModals.js +12 -0
  79. package/dist/status/getOpeningModals.d.ts +4 -0
  80. package/dist/status/getOpeningModals.js +12 -0
  81. package/dist/status/getVisibleModals.d.ts +4 -0
  82. package/dist/status/getVisibleModals.js +12 -0
  83. package/dist/status/internals.js +30 -0
  84. package/dist/status/isAnyModalClosed.d.ts +4 -0
  85. package/dist/status/isAnyModalClosed.js +9 -0
  86. package/dist/status/isAnyModalClosing.d.ts +4 -0
  87. package/dist/status/isAnyModalClosing.js +9 -0
  88. package/dist/status/isAnyModalOpened.d.ts +4 -0
  89. package/dist/status/isAnyModalOpened.js +9 -0
  90. package/dist/status/isAnyModalOpening.d.ts +4 -0
  91. package/dist/status/isAnyModalOpening.js +9 -0
  92. package/dist/status/isAnyModalVisible.d.ts +4 -0
  93. package/dist/status/isAnyModalVisible.js +9 -0
  94. package/dist/status/isModalClosed.d.ts +4 -0
  95. package/dist/status/isModalClosed.js +10 -0
  96. package/dist/status/isModalClosing.d.ts +4 -0
  97. package/dist/status/isModalClosing.js +9 -0
  98. package/dist/status/isModalOpened.d.ts +4 -0
  99. package/dist/status/isModalOpened.js +9 -0
  100. package/dist/status/isModalOpening.d.ts +4 -0
  101. package/dist/status/isModalOpening.js +9 -0
  102. package/dist/status/isModalVisible.d.ts +4 -0
  103. package/dist/status/isModalVisible.js +9 -0
  104. package/dist/status/onModalClosed.d.ts +6 -0
  105. package/dist/status/onModalClosed.js +12 -0
  106. package/dist/status/onModalClosing.d.ts +6 -0
  107. package/dist/status/onModalClosing.js +12 -0
  108. package/dist/status/onModalOpened.d.ts +6 -0
  109. package/dist/status/onModalOpened.js +12 -0
  110. package/dist/status/onModalOpening.d.ts +6 -0
  111. package/dist/status/onModalOpening.js +12 -0
  112. package/dist/status/openModal.d.ts +4 -0
  113. package/dist/status/openModal.js +16 -0
  114. package/dist/status/setModalStatus.d.ts +6 -0
  115. package/dist/status/setModalStatus.js +9 -0
  116. package/dist/status/types.d.ts +4 -0
  117. package/dist/status/withModalStatus.d.ts +7 -0
  118. package/dist/status/withModalStatus.js +38 -0
  119. package/dist/utils/closeLastModalOnClickOutside.d.ts +4 -0
  120. package/dist/utils/closeLastModalOnClickOutside.js +19 -0
  121. package/dist/utils/closeLastModalOnEsc.d.ts +4 -0
  122. package/dist/utils/closeLastModalOnEsc.js +17 -0
  123. package/dist/utils/syncModalGroupsToBody.d.ts +4 -0
  124. package/dist/utils/syncModalGroupsToBody.js +24 -0
  125. package/package.json +43 -0
@@ -0,0 +1,4 @@
1
+ //#region src/groups/isDialog.d.ts
2
+ declare function isDialog(key: string): boolean;
3
+ //#endregion
4
+ export { isDialog };
@@ -0,0 +1,10 @@
1
+ import { modalGroups } from "./modalGroups.js";
2
+ import { getGroupsForModal } from "./getGroupsForModal.js";
3
+
4
+ //#region src/groups/isDialog.ts
5
+ function isDialog(key) {
6
+ return getGroupsForModal(key).has(modalGroups.dialog);
7
+ }
8
+
9
+ //#endregion
10
+ export { isDialog };
@@ -0,0 +1,4 @@
1
+ //#region src/groups/isModalInGroup.d.ts
2
+ declare function isModalInGroup(key: string, group: string): boolean;
3
+ //#endregion
4
+ export { isModalInGroup };
@@ -0,0 +1,9 @@
1
+ import { getGroupsForModal } from "./getGroupsForModal.js";
2
+
3
+ //#region src/groups/isModalInGroup.ts
4
+ function isModalInGroup(key, group) {
5
+ return getGroupsForModal(key).has(group);
6
+ }
7
+
8
+ //#endregion
9
+ export { isModalInGroup };
@@ -0,0 +1,4 @@
1
+ //#region src/groups/isPopover.d.ts
2
+ declare function isPopover(key: string): boolean;
3
+ //#endregion
4
+ export { isPopover };
@@ -0,0 +1,10 @@
1
+ import { modalGroups } from "./modalGroups.js";
2
+ import { getGroupsForModal } from "./getGroupsForModal.js";
3
+
4
+ //#region src/groups/isPopover.ts
5
+ function isPopover(key) {
6
+ return getGroupsForModal(key).has(modalGroups.popover);
7
+ }
8
+
9
+ //#endregion
10
+ export { isPopover };
@@ -0,0 +1,4 @@
1
+ //#region src/groups/isTooltip.d.ts
2
+ declare function isTooltip(key: string): boolean;
3
+ //#endregion
4
+ export { isTooltip };
@@ -0,0 +1,10 @@
1
+ import { modalGroups } from "./modalGroups.js";
2
+ import { getGroupsForModal } from "./getGroupsForModal.js";
3
+
4
+ //#region src/groups/isTooltip.ts
5
+ function isTooltip(key) {
6
+ return getGroupsForModal(key).has(modalGroups.tooltip);
7
+ }
8
+
9
+ //#endregion
10
+ export { isTooltip };
@@ -0,0 +1,8 @@
1
+ //#region src/groups/modalGroups.d.ts
2
+ declare const modalGroups: {
3
+ dialog: string;
4
+ popover: string;
5
+ tooltip: string;
6
+ };
7
+ //#endregion
8
+ export { modalGroups };
@@ -0,0 +1,9 @@
1
+ //#region src/groups/modalGroups.ts
2
+ const modalGroups = {
3
+ dialog: "dialog",
4
+ popover: "popover",
5
+ tooltip: "tooltip"
6
+ };
7
+
8
+ //#endregion
9
+ export { modalGroups };
@@ -0,0 +1,6 @@
1
+ import { Memo } from "@monstermann/signals";
2
+
3
+ //#region src/groups/withModalGroups.d.ts
4
+ declare function withModalGroups(groups: Iterable<string>): Memo<ReadonlySet<string>>;
5
+ //#endregion
6
+ export { withModalGroups };
@@ -0,0 +1,29 @@
1
+ import { set } from "../node_modules/@monstermann/map/dist/Map/set.js";
2
+ import { remove } from "../node_modules/@monstermann/map/dist/Map/remove.js";
3
+ import { create } from "../node_modules/@monstermann/set/dist/Set/create.js";
4
+ import { currentModal } from "../createModal.js";
5
+ import { $keysToGroups } from "./internals.js";
6
+ import { getGroupsForModal } from "./getGroupsForModal.js";
7
+ import { mapOrElse } from "../node_modules/@monstermann/map/dist/Map/mapOrElse.js";
8
+ import { addAll } from "../node_modules/@monstermann/set/dist/Set/addAll.js";
9
+ import { INTERNAL, memo } from "@monstermann/signals";
10
+
11
+ //#region src/groups/withModalGroups.ts
12
+ const meta = {
13
+ path: "@signals-modal/groups/withModalGroups.ts",
14
+ line: 28,
15
+ name: "withModalGroups"
16
+ };
17
+ function withModalGroups(groups) {
18
+ const modal = currentModal();
19
+ $keysToGroups((keys) => {
20
+ return mapOrElse(keys, modal.key, (set$1) => addAll(set$1, groups), (map) => set(map, modal.key, create(groups)));
21
+ });
22
+ modal.onDispose(() => {
23
+ $keysToGroups((keys) => remove(keys, modal.key));
24
+ });
25
+ return memo(() => getGroupsForModal(modal.key), INTERNAL, meta);
26
+ }
27
+
28
+ //#endregion
29
+ export { withModalGroups };
@@ -0,0 +1,57 @@
1
+ import { getAnchorElement } from "./anchor/getAnchorElement.js";
2
+ import { getAnchorMeasurement } from "./anchor/getAnchorMeasurement.js";
3
+ import { setAnchorElement } from "./anchor/setAnchorElement.js";
4
+ import { withAnchorElement } from "./anchor/withAnchorElement.js";
5
+ import { ModalStatus } from "./status/types.js";
6
+ import { withAnchorMeasurement } from "./anchor/withAnchorMeasurement.js";
7
+ import { withMouseAnchor } from "./anchor/withMouseAnchor.js";
8
+ import { ModalContext, createModal, currentModal, onModalDisposed } from "./createModal.js";
9
+ import { getFloatingElement } from "./floating/getFloatingElement.js";
10
+ import { getFloatingMeasurement } from "./floating/getFloatingMeasurement.js";
11
+ import { setFloatingElement } from "./floating/setFloatingElement.js";
12
+ import { withFloatingElement } from "./floating/withFloatingElement.js";
13
+ import { withFloatingMeasurement } from "./floating/withFloatingMeasurement.js";
14
+ import { getDialogs } from "./groups/getDialogs.js";
15
+ import { getGroupsForModal } from "./groups/getGroupsForModal.js";
16
+ import { getModalsForGroup } from "./groups/getModalsForGroup.js";
17
+ import { getPopovers } from "./groups/getPopovers.js";
18
+ import { getTooltips } from "./groups/getTooltips.js";
19
+ import { isDialog } from "./groups/isDialog.js";
20
+ import { isModalInGroup } from "./groups/isModalInGroup.js";
21
+ import { isPopover } from "./groups/isPopover.js";
22
+ import { isTooltip } from "./groups/isTooltip.js";
23
+ import { modalGroups } from "./groups/modalGroups.js";
24
+ import { withModalGroups } from "./groups/withModalGroups.js";
25
+ import { ModalPlacement, ModalPlacementOption, withPlacement } from "./position/withPlacement.js";
26
+ import { ModalPosition, withPosition } from "./position/withPosition.js";
27
+ import { getModalPosition } from "./position/getModalPosition.js";
28
+ import { withBoundary } from "./position/withBoundary.js";
29
+ import { closeAllModals } from "./status/closeAllModals.js";
30
+ import { closeModal } from "./status/closeModal.js";
31
+ import { getClosedModals } from "./status/getClosedModals.js";
32
+ import { getClosingModals } from "./status/getClosingModals.js";
33
+ import { getModalStatus } from "./status/getModalStatus.js";
34
+ import { getOpenedModals } from "./status/getOpenedModals.js";
35
+ import { getOpeningModals } from "./status/getOpeningModals.js";
36
+ import { getVisibleModals } from "./status/getVisibleModals.js";
37
+ import { isAnyModalClosed } from "./status/isAnyModalClosed.js";
38
+ import { isAnyModalClosing } from "./status/isAnyModalClosing.js";
39
+ import { isAnyModalOpened } from "./status/isAnyModalOpened.js";
40
+ import { isAnyModalOpening } from "./status/isAnyModalOpening.js";
41
+ import { isAnyModalVisible } from "./status/isAnyModalVisible.js";
42
+ import { isModalClosed } from "./status/isModalClosed.js";
43
+ import { isModalClosing } from "./status/isModalClosing.js";
44
+ import { isModalOpened } from "./status/isModalOpened.js";
45
+ import { isModalOpening } from "./status/isModalOpening.js";
46
+ import { isModalVisible } from "./status/isModalVisible.js";
47
+ import { onModalClosed } from "./status/onModalClosed.js";
48
+ import { onModalClosing } from "./status/onModalClosing.js";
49
+ import { onModalOpened } from "./status/onModalOpened.js";
50
+ import { onModalOpening } from "./status/onModalOpening.js";
51
+ import { openModal } from "./status/openModal.js";
52
+ import { setModalStatus } from "./status/setModalStatus.js";
53
+ import { withModalStatus } from "./status/withModalStatus.js";
54
+ import { closeLastModalOnClickOutside } from "./utils/closeLastModalOnClickOutside.js";
55
+ import { closeLastModalOnEsc } from "./utils/closeLastModalOnEsc.js";
56
+ import { syncModalGroupsToBody } from "./utils/syncModalGroupsToBody.js";
57
+ export { ModalContext, ModalPlacement, ModalPlacementOption, ModalPosition, ModalStatus, closeAllModals, closeLastModalOnClickOutside, closeLastModalOnEsc, closeModal, createModal, currentModal, getAnchorElement, getAnchorMeasurement, getClosedModals, getClosingModals, getDialogs, getFloatingElement, getFloatingMeasurement, getGroupsForModal, getModalPosition, getModalStatus, getModalsForGroup, getOpenedModals, getOpeningModals, getPopovers, getTooltips, getVisibleModals, isAnyModalClosed, isAnyModalClosing, isAnyModalOpened, isAnyModalOpening, isAnyModalVisible, isDialog, isModalClosed, isModalClosing, isModalInGroup, isModalOpened, isModalOpening, isModalVisible, isPopover, isTooltip, modalGroups, onModalClosed, onModalClosing, onModalDisposed, onModalOpened, onModalOpening, openModal, setAnchorElement, setFloatingElement, setModalStatus, syncModalGroupsToBody, withAnchorElement, withAnchorMeasurement, withBoundary, withFloatingElement, withFloatingMeasurement, withModalGroups, withModalStatus, withMouseAnchor, withPlacement, withPosition };
package/dist/index.js ADDED
@@ -0,0 +1,57 @@
1
+ import { getAnchorElement } from "./anchor/getAnchorElement.js";
2
+ import { getAnchorMeasurement } from "./anchor/getAnchorMeasurement.js";
3
+ import { setAnchorElement } from "./anchor/setAnchorElement.js";
4
+ import { onModalClosed } from "./status/onModalClosed.js";
5
+ import { onModalOpened } from "./status/onModalOpened.js";
6
+ import { onModalOpening } from "./status/onModalOpening.js";
7
+ import { closeModal } from "./status/closeModal.js";
8
+ import { isModalClosed } from "./status/isModalClosed.js";
9
+ import { createModal, currentModal, onModalDisposed } from "./createModal.js";
10
+ import { withAnchorElement } from "./anchor/withAnchorElement.js";
11
+ import { withAnchorMeasurement } from "./anchor/withAnchorMeasurement.js";
12
+ import { withMouseAnchor } from "./anchor/withMouseAnchor.js";
13
+ import { getFloatingElement } from "./floating/getFloatingElement.js";
14
+ import { getFloatingMeasurement } from "./floating/getFloatingMeasurement.js";
15
+ import { setFloatingElement } from "./floating/setFloatingElement.js";
16
+ import { withFloatingElement } from "./floating/withFloatingElement.js";
17
+ import { withFloatingMeasurement } from "./floating/withFloatingMeasurement.js";
18
+ import { getModalsForGroup } from "./groups/getModalsForGroup.js";
19
+ import { modalGroups } from "./groups/modalGroups.js";
20
+ import { getDialogs } from "./groups/getDialogs.js";
21
+ import { getGroupsForModal } from "./groups/getGroupsForModal.js";
22
+ import { getPopovers } from "./groups/getPopovers.js";
23
+ import { getTooltips } from "./groups/getTooltips.js";
24
+ import { isDialog } from "./groups/isDialog.js";
25
+ import { isModalInGroup } from "./groups/isModalInGroup.js";
26
+ import { isPopover } from "./groups/isPopover.js";
27
+ import { isTooltip } from "./groups/isTooltip.js";
28
+ import { withModalGroups } from "./groups/withModalGroups.js";
29
+ import { getModalPosition } from "./position/getModalPosition.js";
30
+ import { withBoundary } from "./position/withBoundary.js";
31
+ import { withPlacement } from "./position/withPlacement.js";
32
+ import { withPosition } from "./position/withPosition.js";
33
+ import { closeAllModals } from "./status/closeAllModals.js";
34
+ import { getClosedModals } from "./status/getClosedModals.js";
35
+ import { getClosingModals } from "./status/getClosingModals.js";
36
+ import { getModalStatus } from "./status/getModalStatus.js";
37
+ import { getOpenedModals } from "./status/getOpenedModals.js";
38
+ import { getOpeningModals } from "./status/getOpeningModals.js";
39
+ import { getVisibleModals } from "./status/getVisibleModals.js";
40
+ import { isAnyModalClosed } from "./status/isAnyModalClosed.js";
41
+ import { isAnyModalClosing } from "./status/isAnyModalClosing.js";
42
+ import { isAnyModalOpened } from "./status/isAnyModalOpened.js";
43
+ import { isAnyModalOpening } from "./status/isAnyModalOpening.js";
44
+ import { isAnyModalVisible } from "./status/isAnyModalVisible.js";
45
+ import { isModalClosing } from "./status/isModalClosing.js";
46
+ import { isModalOpened } from "./status/isModalOpened.js";
47
+ import { isModalOpening } from "./status/isModalOpening.js";
48
+ import { isModalVisible } from "./status/isModalVisible.js";
49
+ import { onModalClosing } from "./status/onModalClosing.js";
50
+ import { openModal } from "./status/openModal.js";
51
+ import { setModalStatus } from "./status/setModalStatus.js";
52
+ import { withModalStatus } from "./status/withModalStatus.js";
53
+ import { closeLastModalOnClickOutside } from "./utils/closeLastModalOnClickOutside.js";
54
+ import { closeLastModalOnEsc } from "./utils/closeLastModalOnEsc.js";
55
+ import { syncModalGroupsToBody } from "./utils/syncModalGroupsToBody.js";
56
+
57
+ export { closeAllModals, closeLastModalOnClickOutside, closeLastModalOnEsc, closeModal, createModal, currentModal, getAnchorElement, getAnchorMeasurement, getClosedModals, getClosingModals, getDialogs, getFloatingElement, getFloatingMeasurement, getGroupsForModal, getModalPosition, getModalStatus, getModalsForGroup, getOpenedModals, getOpeningModals, getPopovers, getTooltips, getVisibleModals, isAnyModalClosed, isAnyModalClosing, isAnyModalOpened, isAnyModalOpening, isAnyModalVisible, isDialog, isModalClosed, isModalClosing, isModalInGroup, isModalOpened, isModalOpening, isModalVisible, isPopover, isTooltip, modalGroups, onModalClosed, onModalClosing, onModalDisposed, onModalOpened, onModalOpening, openModal, setAnchorElement, setFloatingElement, setModalStatus, syncModalGroupsToBody, withAnchorElement, withAnchorMeasurement, withBoundary, withFloatingElement, withFloatingMeasurement, withModalGroups, withModalStatus, withMouseAnchor, withPlacement, withPosition };
@@ -0,0 +1,9 @@
1
+ //#region src/internals/findParentElement.ts
2
+ function findParentElement(element, predicate) {
3
+ if (!element) return void 0;
4
+ if (predicate(element)) return element;
5
+ return findParentElement(element.parentElement, predicate);
6
+ }
7
+
8
+ //#endregion
9
+ export { findParentElement };
@@ -0,0 +1,23 @@
1
+ //#region src/internals/observeDimensions.ts
2
+ const observers = /* @__PURE__ */ new WeakMap();
3
+ const ro = new ResizeObserver((entries) => {
4
+ for (const entry of entries) {
5
+ const callbacks = observers.get(entry.target) ?? [];
6
+ for (const cb of callbacks) cb(entry.contentRect);
7
+ }
8
+ });
9
+ function observeDimensions(element, onResize) {
10
+ const callbacks = observers.get(element) ?? /* @__PURE__ */ new Set();
11
+ callbacks.add(onResize);
12
+ observers.set(element, callbacks);
13
+ ro.observe(element);
14
+ return () => {
15
+ const callbacks$1 = observers.get(element);
16
+ callbacks$1?.delete(onResize);
17
+ if (callbacks$1 && callbacks$1.size > 0) return;
18
+ ro.unobserve(element);
19
+ };
20
+ }
21
+
22
+ //#endregion
23
+ export { observeDimensions };
@@ -0,0 +1,44 @@
1
+ //#region src/internals/observePosition.ts
2
+ function observePosition(element, onMove) {
3
+ let io = null;
4
+ let tid;
5
+ function cleanup() {
6
+ clearTimeout(tid);
7
+ io?.disconnect();
8
+ io = null;
9
+ }
10
+ function refresh(skip = false, threshold = 1) {
11
+ cleanup();
12
+ const elementRect = element.getBoundingClientRect();
13
+ const { height, left, top, width } = elementRect;
14
+ if (!skip) onMove(elementRect);
15
+ if (!width || !height) return;
16
+ const insetTop = Math.floor(top);
17
+ const insetRight = Math.floor(window.innerWidth - (left + width));
18
+ const insetBottom = Math.floor(window.innerHeight - (top + height));
19
+ const insetLeft = Math.floor(left);
20
+ const rootMargin = `${-insetTop}px ${-insetRight}px ${-insetBottom}px ${-insetLeft}px`;
21
+ let isFirstUpdate = true;
22
+ function handleObserve(entries) {
23
+ const ratio = entries[0].intersectionRatio;
24
+ if (ratio !== threshold && !isFirstUpdate) return refresh();
25
+ if (ratio !== threshold && ratio === 0) tid = setTimeout(() => refresh(false, 1e-7), 1e3);
26
+ if (ratio !== threshold && ratio !== 0) refresh(false, ratio);
27
+ if (ratio === 1 && !rectsEqual(elementRect, element.getBoundingClientRect())) refresh();
28
+ isFirstUpdate = false;
29
+ }
30
+ io = new IntersectionObserver(handleObserve, {
31
+ rootMargin,
32
+ threshold: Math.max(0, Math.min(1, threshold)) || 1
33
+ });
34
+ io.observe(element);
35
+ }
36
+ refresh(true);
37
+ return cleanup;
38
+ }
39
+ function rectsEqual(a, b) {
40
+ return a.top === b.top && a.left === b.left && a.width === b.width && a.height === b.height;
41
+ }
42
+
43
+ //#endregion
44
+ export { observePosition };
@@ -0,0 +1,8 @@
1
+ //#region src/internals/roundByDPR.ts
2
+ function roundByDPR(value) {
3
+ const dpr = window.devicePixelRatio || 1;
4
+ return Math.round(value * dpr) / dpr;
5
+ }
6
+
7
+ //#endregion
8
+ export { roundByDPR };
@@ -0,0 +1,6 @@
1
+ import { ModalPosition } from "./withPosition.js";
2
+
3
+ //#region src/position/getModalPosition.d.ts
4
+ declare function getModalPosition(key: string): ModalPosition | undefined;
5
+ //#endregion
6
+ export { getModalPosition };
@@ -0,0 +1,9 @@
1
+ import { $positions } from "./internals.js";
2
+
3
+ //#region src/position/getModalPosition.ts
4
+ function getModalPosition(key) {
5
+ return $positions().get(key);
6
+ }
7
+
8
+ //#endregion
9
+ export { getModalPosition };
@@ -0,0 +1,32 @@
1
+ import { SILENT, signal } from "@monstermann/signals";
2
+ import { Rect } from "@monstermann/fn";
3
+
4
+ //#region src/position/internals.ts
5
+ const path = "@signals-modal/position/internals.ts";
6
+ const meta = {
7
+ path,
8
+ line: 6,
9
+ name: "$positions"
10
+ };
11
+ const meta1 = {
12
+ path,
13
+ line: 7,
14
+ name: "$placements"
15
+ };
16
+ const $positions = signal(/* @__PURE__ */ new Map(), SILENT, meta);
17
+ const $placements = signal(/* @__PURE__ */ new Map(), SILENT, meta1);
18
+ function getBoundaryUp(boundary, anchor) {
19
+ return Rect.setBottom(boundary, Rect.top(anchor));
20
+ }
21
+ function getBoundaryDown(boundary, anchor) {
22
+ return Rect.setTop(boundary, Rect.bottom(anchor));
23
+ }
24
+ function getBoundaryLeft(boundary, anchor) {
25
+ return Rect.setRight(boundary, Rect.left(anchor));
26
+ }
27
+ function getBoundaryRight(boundary, anchor) {
28
+ return Rect.setLeft(boundary, Rect.right(anchor));
29
+ }
30
+
31
+ //#endregion
32
+ export { $placements, $positions, getBoundaryDown, getBoundaryLeft, getBoundaryRight, getBoundaryUp };
@@ -0,0 +1,11 @@
1
+ import { ModalStatus } from "../status/types.js";
2
+ import { Memo, Reactive } from "@monstermann/signals";
3
+ import { Rect } from "@monstermann/fn";
4
+
5
+ //#region src/position/withBoundary.d.ts
6
+ declare function withBoundary(options: {
7
+ $status: Reactive<ModalStatus>;
8
+ transform?: (rect: Rect) => Rect;
9
+ }): Memo<Rect>;
10
+ //#endregion
11
+ export { withBoundary };
@@ -0,0 +1,45 @@
1
+ import { currentModal } from "../createModal.js";
2
+ import { INTERNAL, effect, memo, signal } from "@monstermann/signals";
3
+ import { Rect } from "@monstermann/fn";
4
+
5
+ //#region src/position/withBoundary.ts
6
+ const path = "@signals-modal/position/withBoundary.ts";
7
+ const meta = {
8
+ path,
9
+ line: 13,
10
+ name: "withBoundary.$rect"
11
+ };
12
+ const meta1 = {
13
+ path,
14
+ line: 18,
15
+ name: "withBoundary.$boundary"
16
+ };
17
+ const meta2 = {
18
+ path,
19
+ line: 22,
20
+ name: "withBoundary"
21
+ };
22
+ function withBoundary(options) {
23
+ const modal = currentModal();
24
+ const $rect = signal(Rect.origin, {
25
+ equals: Rect.isEqual,
26
+ internal: true
27
+ }, meta);
28
+ const $boundary = memo(() => options.transform ? options.transform($rect()) : $rect(), INTERNAL, meta1);
29
+ modal.onDispose(effect(() => {
30
+ if (options.$status() === "closed") return;
31
+ const ac = new AbortController();
32
+ $rect(Rect.fromWindow());
33
+ window.addEventListener("resize", () => {
34
+ $rect(Rect.fromWindow());
35
+ }, {
36
+ passive: true,
37
+ signal: ac.signal
38
+ });
39
+ return () => ac.abort();
40
+ }, INTERNAL, meta2));
41
+ return $boundary;
42
+ }
43
+
44
+ //#endregion
45
+ export { withBoundary };
@@ -0,0 +1,14 @@
1
+ import { Memo } from "@monstermann/signals";
2
+ import { Rect } from "@monstermann/fn";
3
+
4
+ //#region src/position/withPlacement.d.ts
5
+ type ModalPlacementOption = "vertical-center" | "vertical-left" | "vertical-right" | "horizontal-center" | "horizontal-up" | "horizontal-down" | "up-center" | "down-center" | "left-down" | "right-down";
6
+ type ModalPlacement = "down-center" | "down-left" | "down-right" | "left-center" | "left-down" | "left-up" | "right-center" | "right-down" | "right-up" | "up-center" | "up-left" | "up-right";
7
+ declare function withPlacement(options: {
8
+ placement: ModalPlacementOption;
9
+ $anchorMeasurement: () => Rect;
10
+ $boundary: () => Rect;
11
+ $floatingMeasurement: () => Rect;
12
+ }): Memo<ModalPlacement>;
13
+ //#endregion
14
+ export { ModalPlacement, ModalPlacementOption, withPlacement };
@@ -0,0 +1,75 @@
1
+ import { set } from "../node_modules/@monstermann/map/dist/Map/set.js";
2
+ import { remove } from "../node_modules/@monstermann/map/dist/Map/remove.js";
3
+ import { currentModal } from "../createModal.js";
4
+ import { $placements, getBoundaryDown, getBoundaryLeft, getBoundaryRight, getBoundaryUp } from "./internals.js";
5
+ import { INTERNAL, effect, memo } from "@monstermann/signals";
6
+ import { Rect } from "@monstermann/fn";
7
+
8
+ //#region src/position/withPlacement.ts
9
+ const path = "@signals-modal/position/withPlacement.ts";
10
+ const meta = {
11
+ path,
12
+ line: 99,
13
+ name: "withPlacement.$placement"
14
+ };
15
+ const meta1 = {
16
+ path,
17
+ line: 107,
18
+ name: "withPlacement"
19
+ };
20
+ const placementResolvers = {
21
+ "down-center": () => "down-center",
22
+ "left-down": () => "left-down",
23
+ "right-down": () => "right-down",
24
+ "up-center": () => "up-center",
25
+ "horizontal-center": function(o) {
26
+ const left = getBoundaryLeft(o.boundary, o.anchor);
27
+ const right = getBoundaryRight(o.boundary, o.anchor);
28
+ return Rect.width(right) >= Rect.width(left) ? "right-center" : "left-center";
29
+ },
30
+ "horizontal-down": function(o) {
31
+ const left = getBoundaryLeft(o.boundary, o.anchor);
32
+ const right = getBoundaryRight(o.boundary, o.anchor);
33
+ return Rect.width(right) >= Rect.width(left) ? "right-down" : "left-down";
34
+ },
35
+ "horizontal-up": function(o) {
36
+ const left = getBoundaryLeft(o.boundary, o.anchor);
37
+ const right = getBoundaryRight(o.boundary, o.anchor);
38
+ return Rect.width(right) >= Rect.width(left) ? "right-up" : "left-up";
39
+ },
40
+ "vertical-center": function(o) {
41
+ const up = getBoundaryUp(o.boundary, o.anchor);
42
+ const down = getBoundaryDown(o.boundary, o.anchor);
43
+ return Rect.height(down) >= Rect.height(up) ? "down-center" : "up-center";
44
+ },
45
+ "vertical-left": function(o) {
46
+ const up = getBoundaryUp(o.boundary, o.anchor);
47
+ const down = getBoundaryDown(o.boundary, o.anchor);
48
+ return Rect.height(down) >= Rect.height(up) ? "down-left" : "up-left";
49
+ },
50
+ "vertical-right": function(o) {
51
+ const up = getBoundaryUp(o.boundary, o.anchor);
52
+ const down = getBoundaryDown(o.boundary, o.anchor);
53
+ return Rect.height(down) >= Rect.height(up) ? "down-right" : "up-right";
54
+ }
55
+ };
56
+ function withPlacement(options) {
57
+ const modal = currentModal();
58
+ const $placement = memo(() => {
59
+ return placementResolvers[options.placement]({
60
+ anchor: options.$anchorMeasurement(),
61
+ boundary: options.$boundary(),
62
+ floating: options.$floatingMeasurement()
63
+ });
64
+ }, INTERNAL, meta);
65
+ modal.onDispose(effect(() => {
66
+ $placements((p) => set(p, modal.key, $placement()));
67
+ }, void 0, meta1));
68
+ modal.onDispose(() => {
69
+ $placements((p) => remove(p, modal.key));
70
+ });
71
+ return $placement;
72
+ }
73
+
74
+ //#endregion
75
+ export { withPlacement };
@@ -0,0 +1,22 @@
1
+ import { ModalPlacement } from "./withPlacement.js";
2
+ import { Memo } from "@monstermann/signals";
3
+ import { Rect } from "@monstermann/fn";
4
+
5
+ //#region src/position/withPosition.d.ts
6
+ interface ModalPosition {
7
+ floatingX: number;
8
+ floatingY: number;
9
+ maxHeight: number;
10
+ maxWidth: number;
11
+ originX: number;
12
+ originY: number;
13
+ }
14
+ declare function withPosition(options: {
15
+ $anchorMeasurement: () => Rect;
16
+ $boundary: () => Rect;
17
+ $floatingMeasurement: () => Rect;
18
+ $placement: () => ModalPlacement;
19
+ transform?: (rect: Rect) => Rect;
20
+ }): Memo<ModalPosition>;
21
+ //#endregion
22
+ export { ModalPosition, withPosition };