@total_onion/onion-modalcontroller 1.0.16 → 1.1.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.
@@ -8,6 +8,9 @@ on:
8
8
  types: [created]
9
9
  branches:
10
10
  - master
11
+ permissions:
12
+ id-token: write # Required for OIDC
13
+ contents: read
11
14
 
12
15
  jobs:
13
16
  build:
@@ -16,19 +19,19 @@ jobs:
16
19
  - uses: actions/checkout@v2
17
20
  - uses: actions/setup-node@v2
18
21
  with:
19
- node-version: 22
22
+ node-version: 24
23
+ # Ensure npm 11.5.1 or later is installed
24
+ - name: Update npm
25
+ run: npm install -g npm@latest
20
26
  - run: npm ci
21
27
 
22
- publish-npm:
28
+ publish:
23
29
  needs: build
24
30
  runs-on: ubuntu-latest
25
31
  steps:
26
- - uses: actions/checkout@v2
27
- - uses: actions/setup-node@v2
32
+ - uses: actions/checkout@v4
33
+ - uses: actions/setup-node@v4
28
34
  with:
29
- node-version: 22
35
+ node-version: 24
30
36
  registry-url: https://registry.npmjs.org/
31
- - run: npm ci
32
37
  - run: npm publish
33
- env:
34
- NODE_AUTH_TOKEN: ${{secrets.npm_token}}
@@ -1,10 +1,14 @@
1
1
  export default class modalController {
2
- constructor() {
2
+ constructor(settings = {}) {
3
3
  let defaultGlobalSettings = {
4
4
  bodyClass: "modal-active",
5
5
  activeStateClass: "modal-active",
6
6
  enableDebugLogs: true,
7
7
  userInteracted: false,
8
+ closeSelector: "#modal-controller-popup__close-btn",
9
+ closeDelay: 0,
10
+ closingClass: "",
11
+ activateDelay: 0,
8
12
  };
9
13
  this.scanForNewTriggers();
10
14
 
@@ -12,7 +16,7 @@ export default class modalController {
12
16
  return modalController.instance;
13
17
  }
14
18
  modalController.instance = this;
15
- this.globalSettings = defaultGlobalSettings;
19
+ this.globalSettings = { ...defaultGlobalSettings, ...settings };
16
20
  this.enableDebugLogs = this.globalSettings.enableDebugLogs;
17
21
  this.handleModalTriggers();
18
22
  this.handleBgClicks();
@@ -30,12 +34,22 @@ export default class modalController {
30
34
  });
31
35
  }
32
36
  handleCloseButtonClicks() {
33
- const closeButton = document.getElementById(
34
- "modal-controller-popup__close-btn"
37
+ const modalPopup = document.getElementById("modal-controller-popup");
38
+ if (!modalPopup) {
39
+ return;
40
+ }
41
+ const closeButtons = modalPopup.querySelectorAll(
42
+ this.globalSettings.closeSelector || "#modal-controller-popup__close-btn"
35
43
  );
36
- closeButton?.addEventListener("click", (event) => {
37
- const modalPopup = document.getElementById("modal-controller-popup");
38
- this.closePopup(modalPopup);
44
+ closeButtons.forEach((closeButton) => {
45
+ if (closeButton.dataset.modalpopupCloseBound === "true") {
46
+ return;
47
+ }
48
+ closeButton.dataset.modalpopupCloseBound = "true";
49
+ closeButton.addEventListener("click", () => {
50
+ const modalPopup = document.getElementById("modal-controller-popup");
51
+ this.closePopup(modalPopup);
52
+ });
39
53
  });
40
54
  }
41
55
  handleModalTriggers() {
@@ -56,7 +70,6 @@ export default class modalController {
56
70
  </div>`;
57
71
  document.body.insertAdjacentHTML("beforeend", modalPopupHtml);
58
72
  modalPopup = document.getElementById("modal-controller-popup");
59
- this.handleCloseButtonClicks();
60
73
  }
61
74
  if (!modalPopup) {
62
75
  return;
@@ -79,7 +92,15 @@ export default class modalController {
79
92
  ) {
80
93
  popupContent.appendChild(modalPopupContent);
81
94
  }
82
- modalPopupContent.classList.add("active");
95
+ const activateDelay = Number(this.globalSettings.activateDelay) || 0;
96
+ if (activateDelay > 0) {
97
+ modalPopupContent.classList.remove("active");
98
+ window.setTimeout(() => {
99
+ modalPopupContent.classList.add("active");
100
+ }, activateDelay);
101
+ } else {
102
+ modalPopupContent.classList.add("active");
103
+ }
83
104
  requestAnimationFrame(() => {
84
105
  modalPopup.classList.add("open");
85
106
  document.documentElement.classList.add("lock-position");
@@ -90,6 +111,9 @@ export default class modalController {
90
111
  }
91
112
  }
92
113
  closePopup(modalPopup) {
114
+ if (!modalPopup) {
115
+ return;
116
+ }
93
117
  modalPopup.classList.remove("open");
94
118
  document.documentElement.classList.remove("lock-position");
95
119
  const popupContent = modalPopup.querySelector(
@@ -100,9 +124,26 @@ export default class modalController {
100
124
  const activeContents = popupContent.querySelectorAll(
101
125
  "[data-modalpopupcontent].active"
102
126
  );
127
+ const closeDelay = Number(this.globalSettings.closeDelay) || 0;
128
+ const closingClass = this.globalSettings.closingClass;
129
+
130
+ if (closeDelay > 0 && closingClass) {
131
+ activeContents.forEach((activeContent) => {
132
+ activeContent.classList.add(closingClass);
133
+ });
134
+ }
135
+
103
136
  activeContents.forEach((activeContent) => {
104
137
  activeContent.classList.remove("active");
105
138
  });
139
+
140
+ if (closeDelay > 0 && closingClass) {
141
+ window.setTimeout(() => {
142
+ activeContents.forEach((activeContent) => {
143
+ activeContent.classList.remove(closingClass);
144
+ });
145
+ }, closeDelay);
146
+ }
106
147
  }
107
148
  }
108
149
  closePopupOnClickOutside(event, modalPopup) {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@total_onion/onion-modalcontroller",
3
- "version": "1.0.16",
3
+ "version": "1.1.0",
4
4
  "description": "Pop up modal controller",
5
5
  "main": "onion-modalcontroller.js",
6
6
  "scripts": {