@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.
- package/LICENSE +21 -0
- package/README.md +9 -0
- package/dist/anchor/getAnchorElement.d.ts +4 -0
- package/dist/anchor/getAnchorElement.js +9 -0
- package/dist/anchor/getAnchorMeasurement.d.ts +6 -0
- package/dist/anchor/getAnchorMeasurement.js +10 -0
- package/dist/anchor/internals.js +19 -0
- package/dist/anchor/setAnchorElement.d.ts +4 -0
- package/dist/anchor/setAnchorElement.js +9 -0
- package/dist/anchor/withAnchorElement.d.ts +6 -0
- package/dist/anchor/withAnchorElement.js +32 -0
- package/dist/anchor/withAnchorMeasurement.d.ts +12 -0
- package/dist/anchor/withAnchorMeasurement.js +56 -0
- package/dist/anchor/withMouseAnchor.d.ts +11 -0
- package/dist/anchor/withMouseAnchor.js +57 -0
- package/dist/createModal.d.ts +14 -0
- package/dist/createModal.js +47 -0
- package/dist/floating/getFloatingElement.d.ts +4 -0
- package/dist/floating/getFloatingElement.js +9 -0
- package/dist/floating/getFloatingMeasurement.d.ts +6 -0
- package/dist/floating/getFloatingMeasurement.js +10 -0
- package/dist/floating/internals.js +19 -0
- package/dist/floating/setFloatingElement.d.ts +4 -0
- package/dist/floating/setFloatingElement.js +9 -0
- package/dist/floating/withFloatingElement.d.ts +6 -0
- package/dist/floating/withFloatingElement.js +32 -0
- package/dist/floating/withFloatingMeasurement.d.ts +12 -0
- package/dist/floating/withFloatingMeasurement.js +67 -0
- package/dist/groups/getDialogs.d.ts +4 -0
- package/dist/groups/getDialogs.js +10 -0
- package/dist/groups/getGroupsForModal.d.ts +4 -0
- package/dist/groups/getGroupsForModal.js +10 -0
- package/dist/groups/getModalsForGroup.d.ts +4 -0
- package/dist/groups/getModalsForGroup.js +10 -0
- package/dist/groups/getPopovers.d.ts +4 -0
- package/dist/groups/getPopovers.js +10 -0
- package/dist/groups/getTooltips.d.ts +4 -0
- package/dist/groups/getTooltips.js +10 -0
- package/dist/groups/internals.js +26 -0
- package/dist/groups/isDialog.d.ts +4 -0
- package/dist/groups/isDialog.js +10 -0
- package/dist/groups/isModalInGroup.d.ts +4 -0
- package/dist/groups/isModalInGroup.js +9 -0
- package/dist/groups/isPopover.d.ts +4 -0
- package/dist/groups/isPopover.js +10 -0
- package/dist/groups/isTooltip.d.ts +4 -0
- package/dist/groups/isTooltip.js +10 -0
- package/dist/groups/modalGroups.d.ts +8 -0
- package/dist/groups/modalGroups.js +9 -0
- package/dist/groups/withModalGroups.d.ts +6 -0
- package/dist/groups/withModalGroups.js +29 -0
- package/dist/index.d.ts +57 -0
- package/dist/index.js +57 -0
- package/dist/internals/findParentElement.js +9 -0
- package/dist/internals/observeDimensions.js +23 -0
- package/dist/internals/observePosition.js +44 -0
- package/dist/internals/roundByDPR.js +8 -0
- package/dist/position/getModalPosition.d.ts +6 -0
- package/dist/position/getModalPosition.js +9 -0
- package/dist/position/internals.js +32 -0
- package/dist/position/withBoundary.d.ts +11 -0
- package/dist/position/withBoundary.js +45 -0
- package/dist/position/withPlacement.d.ts +14 -0
- package/dist/position/withPlacement.js +75 -0
- package/dist/position/withPosition.d.ts +22 -0
- package/dist/position/withPosition.js +207 -0
- package/dist/status/closeAllModals.d.ts +4 -0
- package/dist/status/closeAllModals.js +16 -0
- package/dist/status/closeModal.d.ts +4 -0
- package/dist/status/closeModal.js +16 -0
- package/dist/status/getClosedModals.d.ts +4 -0
- package/dist/status/getClosedModals.js +12 -0
- package/dist/status/getClosingModals.d.ts +4 -0
- package/dist/status/getClosingModals.js +12 -0
- package/dist/status/getModalStatus.d.ts +6 -0
- package/dist/status/getModalStatus.js +9 -0
- package/dist/status/getOpenedModals.d.ts +4 -0
- package/dist/status/getOpenedModals.js +12 -0
- package/dist/status/getOpeningModals.d.ts +4 -0
- package/dist/status/getOpeningModals.js +12 -0
- package/dist/status/getVisibleModals.d.ts +4 -0
- package/dist/status/getVisibleModals.js +12 -0
- package/dist/status/internals.js +30 -0
- package/dist/status/isAnyModalClosed.d.ts +4 -0
- package/dist/status/isAnyModalClosed.js +9 -0
- package/dist/status/isAnyModalClosing.d.ts +4 -0
- package/dist/status/isAnyModalClosing.js +9 -0
- package/dist/status/isAnyModalOpened.d.ts +4 -0
- package/dist/status/isAnyModalOpened.js +9 -0
- package/dist/status/isAnyModalOpening.d.ts +4 -0
- package/dist/status/isAnyModalOpening.js +9 -0
- package/dist/status/isAnyModalVisible.d.ts +4 -0
- package/dist/status/isAnyModalVisible.js +9 -0
- package/dist/status/isModalClosed.d.ts +4 -0
- package/dist/status/isModalClosed.js +10 -0
- package/dist/status/isModalClosing.d.ts +4 -0
- package/dist/status/isModalClosing.js +9 -0
- package/dist/status/isModalOpened.d.ts +4 -0
- package/dist/status/isModalOpened.js +9 -0
- package/dist/status/isModalOpening.d.ts +4 -0
- package/dist/status/isModalOpening.js +9 -0
- package/dist/status/isModalVisible.d.ts +4 -0
- package/dist/status/isModalVisible.js +9 -0
- package/dist/status/onModalClosed.d.ts +6 -0
- package/dist/status/onModalClosed.js +12 -0
- package/dist/status/onModalClosing.d.ts +6 -0
- package/dist/status/onModalClosing.js +12 -0
- package/dist/status/onModalOpened.d.ts +6 -0
- package/dist/status/onModalOpened.js +12 -0
- package/dist/status/onModalOpening.d.ts +6 -0
- package/dist/status/onModalOpening.js +12 -0
- package/dist/status/openModal.d.ts +4 -0
- package/dist/status/openModal.js +16 -0
- package/dist/status/setModalStatus.d.ts +6 -0
- package/dist/status/setModalStatus.js +9 -0
- package/dist/status/types.d.ts +4 -0
- package/dist/status/withModalStatus.d.ts +7 -0
- package/dist/status/withModalStatus.js +38 -0
- package/dist/utils/closeLastModalOnClickOutside.d.ts +4 -0
- package/dist/utils/closeLastModalOnClickOutside.js +19 -0
- package/dist/utils/closeLastModalOnEsc.d.ts +4 -0
- package/dist/utils/closeLastModalOnEsc.js +17 -0
- package/dist/utils/syncModalGroupsToBody.d.ts +4 -0
- package/dist/utils/syncModalGroupsToBody.js +24 -0
- package/package.json +43 -0
|
@@ -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,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,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,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 };
|
package/dist/index.d.ts
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 { 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,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 };
|