overlastic 0.9.1 → 0.10.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.
- checksums.yaml +4 -4
- data/README.md +23 -12
- data/app/assets/javascripts/overlastic.js +0 -246
- data/app/assets/javascripts/overlastic.min.js +1 -1
- data/app/assets/javascripts/overlastic.min.js.map +1 -1
- data/app/javascript/overlastic/index.js +0 -7
- data/app/views/overlastic/inline/_dialog.html.erb +3 -3
- data/app/views/overlastic/inline/_pane.html.erb +3 -3
- data/app/views/overlastic/tailwind/_dialog.html.erb +3 -3
- data/app/views/overlastic/tailwind/_pane.html.erb +3 -3
- data/lib/overlastic/version.rb +1 -1
- metadata +4 -5
- data/app/javascript/overlastic/dialogElement.js +0 -21
- data/app/javascript/overlastic/paneElement.js +0 -28
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: f6f8d00df40f65f5b265e8ffcd4523a31241ad3898c7d03aaa8b1b9a4e98ab95
|
4
|
+
data.tar.gz: 4a011eb48b263364cf6bb16db40cdc9dfb6cbe1b73ed10021a3b50bf5b366a2f
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 377d9e5301a694aa3fbc205bc4dcf8580b56a149a0f11a9b4a439ce789cd4c57db9972b0f78262d54e45c4def45bee49bfc0272c99d51f73eee5c345a17c88c2
|
7
|
+
data.tar.gz: 47d5bfde806ddf5dd56da6c152847745fe9cbbae7d7ac331c00bfb3df10ecda83514eb1a8257bc24caa7328e52f021cfebdea6a5b13dbc421c67ff8c370f5525
|
data/README.md
CHANGED
@@ -43,9 +43,8 @@ Load any page inside an overlay (dialog modal, slide-out pane, or whatever else
|
|
43
43
|
|
44
44
|
This gem requires a modern Rails application running [turbo-rails](https://github.com/hotwired/turbo-rails). It supports both import map and node setups.
|
45
45
|
|
46
|
-
1.
|
47
|
-
2.
|
48
|
-
3. Run `./bin/rails overlastic:install`
|
46
|
+
1. `bundle add overlastic`
|
47
|
+
2. `rails overlastic:install`
|
49
48
|
|
50
49
|
|
51
50
|
## Usage
|
@@ -184,7 +183,7 @@ redirect_to article_url(@article), overlay: :previous, status: :see_other
|
|
184
183
|
<summary>Appending Turbo Streams to every response</summary><br>
|
185
184
|
|
186
185
|
Overlastic can be configured to append a Turbo Stream to every response that contains an overlay.
|
187
|
-
This can be very useful for rendering flash messages:
|
186
|
+
This can be very useful for automatically rendering new flash messages whenever they're available:
|
188
187
|
|
189
188
|
```rb
|
190
189
|
Overlastic.configure do |config|
|
@@ -194,9 +193,15 @@ redirect_to article_url(@article), overlay: :previous, status: :see_other
|
|
194
193
|
end
|
195
194
|
```
|
196
195
|
|
197
|
-
Then you'd only need to specify a flash message when closing an overlay, or redirecting to a different path:
|
196
|
+
Then you'd only need to specify a flash message inside your action, when closing an overlay, or when redirecting to a different path:
|
198
197
|
|
199
198
|
```rb
|
199
|
+
def show
|
200
|
+
flash.now[:notice] = "You've been noticed!"
|
201
|
+
end
|
202
|
+
|
203
|
+
# or
|
204
|
+
|
200
205
|
close_overlay notice: "Deleted!"
|
201
206
|
|
202
207
|
# or
|
@@ -240,26 +245,32 @@ end
|
|
240
245
|
```
|
241
246
|
|
242
247
|
|
243
|
-
##
|
248
|
+
## UI customization
|
244
249
|
|
245
|
-
Overlastic comes with default views for both the dialog and pane overlays.
|
250
|
+
Overlastic comes with default views for both the dialog and pane overlays. They are intended to provide an easy way to try the gem. For real-world usage you're expected to implement your own UI elements, or use something like [Bootstrap](https://getbootstrap.com) or [TailwindCSS Stimulus Components](https://github.com/excid3/tailwindcss-stimulus-components).
|
246
251
|
|
247
252
|
<details>
|
248
253
|
<summary>Default overlays</summary><br>
|
249
254
|
|
255
|
+
**Dialog**
|
256
|
+
|
250
257
|
<img src="assets/dialog.png?sanitize=true" width="600" alt="Dialog">
|
251
258
|
|
252
259
|
<br>
|
253
260
|
|
261
|
+
**Pane**
|
262
|
+
|
254
263
|
<img src="assets/pane.png?sanitize=true" width="600" alt="Dialog">
|
255
264
|
</details>
|
256
265
|
|
257
266
|
<details>
|
258
267
|
<summary>Generate customizable views</summary><br>
|
259
268
|
|
269
|
+
Overlastic provides a generator to build your own views using the default overlays as a base. It's not advisable, though. You're better off using a UI library.
|
270
|
+
|
260
271
|
```sh
|
261
|
-
|
262
|
-
|
272
|
+
# Available options: inline, tailwind
|
273
|
+
./bin/rails generate overlastic:views --css tailwind
|
263
274
|
```
|
264
275
|
</details>
|
265
276
|
|
@@ -270,14 +281,14 @@ Overlastic comes with default views for both the dialog and pane overlays. It al
|
|
270
281
|
<summary>Running the demo application</summary><br>
|
271
282
|
|
272
283
|
- First you need to install dependencies with `bundle && yarn && yarn build`
|
273
|
-
- Then you need to setup the DB with
|
274
|
-
- Lastly you can run the demo app with
|
284
|
+
- Then you need to setup the DB with `rails db:setup`
|
285
|
+
- Lastly you can run the demo app with `rails server --port 3000`
|
275
286
|
</details>
|
276
287
|
|
277
288
|
<details>
|
278
289
|
<summary>Running the tests</summary><br>
|
279
290
|
|
280
|
-
- You can run the whole suite with `./bin/test`
|
291
|
+
- You can run the whole suite with `./bin/test test/**/*_test.rb`
|
281
292
|
</details>
|
282
293
|
|
283
294
|
|
@@ -1,207 +1,3 @@
|
|
1
|
-
function _toConsumableArray(arr) {
|
2
|
-
if (Array.isArray(arr)) {
|
3
|
-
for (var i = 0, arr2 = Array(arr.length); i < arr.length; i++) {
|
4
|
-
arr2[i] = arr[i];
|
5
|
-
}
|
6
|
-
return arr2;
|
7
|
-
} else {
|
8
|
-
return Array.from(arr);
|
9
|
-
}
|
10
|
-
}
|
11
|
-
|
12
|
-
var hasPassiveEvents = false;
|
13
|
-
|
14
|
-
if (typeof window !== "undefined") {
|
15
|
-
var passiveTestOptions = {
|
16
|
-
get passive() {
|
17
|
-
hasPassiveEvents = true;
|
18
|
-
return undefined;
|
19
|
-
}
|
20
|
-
};
|
21
|
-
window.addEventListener("testPassive", null, passiveTestOptions);
|
22
|
-
window.removeEventListener("testPassive", null, passiveTestOptions);
|
23
|
-
}
|
24
|
-
|
25
|
-
var isIosDevice = typeof window !== "undefined" && window.navigator && window.navigator.platform && (/iP(ad|hone|od)/.test(window.navigator.platform) || window.navigator.platform === "MacIntel" && window.navigator.maxTouchPoints > 1);
|
26
|
-
|
27
|
-
var locks = [];
|
28
|
-
|
29
|
-
var documentListenerAdded = false;
|
30
|
-
|
31
|
-
var initialClientY = -1;
|
32
|
-
|
33
|
-
var previousBodyOverflowSetting = void 0;
|
34
|
-
|
35
|
-
var previousBodyPosition = void 0;
|
36
|
-
|
37
|
-
var previousBodyPaddingRight = void 0;
|
38
|
-
|
39
|
-
var allowTouchMove = function allowTouchMove(el) {
|
40
|
-
return locks.some((function(lock) {
|
41
|
-
if (lock.options.allowTouchMove && lock.options.allowTouchMove(el)) {
|
42
|
-
return true;
|
43
|
-
}
|
44
|
-
return false;
|
45
|
-
}));
|
46
|
-
};
|
47
|
-
|
48
|
-
var preventDefault = function preventDefault(rawEvent) {
|
49
|
-
var e = rawEvent || window.event;
|
50
|
-
if (allowTouchMove(e.target)) {
|
51
|
-
return true;
|
52
|
-
}
|
53
|
-
if (e.touches.length > 1) return true;
|
54
|
-
if (e.preventDefault) e.preventDefault();
|
55
|
-
return false;
|
56
|
-
};
|
57
|
-
|
58
|
-
var setOverflowHidden = function setOverflowHidden(options) {
|
59
|
-
if (previousBodyPaddingRight === undefined) {
|
60
|
-
var _reserveScrollBarGap = !!options && options.reserveScrollBarGap === true;
|
61
|
-
var scrollBarGap = window.innerWidth - document.documentElement.clientWidth;
|
62
|
-
if (_reserveScrollBarGap && scrollBarGap > 0) {
|
63
|
-
var computedBodyPaddingRight = parseInt(window.getComputedStyle(document.body).getPropertyValue("padding-right"), 10);
|
64
|
-
previousBodyPaddingRight = document.body.style.paddingRight;
|
65
|
-
document.body.style.paddingRight = computedBodyPaddingRight + scrollBarGap + "px";
|
66
|
-
}
|
67
|
-
}
|
68
|
-
if (previousBodyOverflowSetting === undefined) {
|
69
|
-
previousBodyOverflowSetting = document.body.style.overflow;
|
70
|
-
document.body.style.overflow = "hidden";
|
71
|
-
}
|
72
|
-
};
|
73
|
-
|
74
|
-
var restoreOverflowSetting = function restoreOverflowSetting() {
|
75
|
-
if (previousBodyPaddingRight !== undefined) {
|
76
|
-
document.body.style.paddingRight = previousBodyPaddingRight;
|
77
|
-
previousBodyPaddingRight = undefined;
|
78
|
-
}
|
79
|
-
if (previousBodyOverflowSetting !== undefined) {
|
80
|
-
document.body.style.overflow = previousBodyOverflowSetting;
|
81
|
-
previousBodyOverflowSetting = undefined;
|
82
|
-
}
|
83
|
-
};
|
84
|
-
|
85
|
-
var setPositionFixed = function setPositionFixed() {
|
86
|
-
return window.requestAnimationFrame((function() {
|
87
|
-
if (previousBodyPosition === undefined) {
|
88
|
-
previousBodyPosition = {
|
89
|
-
position: document.body.style.position,
|
90
|
-
top: document.body.style.top,
|
91
|
-
left: document.body.style.left
|
92
|
-
};
|
93
|
-
var _window = window, scrollY = _window.scrollY, scrollX = _window.scrollX, innerHeight = _window.innerHeight;
|
94
|
-
document.body.style.position = "fixed";
|
95
|
-
document.body.style.top = -scrollY;
|
96
|
-
document.body.style.left = -scrollX;
|
97
|
-
setTimeout((function() {
|
98
|
-
return window.requestAnimationFrame((function() {
|
99
|
-
var bottomBarHeight = innerHeight - window.innerHeight;
|
100
|
-
if (bottomBarHeight && scrollY >= innerHeight) {
|
101
|
-
document.body.style.top = -(scrollY + bottomBarHeight);
|
102
|
-
}
|
103
|
-
}));
|
104
|
-
}), 300);
|
105
|
-
}
|
106
|
-
}));
|
107
|
-
};
|
108
|
-
|
109
|
-
var restorePositionSetting = function restorePositionSetting() {
|
110
|
-
if (previousBodyPosition !== undefined) {
|
111
|
-
var y = -parseInt(document.body.style.top, 10);
|
112
|
-
var x = -parseInt(document.body.style.left, 10);
|
113
|
-
document.body.style.position = previousBodyPosition.position;
|
114
|
-
document.body.style.top = previousBodyPosition.top;
|
115
|
-
document.body.style.left = previousBodyPosition.left;
|
116
|
-
window.scrollTo(x, y);
|
117
|
-
previousBodyPosition = undefined;
|
118
|
-
}
|
119
|
-
};
|
120
|
-
|
121
|
-
var isTargetElementTotallyScrolled = function isTargetElementTotallyScrolled(targetElement) {
|
122
|
-
return targetElement ? targetElement.scrollHeight - targetElement.scrollTop <= targetElement.clientHeight : false;
|
123
|
-
};
|
124
|
-
|
125
|
-
var handleScroll = function handleScroll(event, targetElement) {
|
126
|
-
var clientY = event.targetTouches[0].clientY - initialClientY;
|
127
|
-
if (allowTouchMove(event.target)) {
|
128
|
-
return false;
|
129
|
-
}
|
130
|
-
if (targetElement && targetElement.scrollTop === 0 && clientY > 0) {
|
131
|
-
return preventDefault(event);
|
132
|
-
}
|
133
|
-
if (isTargetElementTotallyScrolled(targetElement) && clientY < 0) {
|
134
|
-
return preventDefault(event);
|
135
|
-
}
|
136
|
-
event.stopPropagation();
|
137
|
-
return true;
|
138
|
-
};
|
139
|
-
|
140
|
-
var disableBodyScroll$1 = function disableBodyScroll(targetElement, options) {
|
141
|
-
if (!targetElement) {
|
142
|
-
console.error("disableBodyScroll unsuccessful - targetElement must be provided when calling disableBodyScroll on IOS devices.");
|
143
|
-
return;
|
144
|
-
}
|
145
|
-
if (locks.some((function(lock) {
|
146
|
-
return lock.targetElement === targetElement;
|
147
|
-
}))) {
|
148
|
-
return;
|
149
|
-
}
|
150
|
-
var lock = {
|
151
|
-
targetElement: targetElement,
|
152
|
-
options: options || {}
|
153
|
-
};
|
154
|
-
locks = [].concat(_toConsumableArray(locks), [ lock ]);
|
155
|
-
if (isIosDevice) {
|
156
|
-
setPositionFixed();
|
157
|
-
} else {
|
158
|
-
setOverflowHidden(options);
|
159
|
-
}
|
160
|
-
if (isIosDevice) {
|
161
|
-
targetElement.ontouchstart = function(event) {
|
162
|
-
if (event.targetTouches.length === 1) {
|
163
|
-
initialClientY = event.targetTouches[0].clientY;
|
164
|
-
}
|
165
|
-
};
|
166
|
-
targetElement.ontouchmove = function(event) {
|
167
|
-
if (event.targetTouches.length === 1) {
|
168
|
-
handleScroll(event, targetElement);
|
169
|
-
}
|
170
|
-
};
|
171
|
-
if (!documentListenerAdded) {
|
172
|
-
document.addEventListener("touchmove", preventDefault, hasPassiveEvents ? {
|
173
|
-
passive: false
|
174
|
-
} : undefined);
|
175
|
-
documentListenerAdded = true;
|
176
|
-
}
|
177
|
-
}
|
178
|
-
};
|
179
|
-
|
180
|
-
var enableBodyScroll$1 = function enableBodyScroll(targetElement) {
|
181
|
-
if (!targetElement) {
|
182
|
-
console.error("enableBodyScroll unsuccessful - targetElement must be provided when calling enableBodyScroll on IOS devices.");
|
183
|
-
return;
|
184
|
-
}
|
185
|
-
locks = locks.filter((function(lock) {
|
186
|
-
return lock.targetElement !== targetElement;
|
187
|
-
}));
|
188
|
-
if (isIosDevice) {
|
189
|
-
targetElement.ontouchstart = null;
|
190
|
-
targetElement.ontouchmove = null;
|
191
|
-
if (documentListenerAdded && locks.length === 0) {
|
192
|
-
document.removeEventListener("touchmove", preventDefault, hasPassiveEvents ? {
|
193
|
-
passive: false
|
194
|
-
} : undefined);
|
195
|
-
documentListenerAdded = false;
|
196
|
-
}
|
197
|
-
}
|
198
|
-
if (isIosDevice) {
|
199
|
-
restorePositionSetting();
|
200
|
-
} else {
|
201
|
-
restoreOverflowSetting();
|
202
|
-
}
|
203
|
-
};
|
204
|
-
|
205
1
|
addEventListener("click", (event => {
|
206
2
|
window._overlasticInitiator = event.target;
|
207
3
|
}), true);
|
@@ -317,45 +113,3 @@ Turbo.StreamActions["replaceOverlay"] = function() {
|
|
317
113
|
renderNewOverlay();
|
318
114
|
}
|
319
115
|
};
|
320
|
-
|
321
|
-
class DialogElement extends HTMLElement {
|
322
|
-
connectedCallback() {
|
323
|
-
disableBodyScroll(this);
|
324
|
-
this.addEventListener("click", (event => this.close(event, true)));
|
325
|
-
this.querySelector(".overlastic-close").addEventListener("click", (event => this.close(event)));
|
326
|
-
}
|
327
|
-
close(event, self = false) {
|
328
|
-
if (self && event.target !== this) return;
|
329
|
-
enableBodyScroll(this);
|
330
|
-
setTimeout((() => {
|
331
|
-
this.remove();
|
332
|
-
}), 5);
|
333
|
-
}
|
334
|
-
}
|
335
|
-
|
336
|
-
customElements.define("overlastic-dialog", DialogElement);
|
337
|
-
|
338
|
-
class PaneElement extends DialogElement {
|
339
|
-
connectedCallback() {
|
340
|
-
super.connectedCallback();
|
341
|
-
const lastVisit = Turbo.navigator.history.location;
|
342
|
-
if (!window.modalVisitStack) {
|
343
|
-
window.modalVisitStack = [];
|
344
|
-
}
|
345
|
-
window.modalVisitStack.push(lastVisit);
|
346
|
-
Turbo.navigator.history.push(new URL(this.parentElement.getAttribute("src")));
|
347
|
-
}
|
348
|
-
close(event, self = false) {
|
349
|
-
if (self && event.target !== this) return;
|
350
|
-
super.close(event, self);
|
351
|
-
if (window.modalVisitStack.length > 0) {
|
352
|
-
Turbo.navigator.history.replace(window.modalVisitStack.pop());
|
353
|
-
}
|
354
|
-
}
|
355
|
-
}
|
356
|
-
|
357
|
-
customElements.define("overlastic-pane", PaneElement);
|
358
|
-
|
359
|
-
window.disableBodyScroll = disableBodyScroll$1;
|
360
|
-
|
361
|
-
window.enableBodyScroll = enableBodyScroll$1;
|
@@ -1,2 +1,2 @@
|
|
1
|
-
|
1
|
+
addEventListener("click",(e=>{window._overlasticInitiator=e.target}),!0),addEventListener("click",(e=>{const t=window._overlasticInitiator?.closest("a[data-overlay-name]");t&&t.removeAttribute("target")}),!0),addEventListener("turbo:before-fetch-request",(e=>{e.detail.fetchOptions.headers["Overlay-Enabled"]="1"})),addEventListener("turbo:before-fetch-request",(e=>{const t=window._overlasticInitiator?.closest("a[data-overlay-name]"),a=t?.dataset?.overlayName,r=t?.dataset?.overlayType,s=t?.dataset?.overlayTarget,i=t?.dataset?.overlayArgs;t&&(e.detail.fetchOptions.headers["Overlay-Initiator"]="1",e.detail.fetchOptions.headers["Overlay-Name"]=a,r&&(e.detail.fetchOptions.headers["Overlay-Type"]=r),s&&(e.detail.fetchOptions.headers["Overlay-Target"]=s),i&&(e.detail.fetchOptions.headers["Overlay-Args"]=i))})),addEventListener("turbo:before-fetch-request",(e=>{const t=document.querySelector("script[overlay]");if(t){const a=document.querySelector(`overlastic[id=${t.getAttribute("overlay")}]`);if(a){const t=a.id,r=a.dataset.overlayTarget,s=a.dataset?.overlayType,i=a.dataset?.overlayArgs;e.detail.fetchOptions.headers["Overlay-Name"]=t,e.detail.fetchOptions.headers["Overlay-Target"]=r,e.detail.fetchOptions.headers["Overlay-Initiator"]="1",s&&(e.detail.fetchOptions.headers["Overlay-Type"]=s),i&&(e.detail.fetchOptions.headers["Overlay-Args"]=i)}}})),addEventListener("turbo:before-fetch-request",(e=>{const t=window._overlasticInitiator?.closest("a, form"),a=t?.closest("overlastic");if(a&&!t.dataset.overlay&&!t.dataset.overlayName){const t=a.id,r=a.dataset.overlayTarget,s=a.dataset?.overlayInitiator,i=a.dataset?.overlayType,o=a.dataset?.overlayArgs;e.detail.fetchOptions.headers["Overlay-Name"]=t,e.detail.fetchOptions.headers["Overlay-Target"]=r,s&&(e.detail.fetchOptions.headers["Overlay-Initiator"]=s),i&&(e.detail.fetchOptions.headers["Overlay-Type"]=i),o&&(e.detail.fetchOptions.headers["Overlay-Args"]=o)}delete window._overlasticInitiator})),Turbo.StreamActions.replaceOverlay=function(){let e=[],t=0;const a=this.targetElements[0],r=a.id,s=()=>{if(t++,t>=e.filter((e=>!1===e)).length){Turbo.StreamActions.replace.bind(this)();const e=document.getElementById(r),t=e.firstElementChild||e,a=new Event("overlastic:connect",{bubbles:!0,cancelable:!1});t.dispatchEvent(a)}};e=[a,...a.querySelectorAll("overlastic")].map((e=>{const t=e.firstElementChild||e,a=new CustomEvent("overlastic:disconnect",{bubbles:!0,cancelable:!0,detail:{resume:s}});return t.dispatchEvent(a)})),e.every((e=>!0===e))&&s()};
|
2
2
|
//# sourceMappingURL=overlastic.min.js.map
|
@@ -1 +1 @@
|
|
1
|
-
{"version":3,"file":"overlastic.min.js","sources":["../../../node_modules/body-scroll-lock/lib/bodyScrollLock.esm.js","../../javascript/overlastic/clickInterceptor.js","../../javascript/overlastic/streamAction.js","../../javascript/overlastic/dialogElement.js","../../javascript/overlastic/paneElement.js","../../javascript/overlastic/index.js"],"sourcesContent":["function _toConsumableArray(arr) { if (Array.isArray(arr)) { for (var i = 0, arr2 = Array(arr.length); i < arr.length; i++) { arr2[i] = arr[i]; } return arr2; } else { return Array.from(arr); } }\n\n// Older browsers don't support event options, feature detect it.\n\n// Adopted and modified solution from Bohdan Didukh (2017)\n// https://stackoverflow.com/questions/41594997/ios-10-safari-prevent-scrolling-behind-a-fixed-overlay-and-maintain-scroll-posi\n\nvar hasPassiveEvents = false;\nif (typeof window !== 'undefined') {\n var passiveTestOptions = {\n get passive() {\n hasPassiveEvents = true;\n return undefined;\n }\n };\n window.addEventListener('testPassive', null, passiveTestOptions);\n window.removeEventListener('testPassive', null, passiveTestOptions);\n}\n\nvar isIosDevice = typeof window !== 'undefined' && window.navigator && window.navigator.platform && (/iP(ad|hone|od)/.test(window.navigator.platform) || window.navigator.platform === 'MacIntel' && window.navigator.maxTouchPoints > 1);\n\n\nvar locks = [];\nvar documentListenerAdded = false;\nvar initialClientY = -1;\nvar previousBodyOverflowSetting = void 0;\nvar previousBodyPosition = void 0;\nvar previousBodyPaddingRight = void 0;\n\n// returns true if `el` should be allowed to receive touchmove events.\nvar allowTouchMove = function allowTouchMove(el) {\n return locks.some(function (lock) {\n if (lock.options.allowTouchMove && lock.options.allowTouchMove(el)) {\n return true;\n }\n\n return false;\n });\n};\n\nvar preventDefault = function preventDefault(rawEvent) {\n var e = rawEvent || window.event;\n\n // For the case whereby consumers adds a touchmove event listener to document.\n // Recall that we do document.addEventListener('touchmove', preventDefault, { passive: false })\n // in disableBodyScroll - so if we provide this opportunity to allowTouchMove, then\n // the touchmove event on document will break.\n if (allowTouchMove(e.target)) {\n return true;\n }\n\n // Do not prevent if the event has more than one touch (usually meaning this is a multi touch gesture like pinch to zoom).\n if (e.touches.length > 1) return true;\n\n if (e.preventDefault) e.preventDefault();\n\n return false;\n};\n\nvar setOverflowHidden = function setOverflowHidden(options) {\n // If previousBodyPaddingRight is already set, don't set it again.\n if (previousBodyPaddingRight === undefined) {\n var _reserveScrollBarGap = !!options && options.reserveScrollBarGap === true;\n var scrollBarGap = window.innerWidth - document.documentElement.clientWidth;\n\n if (_reserveScrollBarGap && scrollBarGap > 0) {\n var computedBodyPaddingRight = parseInt(window.getComputedStyle(document.body).getPropertyValue('padding-right'), 10);\n previousBodyPaddingRight = document.body.style.paddingRight;\n document.body.style.paddingRight = computedBodyPaddingRight + scrollBarGap + 'px';\n }\n }\n\n // If previousBodyOverflowSetting is already set, don't set it again.\n if (previousBodyOverflowSetting === undefined) {\n previousBodyOverflowSetting = document.body.style.overflow;\n document.body.style.overflow = 'hidden';\n }\n};\n\nvar restoreOverflowSetting = function restoreOverflowSetting() {\n if (previousBodyPaddingRight !== undefined) {\n document.body.style.paddingRight = previousBodyPaddingRight;\n\n // Restore previousBodyPaddingRight to undefined so setOverflowHidden knows it\n // can be set again.\n previousBodyPaddingRight = undefined;\n }\n\n if (previousBodyOverflowSetting !== undefined) {\n document.body.style.overflow = previousBodyOverflowSetting;\n\n // Restore previousBodyOverflowSetting to undefined\n // so setOverflowHidden knows it can be set again.\n previousBodyOverflowSetting = undefined;\n }\n};\n\nvar setPositionFixed = function setPositionFixed() {\n return window.requestAnimationFrame(function () {\n // If previousBodyPosition is already set, don't set it again.\n if (previousBodyPosition === undefined) {\n previousBodyPosition = {\n position: document.body.style.position,\n top: document.body.style.top,\n left: document.body.style.left\n };\n\n // Update the dom inside an animation frame \n var _window = window,\n scrollY = _window.scrollY,\n scrollX = _window.scrollX,\n innerHeight = _window.innerHeight;\n\n document.body.style.position = 'fixed';\n document.body.style.top = -scrollY;\n document.body.style.left = -scrollX;\n\n setTimeout(function () {\n return window.requestAnimationFrame(function () {\n // Attempt to check if the bottom bar appeared due to the position change\n var bottomBarHeight = innerHeight - window.innerHeight;\n if (bottomBarHeight && scrollY >= innerHeight) {\n // Move the content further up so that the bottom bar doesn't hide it\n document.body.style.top = -(scrollY + bottomBarHeight);\n }\n });\n }, 300);\n }\n });\n};\n\nvar restorePositionSetting = function restorePositionSetting() {\n if (previousBodyPosition !== undefined) {\n // Convert the position from \"px\" to Int\n var y = -parseInt(document.body.style.top, 10);\n var x = -parseInt(document.body.style.left, 10);\n\n // Restore styles\n document.body.style.position = previousBodyPosition.position;\n document.body.style.top = previousBodyPosition.top;\n document.body.style.left = previousBodyPosition.left;\n\n // Restore scroll\n window.scrollTo(x, y);\n\n previousBodyPosition = undefined;\n }\n};\n\n// https://developer.mozilla.org/en-US/docs/Web/API/Element/scrollHeight#Problems_and_solutions\nvar isTargetElementTotallyScrolled = function isTargetElementTotallyScrolled(targetElement) {\n return targetElement ? targetElement.scrollHeight - targetElement.scrollTop <= targetElement.clientHeight : false;\n};\n\nvar handleScroll = function handleScroll(event, targetElement) {\n var clientY = event.targetTouches[0].clientY - initialClientY;\n\n if (allowTouchMove(event.target)) {\n return false;\n }\n\n if (targetElement && targetElement.scrollTop === 0 && clientY > 0) {\n // element is at the top of its scroll.\n return preventDefault(event);\n }\n\n if (isTargetElementTotallyScrolled(targetElement) && clientY < 0) {\n // element is at the bottom of its scroll.\n return preventDefault(event);\n }\n\n event.stopPropagation();\n return true;\n};\n\nexport var disableBodyScroll = function disableBodyScroll(targetElement, options) {\n // targetElement must be provided\n if (!targetElement) {\n // eslint-disable-next-line no-console\n console.error('disableBodyScroll unsuccessful - targetElement must be provided when calling disableBodyScroll on IOS devices.');\n return;\n }\n\n // disableBodyScroll must not have been called on this targetElement before\n if (locks.some(function (lock) {\n return lock.targetElement === targetElement;\n })) {\n return;\n }\n\n var lock = {\n targetElement: targetElement,\n options: options || {}\n };\n\n locks = [].concat(_toConsumableArray(locks), [lock]);\n\n if (isIosDevice) {\n setPositionFixed();\n } else {\n setOverflowHidden(options);\n }\n\n if (isIosDevice) {\n targetElement.ontouchstart = function (event) {\n if (event.targetTouches.length === 1) {\n // detect single touch.\n initialClientY = event.targetTouches[0].clientY;\n }\n };\n targetElement.ontouchmove = function (event) {\n if (event.targetTouches.length === 1) {\n // detect single touch.\n handleScroll(event, targetElement);\n }\n };\n\n if (!documentListenerAdded) {\n document.addEventListener('touchmove', preventDefault, hasPassiveEvents ? { passive: false } : undefined);\n documentListenerAdded = true;\n }\n }\n};\n\nexport var clearAllBodyScrollLocks = function clearAllBodyScrollLocks() {\n if (isIosDevice) {\n // Clear all locks ontouchstart/ontouchmove handlers, and the references.\n locks.forEach(function (lock) {\n lock.targetElement.ontouchstart = null;\n lock.targetElement.ontouchmove = null;\n });\n\n if (documentListenerAdded) {\n document.removeEventListener('touchmove', preventDefault, hasPassiveEvents ? { passive: false } : undefined);\n documentListenerAdded = false;\n }\n\n // Reset initial clientY.\n initialClientY = -1;\n }\n\n if (isIosDevice) {\n restorePositionSetting();\n } else {\n restoreOverflowSetting();\n }\n\n locks = [];\n};\n\nexport var enableBodyScroll = function enableBodyScroll(targetElement) {\n if (!targetElement) {\n // eslint-disable-next-line no-console\n console.error('enableBodyScroll unsuccessful - targetElement must be provided when calling enableBodyScroll on IOS devices.');\n return;\n }\n\n locks = locks.filter(function (lock) {\n return lock.targetElement !== targetElement;\n });\n\n if (isIosDevice) {\n targetElement.ontouchstart = null;\n targetElement.ontouchmove = null;\n\n if (documentListenerAdded && locks.length === 0) {\n document.removeEventListener('touchmove', preventDefault, hasPassiveEvents ? { passive: false } : undefined);\n documentListenerAdded = false;\n }\n }\n\n if (isIosDevice) {\n restorePositionSetting();\n } else {\n restoreOverflowSetting();\n }\n};\n\n","// Save the clicked element for use down the line.\naddEventListener(\"click\", event => {\n window._overlasticInitiator = event.target\n}, true)\n\n// Overlay anchors come with target _blank to serve as fallback in case JS is not enabled.\naddEventListener(\"click\", _event => {\n const anchor = window._overlasticInitiator?.closest(\"a[data-overlay-name]\")\n\n if (anchor) {\n anchor.removeAttribute(\"target\")\n }\n}, true)\n\n// Allow progressive enhancement by telling the server if a request is handled by Turbo.\naddEventListener(\"turbo:before-fetch-request\", event => {\n event.detail.fetchOptions.headers[\"Overlay-Enabled\"] = \"1\"\n})\n\n// When an overlay anchor is clicked,\n// send its type, target and args along with the visit request.\naddEventListener(\"turbo:before-fetch-request\", event => {\n const anchor = window._overlasticInitiator?.closest(\"a[data-overlay-name]\")\n const name = anchor?.dataset?.overlayName\n const type = anchor?.dataset?.overlayType\n const target = anchor?.dataset?.overlayTarget\n const args = anchor?.dataset?.overlayArgs\n\n if (anchor) {\n event.detail.fetchOptions.headers[\"Overlay-Initiator\"] = \"1\"\n event.detail.fetchOptions.headers[\"Overlay-Name\"] = name\n\n if (type) {\n event.detail.fetchOptions.headers[\"Overlay-Type\"] = type\n }\n\n if (target) {\n event.detail.fetchOptions.headers[\"Overlay-Target\"] = target\n }\n\n if (args) {\n event.detail.fetchOptions.headers[\"Overlay-Args\"] = args\n }\n }\n})\n\n// When the redirect script triggers a fetch,\n// send the current overlay's target along with the visit request.\naddEventListener(\"turbo:before-fetch-request\", event => {\n const script = document.querySelector(\"script[overlay]\")\n\n if (script) {\n const overlay = document.querySelector(`overlastic[id=${script.getAttribute(\"overlay\")}]`)\n\n if (overlay) {\n const name = overlay.id\n const target = overlay.dataset.overlayTarget\n const type = overlay.dataset?.overlayType\n const args = overlay.dataset?.overlayArgs\n\n event.detail.fetchOptions.headers[\"Overlay-Name\"] = name\n event.detail.fetchOptions.headers[\"Overlay-Target\"] = target\n event.detail.fetchOptions.headers[\"Overlay-Initiator\"] = \"1\"\n\n if (type) {\n event.detail.fetchOptions.headers[\"Overlay-Type\"] = type\n }\n\n if (args) {\n event.detail.fetchOptions.headers[\"Overlay-Args\"] = args\n }\n }\n }\n})\n\n// When any other element triggers a fetch,\n// send the current overlay's target along with the visit request.\naddEventListener(\"turbo:before-fetch-request\", event => {\n const initiator = window._overlasticInitiator?.closest(\"a, form\")\n const overlay = initiator?.closest(\"overlastic\")\n\n if (overlay && !initiator.dataset.overlay && !initiator.dataset.overlayName) {\n const name = overlay.id\n const target = overlay.dataset.overlayTarget\n const initiator = overlay.dataset?.overlayInitiator\n const type = overlay.dataset?.overlayType\n const args = overlay.dataset?.overlayArgs\n\n event.detail.fetchOptions.headers[\"Overlay-Name\"] = name\n event.detail.fetchOptions.headers[\"Overlay-Target\"] = target\n\n if (initiator) {\n event.detail.fetchOptions.headers[\"Overlay-Initiator\"] = initiator\n }\n\n if (type) {\n event.detail.fetchOptions.headers[\"Overlay-Type\"] = type\n }\n\n if (args) {\n event.detail.fetchOptions.headers[\"Overlay-Args\"] = args\n }\n }\n\n delete window._overlasticInitiator\n})\n","// Custom Stream action that allows for finer control of the overlay lifecycle.\n//\n// Lifecycle events:\n// - overlastic:disconnect right before removing an overlay from the DOM\n// - overlastic:connect right after attaching an overlay to the DOM\n//\n// Both events target the firstElementChild of the overlastic tag to allow for\n// a cleaner listening approach in libraries like Stimulus or Alpine.\n//\n// The disconnect event is dispatched once for every overlay that will be removed.\n// They can be paused and resumed. The new overlay won't be attached until all events\n// have been resumed.\nTurbo.StreamActions[\"replaceOverlay\"] = function() {\n let overlaysReadyToDisconnect = []\n let callsToResume = 0\n\n const oldOverlay = this.targetElements[0]\n const overlayName = oldOverlay.id\n const renderNewOverlay = () => {\n callsToResume++\n\n if (callsToResume >= overlaysReadyToDisconnect.filter(status => status === false).length) {\n Turbo.StreamActions[\"replace\"].bind(this)()\n\n const newOverlay = document.getElementById(overlayName)\n const connectTarget = newOverlay.firstElementChild || newOverlay\n const connectEvent = new Event(\"overlastic:connect\", { bubbles: true, cancelable: false })\n\n connectTarget.dispatchEvent(connectEvent)\n }\n }\n\n overlaysReadyToDisconnect = [oldOverlay, ...oldOverlay.querySelectorAll(\"overlastic\")].map(element => {\n const disconnectTarget = element.firstElementChild || element\n const disconnectEvent =\n new CustomEvent(\"overlastic:disconnect\", { bubbles: true, cancelable: true, detail: { resume: renderNewOverlay } })\n\n return disconnectTarget.dispatchEvent(disconnectEvent)\n })\n\n if (overlaysReadyToDisconnect.every(status => status === true)) {\n renderNewOverlay()\n }\n}\n","export default class DialogElement extends HTMLElement {\n connectedCallback() {\n disableBodyScroll(this)\n\n this.addEventListener(\"click\", event => this.close(event, true))\n this.querySelector(\".overlastic-close\").addEventListener(\"click\", event => this.close(event))\n }\n\n close(event, self = false) {\n if (self && event.target !== this) return\n\n enableBodyScroll(this)\n\n // Avoid removing before sending dispatching other events (like form submissions)\n setTimeout(() => {\n this.remove()\n }, 5)\n }\n}\n\ncustomElements.define(\"overlastic-dialog\", DialogElement)\n","import DialogElement from \"./dialogElement\"\n\nclass PaneElement extends DialogElement {\n connectedCallback() {\n super.connectedCallback()\n\n const lastVisit = Turbo.navigator.history.location\n\n if (!window.modalVisitStack) {\n window.modalVisitStack = []\n }\n\n window.modalVisitStack.push(lastVisit)\n Turbo.navigator.history.push(new URL(this.parentElement.getAttribute(\"src\")))\n }\n\n close(event, self = false) {\n if (self && event.target !== this) return\n\n super.close(event, self)\n\n if (window.modalVisitStack.length > 0) {\n Turbo.navigator.history.replace(window.modalVisitStack.pop())\n }\n }\n}\n\ncustomElements.define(\"overlastic-pane\", PaneElement)\n","import { disableBodyScroll, enableBodyScroll } from \"body-scroll-lock\"\n\nimport \"./clickInterceptor\"\nimport \"./streamAction\"\nimport \"./dialogElement\"\nimport \"./paneElement\"\n\nwindow.disableBodyScroll = disableBodyScroll\nwindow.enableBodyScroll = enableBodyScroll\n"],"names":["hasPassiveEvents","window","passiveTestOptions","passive","addEventListener","removeEventListener","isIosDevice","navigator","platform","test","maxTouchPoints","locks","documentListenerAdded","initialClientY","previousBodyOverflowSetting","previousBodyPosition","previousBodyPaddingRight","allowTouchMove","el","some","lock","options","preventDefault","rawEvent","e","event","target","touches","length","_overlasticInitiator","_event","anchor","closest","removeAttribute","detail","fetchOptions","headers","name","dataset","overlayName","type","overlayType","overlayTarget","args","overlayArgs","script","document","querySelector","overlay","getAttribute","id","initiator","overlayInitiator","Turbo","StreamActions","overlaysReadyToDisconnect","callsToResume","oldOverlay","this","targetElements","renderNewOverlay","filter","status","bind","newOverlay","getElementById","connectTarget","firstElementChild","connectEvent","Event","bubbles","cancelable","dispatchEvent","querySelectorAll","map","element","disconnectTarget","disconnectEvent","CustomEvent","resume","every","DialogElement","HTMLElement","[object Object]","disableBodyScroll","close","self","enableBodyScroll","setTimeout","remove","customElements","define","super","connectedCallback","lastVisit","history","location","modalVisitStack","push","URL","parentElement","replace","pop","targetElement","concat","arr","Array","isArray","i","arr2","from","_toConsumableArray","requestAnimationFrame","undefined","position","body","style","top","left","_window","scrollY","scrollX","innerHeight","bottomBarHeight","_reserveScrollBarGap","reserveScrollBarGap","scrollBarGap","innerWidth","documentElement","clientWidth","computedBodyPaddingRight","parseInt","getComputedStyle","getPropertyValue","paddingRight","overflow","setOverflowHidden","ontouchstart","targetTouches","clientY","ontouchmove","scrollTop","scrollHeight","clientHeight","isTargetElementTotallyScrolled","stopPropagation","handleScroll","console","error","y","x","scrollTo","restorePositionSetting"],"mappings":"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"}
|
1
|
+
{"version":3,"file":"overlastic.min.js","sources":["../../javascript/overlastic/clickInterceptor.js","../../javascript/overlastic/streamAction.js"],"sourcesContent":["// Save the clicked element for use down the line.\naddEventListener(\"click\", event => {\n window._overlasticInitiator = event.target\n}, true)\n\n// Overlay anchors come with target _blank to serve as fallback in case JS is not enabled.\naddEventListener(\"click\", _event => {\n const anchor = window._overlasticInitiator?.closest(\"a[data-overlay-name]\")\n\n if (anchor) {\n anchor.removeAttribute(\"target\")\n }\n}, true)\n\n// Allow progressive enhancement by telling the server if a request is handled by Turbo.\naddEventListener(\"turbo:before-fetch-request\", event => {\n event.detail.fetchOptions.headers[\"Overlay-Enabled\"] = \"1\"\n})\n\n// When an overlay anchor is clicked,\n// send its type, target and args along with the visit request.\naddEventListener(\"turbo:before-fetch-request\", event => {\n const anchor = window._overlasticInitiator?.closest(\"a[data-overlay-name]\")\n const name = anchor?.dataset?.overlayName\n const type = anchor?.dataset?.overlayType\n const target = anchor?.dataset?.overlayTarget\n const args = anchor?.dataset?.overlayArgs\n\n if (anchor) {\n event.detail.fetchOptions.headers[\"Overlay-Initiator\"] = \"1\"\n event.detail.fetchOptions.headers[\"Overlay-Name\"] = name\n\n if (type) {\n event.detail.fetchOptions.headers[\"Overlay-Type\"] = type\n }\n\n if (target) {\n event.detail.fetchOptions.headers[\"Overlay-Target\"] = target\n }\n\n if (args) {\n event.detail.fetchOptions.headers[\"Overlay-Args\"] = args\n }\n }\n})\n\n// When the redirect script triggers a fetch,\n// send the current overlay's target along with the visit request.\naddEventListener(\"turbo:before-fetch-request\", event => {\n const script = document.querySelector(\"script[overlay]\")\n\n if (script) {\n const overlay = document.querySelector(`overlastic[id=${script.getAttribute(\"overlay\")}]`)\n\n if (overlay) {\n const name = overlay.id\n const target = overlay.dataset.overlayTarget\n const type = overlay.dataset?.overlayType\n const args = overlay.dataset?.overlayArgs\n\n event.detail.fetchOptions.headers[\"Overlay-Name\"] = name\n event.detail.fetchOptions.headers[\"Overlay-Target\"] = target\n event.detail.fetchOptions.headers[\"Overlay-Initiator\"] = \"1\"\n\n if (type) {\n event.detail.fetchOptions.headers[\"Overlay-Type\"] = type\n }\n\n if (args) {\n event.detail.fetchOptions.headers[\"Overlay-Args\"] = args\n }\n }\n }\n})\n\n// When any other element triggers a fetch,\n// send the current overlay's target along with the visit request.\naddEventListener(\"turbo:before-fetch-request\", event => {\n const initiator = window._overlasticInitiator?.closest(\"a, form\")\n const overlay = initiator?.closest(\"overlastic\")\n\n if (overlay && !initiator.dataset.overlay && !initiator.dataset.overlayName) {\n const name = overlay.id\n const target = overlay.dataset.overlayTarget\n const initiator = overlay.dataset?.overlayInitiator\n const type = overlay.dataset?.overlayType\n const args = overlay.dataset?.overlayArgs\n\n event.detail.fetchOptions.headers[\"Overlay-Name\"] = name\n event.detail.fetchOptions.headers[\"Overlay-Target\"] = target\n\n if (initiator) {\n event.detail.fetchOptions.headers[\"Overlay-Initiator\"] = initiator\n }\n\n if (type) {\n event.detail.fetchOptions.headers[\"Overlay-Type\"] = type\n }\n\n if (args) {\n event.detail.fetchOptions.headers[\"Overlay-Args\"] = args\n }\n }\n\n delete window._overlasticInitiator\n})\n","// Custom Stream action that allows for finer control of the overlay lifecycle.\n//\n// Lifecycle events:\n// - overlastic:disconnect right before removing an overlay from the DOM\n// - overlastic:connect right after attaching an overlay to the DOM\n//\n// Both events target the firstElementChild of the overlastic tag to allow for\n// a cleaner listening approach in libraries like Stimulus or Alpine.\n//\n// The disconnect event is dispatched once for every overlay that will be removed.\n// They can be paused and resumed. The new overlay won't be attached until all events\n// have been resumed.\nTurbo.StreamActions[\"replaceOverlay\"] = function() {\n let overlaysReadyToDisconnect = []\n let callsToResume = 0\n\n const oldOverlay = this.targetElements[0]\n const overlayName = oldOverlay.id\n const renderNewOverlay = () => {\n callsToResume++\n\n if (callsToResume >= overlaysReadyToDisconnect.filter(status => status === false).length) {\n Turbo.StreamActions[\"replace\"].bind(this)()\n\n const newOverlay = document.getElementById(overlayName)\n const connectTarget = newOverlay.firstElementChild || newOverlay\n const connectEvent = new Event(\"overlastic:connect\", { bubbles: true, cancelable: false })\n\n connectTarget.dispatchEvent(connectEvent)\n }\n }\n\n overlaysReadyToDisconnect = [oldOverlay, ...oldOverlay.querySelectorAll(\"overlastic\")].map(element => {\n const disconnectTarget = element.firstElementChild || element\n const disconnectEvent =\n new CustomEvent(\"overlastic:disconnect\", { bubbles: true, cancelable: true, detail: { resume: renderNewOverlay } })\n\n return disconnectTarget.dispatchEvent(disconnectEvent)\n })\n\n if (overlaysReadyToDisconnect.every(status => status === true)) {\n renderNewOverlay()\n }\n}\n"],"names":["addEventListener","event","window","_overlasticInitiator","target","_event","anchor","closest","removeAttribute","detail","fetchOptions","headers","name","dataset","overlayName","type","overlayType","overlayTarget","args","overlayArgs","script","document","querySelector","overlay","getAttribute","id","initiator","overlayInitiator","Turbo","StreamActions","overlaysReadyToDisconnect","callsToResume","oldOverlay","this","targetElements","renderNewOverlay","filter","status","length","bind","newOverlay","getElementById","connectTarget","firstElementChild","connectEvent","Event","bubbles","cancelable","dispatchEvent","querySelectorAll","map","element","disconnectTarget","disconnectEvent","CustomEvent","resume","every"],"mappings":"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"}
|
@@ -1,9 +1,2 @@
|
|
1
|
-
import { disableBodyScroll, enableBodyScroll } from "body-scroll-lock"
|
2
|
-
|
3
1
|
import "./clickInterceptor"
|
4
2
|
import "./streamAction"
|
5
|
-
import "./dialogElement"
|
6
|
-
import "./paneElement"
|
7
|
-
|
8
|
-
window.disableBodyScroll = disableBodyScroll
|
9
|
-
window.enableBodyScroll = enableBodyScroll
|
@@ -1,6 +1,6 @@
|
|
1
1
|
<% title ||= "" %>
|
2
2
|
|
3
|
-
<
|
3
|
+
<div class="overlay" style="height:100vh;background-color:rgba(107, 114, 128, 0.5);justify-content:center;align-items:center;width: 100vw;display:flex;z-index:50;left:0px;top:0px;position:fixed;box-sizing:border-box;border-width:0px;border-style:solid;border-color:rgb(229, 231, 235);">
|
4
4
|
<div style="width: 50%;justify-content:center;align-items:center;flex-direction:column;max-width:672px;height:662.398px;display:flex;box-sizing:border-box;border-width:0px;border-style:solid;border-color:rgb(229, 231, 235);">
|
5
5
|
<div style="padding-top:32px;padding-bottom:32px;box-shadow:rgba(0, 0, 0, 0) 0px 0px 0px 0px, rgba(0, 0, 0, 0) 0px 0px 0px 0px, rgba(0, 0, 0, 0.1) 0px 4px 6px -1px, rgba(0, 0, 0, 0.1) 0px 2px 4px -2px;background-color:rgb(255, 255, 255);overflow:hidden;box-sizing:border-box;border-width:0px;border-style:solid;border-color:rgb(229, 231, 235);">
|
6
6
|
<div style="padding-left:32px;padding-right:32px;justify-content:space-between;align-items:center;display:flex;box-sizing:border-box;border-width:0px;border-style:solid;border-color:rgb(229, 231, 235);">
|
@@ -8,7 +8,7 @@
|
|
8
8
|
<%= title %>
|
9
9
|
</label>
|
10
10
|
|
11
|
-
<span
|
11
|
+
<span onclick="this.closest('.overlay').remove()" style="color:rgb(75, 85, 99);cursor:pointer;box-sizing:border-box;border-width:0px;border-style:solid;border-color:rgb(229, 231, 235);">
|
12
12
|
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 320 512" style="width: 1.25rem;height:20px;display:block;vertical-align:middle;box-sizing:border-box;border-width:0px;border-style:solid;border-color:rgb(229, 231, 235);fill:currentColor;">
|
13
13
|
<!--! Font Awesome Pro 6.2.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license (Commercial License) Copyright 2022 Fonticons, Inc. -->
|
14
14
|
<path d="M310.6 150.6c12.5-12.5 12.5-32.8 0-45.3s-32.8-12.5-45.3 0L160 210.7 54.6 105.4c-12.5-12.5-32.8-12.5-45.3 0s-12.5 32.8 0 45.3L114.7 256 9.4 361.4c-12.5 12.5-12.5 32.8 0 45.3s32.8 12.5 45.3 0L160 301.3 265.4 406.6c12.5 12.5 32.8 12.5 45.3 0s12.5-32.8 0-45.3L205.3 256 310.6 150.6z" style="box-sizing:border-box;border-width:0px;border-style:solid;border-color:rgb(229, 231, 235);"></path>
|
@@ -21,4 +21,4 @@
|
|
21
21
|
</div>
|
22
22
|
</div>
|
23
23
|
</div>
|
24
|
-
</
|
24
|
+
</div>
|
@@ -1,8 +1,8 @@
|
|
1
|
-
<
|
1
|
+
<div class="overlay" style="background-color:rgba(107, 114, 128, 0.5);justify-content:flex-end;width: 100vw;height:100vh;display:flex;z-index:40;left:0px;top:0px;position:fixed;box-sizing:border-box;border-width:0px;border-style:solid;border-color:rgb(229, 231, 235);">
|
2
2
|
<div style="width: 66.6667%;align-items:flex-end;flex-direction:column;animation:0.2s ease 0s 1 normal both running modal;height:100%;display:flex;box-sizing:border-box;border-width:0px;border-style:solid;border-color:rgb(229, 231, 235);">
|
3
3
|
<div style="box-shadow:rgba(0, 0, 0, 0) 0px 0px 0px 0px, rgba(0, 0, 0, 0) 0px 0px 0px 0px, rgba(0, 0, 0, 0.1) 0px 4px 6px -1px, rgba(0, 0, 0, 0.1) 0px 2px 4px -2px;padding-top:20px;padding-bottom:20px;background-color:rgb(249, 250, 251);border-top-left-radius:8px;border-bottom-left-radius:8px;overflow:hidden;width: 100%;height:100%;box-sizing:border-box;border-width:0px;border-style:solid;border-color:rgb(229, 231, 235);">
|
4
4
|
<div style="padding-left:20px;padding-right:20px;justify-content:space-between;align-items:center;display:flex;margin-bottom:12px;box-sizing:border-box;border-width:0px;border-style:solid;border-color:rgb(229, 231, 235);">
|
5
|
-
<span
|
5
|
+
<span onclick="this.closest('.overlay').remove()" style="color:rgb(75, 85, 99);cursor:pointer;box-sizing:border-box;border-width:0px;border-style:solid;border-color:rgb(229, 231, 235);">
|
6
6
|
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 320 512" style="width: 2rem;height:32px;display:block;vertical-align:middle;box-sizing:border-box;border-width:0px;border-style:solid;border-color:rgb(229, 231, 235);fill:currentColor;">
|
7
7
|
<!--! Font Awesome Pro 6.2.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license (Commercial License) Copyright 2022 Fonticons, Inc. -->
|
8
8
|
<path d="M310.6 150.6c12.5-12.5 12.5-32.8 0-45.3s-32.8-12.5-45.3 0L160 210.7 54.6 105.4c-12.5-12.5-32.8-12.5-45.3 0s-12.5 32.8 0 45.3L114.7 256 9.4 361.4c-12.5 12.5-12.5 32.8 0 45.3s32.8 12.5 45.3 0L160 301.3 265.4 406.6c12.5 12.5 32.8 12.5 45.3 0s12.5-32.8 0-45.3L205.3 256 310.6 150.6z" style="box-sizing:border-box;border-width:0px;border-style:solid;border-color:rgb(229, 231, 235);"></path>
|
@@ -15,4 +15,4 @@
|
|
15
15
|
</div>
|
16
16
|
</div>
|
17
17
|
</div>
|
18
|
-
</
|
18
|
+
</div>
|
@@ -1,6 +1,6 @@
|
|
1
1
|
<% title ||= "" %>
|
2
2
|
|
3
|
-
<
|
3
|
+
<div class="overlay fixed top-0 left-0 z-50 flex justify-center w-screen h-screen-safe items-center bg-gray-500 bg-opacity-50">
|
4
4
|
<div class="w-11/12 sm:w-5/6 lg:w-1/2 max-w-2xl h-[90vh] flex flex-col justify-center items-center">
|
5
5
|
<div class="py-4 sm:py-8 bg-white shadow-md overflow-hidden">
|
6
6
|
<div class="px-4 sm:px-8 flex justify-between items-center">
|
@@ -8,7 +8,7 @@
|
|
8
8
|
<%= title %>
|
9
9
|
</label>
|
10
10
|
|
11
|
-
<span class="
|
11
|
+
<span onclick="this.closest('.overlay').remove()" class="cursor-pointer text-gray-600">
|
12
12
|
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 320 512" class="w-5 h-5 fill-current">
|
13
13
|
<!--! Font Awesome Pro 6.2.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license (Commercial License) Copyright 2022 Fonticons, Inc. -->
|
14
14
|
<path d="M310.6 150.6c12.5-12.5 12.5-32.8 0-45.3s-32.8-12.5-45.3 0L160 210.7 54.6 105.4c-12.5-12.5-32.8-12.5-45.3 0s-12.5 32.8 0 45.3L114.7 256 9.4 361.4c-12.5 12.5-12.5 32.8 0 45.3s32.8 12.5 45.3 0L160 301.3 265.4 406.6c12.5 12.5 32.8 12.5 45.3 0s12.5-32.8 0-45.3L205.3 256 310.6 150.6z"/>
|
@@ -21,4 +21,4 @@
|
|
21
21
|
</div>
|
22
22
|
</div>
|
23
23
|
</div>
|
24
|
-
</
|
24
|
+
</div>
|
@@ -1,8 +1,8 @@
|
|
1
|
-
<
|
1
|
+
<div class="overlay fixed top-0 left-0 z-40 flex justify-end w-screen h-screen bg-gray-500 bg-opacity-50">
|
2
2
|
<div class="w-full sm:w-5/6 lg:w-8/12 h-full flex flex-col items-end animate-modal">
|
3
3
|
<div id="split-container" class="py-5 bg-gray-50 rounded-l-lg shadow-md overflow-hidden w-full h-full">
|
4
4
|
<div class="px-5 mb-3 flex justify-between items-center">
|
5
|
-
<span class="
|
5
|
+
<span onclick="this.closest('.overlay').remove()" class="cursor-pointer text-gray-600">
|
6
6
|
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 320 512" class="w-8 h-8 fill-current">
|
7
7
|
<!--! Font Awesome Pro 6.2.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license (Commercial License) Copyright 2022 Fonticons, Inc. -->
|
8
8
|
<path d="M310.6 150.6c12.5-12.5 12.5-32.8 0-45.3s-32.8-12.5-45.3 0L160 210.7 54.6 105.4c-12.5-12.5-32.8-12.5-45.3 0s-12.5 32.8 0 45.3L114.7 256 9.4 361.4c-12.5 12.5-12.5 32.8 0 45.3s32.8 12.5 45.3 0L160 301.3 265.4 406.6c12.5 12.5 32.8 12.5 45.3 0s12.5-32.8 0-45.3L205.3 256 310.6 150.6z"/>
|
@@ -15,4 +15,4 @@
|
|
15
15
|
</div>
|
16
16
|
</div>
|
17
17
|
</div>
|
18
|
-
</
|
18
|
+
</div>
|
data/lib/overlastic/version.rb
CHANGED
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: overlastic
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.10.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Martin Zamuner
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2022-
|
11
|
+
date: 2022-10-02 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: actionpack
|
@@ -69,9 +69,7 @@ files:
|
|
69
69
|
- app/helpers/overlastic/overlays_helper.rb
|
70
70
|
- app/helpers/overlastic/streams_helper.rb
|
71
71
|
- app/javascript/overlastic/clickInterceptor.js
|
72
|
-
- app/javascript/overlastic/dialogElement.js
|
73
72
|
- app/javascript/overlastic/index.js
|
74
|
-
- app/javascript/overlastic/paneElement.js
|
75
73
|
- app/javascript/overlastic/streamAction.js
|
76
74
|
- app/views/overlastic/inline/_dialog.html.erb
|
77
75
|
- app/views/overlastic/inline/_pane.html.erb
|
@@ -109,5 +107,6 @@ requirements: []
|
|
109
107
|
rubygems_version: 3.2.22
|
110
108
|
signing_key:
|
111
109
|
specification_version: 4
|
112
|
-
summary: Fantastically easy overlays using Hotwire.
|
110
|
+
summary: Fantastically easy overlays using Hotwire. Bring your dialog modals and slide-out
|
111
|
+
panes to life.
|
113
112
|
test_files: []
|
@@ -1,21 +0,0 @@
|
|
1
|
-
export default class DialogElement extends HTMLElement {
|
2
|
-
connectedCallback() {
|
3
|
-
disableBodyScroll(this)
|
4
|
-
|
5
|
-
this.addEventListener("click", event => this.close(event, true))
|
6
|
-
this.querySelector(".overlastic-close").addEventListener("click", event => this.close(event))
|
7
|
-
}
|
8
|
-
|
9
|
-
close(event, self = false) {
|
10
|
-
if (self && event.target !== this) return
|
11
|
-
|
12
|
-
enableBodyScroll(this)
|
13
|
-
|
14
|
-
// Avoid removing before sending dispatching other events (like form submissions)
|
15
|
-
setTimeout(() => {
|
16
|
-
this.remove()
|
17
|
-
}, 5)
|
18
|
-
}
|
19
|
-
}
|
20
|
-
|
21
|
-
customElements.define("overlastic-dialog", DialogElement)
|
@@ -1,28 +0,0 @@
|
|
1
|
-
import DialogElement from "./dialogElement"
|
2
|
-
|
3
|
-
class PaneElement extends DialogElement {
|
4
|
-
connectedCallback() {
|
5
|
-
super.connectedCallback()
|
6
|
-
|
7
|
-
const lastVisit = Turbo.navigator.history.location
|
8
|
-
|
9
|
-
if (!window.modalVisitStack) {
|
10
|
-
window.modalVisitStack = []
|
11
|
-
}
|
12
|
-
|
13
|
-
window.modalVisitStack.push(lastVisit)
|
14
|
-
Turbo.navigator.history.push(new URL(this.parentElement.getAttribute("src")))
|
15
|
-
}
|
16
|
-
|
17
|
-
close(event, self = false) {
|
18
|
-
if (self && event.target !== this) return
|
19
|
-
|
20
|
-
super.close(event, self)
|
21
|
-
|
22
|
-
if (window.modalVisitStack.length > 0) {
|
23
|
-
Turbo.navigator.history.replace(window.modalVisitStack.pop())
|
24
|
-
}
|
25
|
-
}
|
26
|
-
}
|
27
|
-
|
28
|
-
customElements.define("overlastic-pane", PaneElement)
|