overlastic 0.2.0 → 0.3.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: b15c1e8912468223f9b071536a31595df060b4c4fc43650fa90a023acfbc6ac5
4
- data.tar.gz: 55859a726aef8e8b2983e36b13211f45ae6950354f79cb77ee360200006dae8d
3
+ metadata.gz: bda80a4a2551cff283adee236709eec0c463cbe2bc3ca7b218742b84877584ef
4
+ data.tar.gz: 938eb098db92191e485e6bb4dade9496dd68b5f934af7291d5961fe274c8e814
5
5
  SHA512:
6
- metadata.gz: 48f45ab76516fa475fb83b147115af03f53f739f8e2cc11cb1c187df3cf9928a7aad1d1d3bac4b3c3f0e6701af1a2a4d81a4a34c70a1e48015cde6451509f34f
7
- data.tar.gz: e04854b3ab1dadfd2e15c613dd37f36dc0f6c10f69f1e268dc059bc1ba70c103a68ce71406c9fd7bc2320552798ea1099a6836c88b7cd3d30b4b32729cb2aea6
6
+ metadata.gz: d53a5c31f75bb3c00652d91974f43061de0a5a6f38dfe7802ff9a59d248136f5b05fe22d23ddd5c186e2c218b71ae4802f607152a88c27cd089e679bde7d7c56
7
+ data.tar.gz: 53fb86bb7138bedd8a4c8cf05abb2e4787cfec0215fb7dff9c01924ed5b340cd1e078d2bdf927b3304059200a08bfe18b1625d72bff50b879cd16b502f61d6ff
data/README.md CHANGED
@@ -1,3 +1,6 @@
1
+ ![GitHub Workflow Status](https://img.shields.io/github/workflow/status/martinzamuner/overlastic/CI)
2
+ ![Gem](https://img.shields.io/gem/v/overlastic)
3
+
1
4
  # Overlastic
2
5
 
3
6
  Load any page inside an overlay (dialog modal, slide-out pane, or whatever else floats your boat). As easy as replacing `link_to` with `link_to_dialog`.
@@ -29,13 +32,19 @@ They work just as `link_to` and accept the same options. You can also pass local
29
32
  <%= link_to_dialog "Open dialog", edit_article_path, overlay_args: { title: "Dialog title" } %>
30
33
  ```
31
34
 
32
- By default, overlays stack on top of each other. You can instead replace the last one or the whole stack:
35
+ Nested overlays will stack on top of each other. You can instead replace the last one or the whole stack:
33
36
 
34
37
  ```erb
35
38
  <%= link_to_dialog "Open dialog", edit_article_path, overlay_action: :replace_last %>
36
39
  <%= link_to_dialog "Open dialog", edit_article_path, overlay_action: :replace_all %>
37
40
  ```
38
41
 
42
+ By default, links and forms inside an overlay will drive the entire page (target _top). To keep navigation within the overlay you can set its target to _self:
43
+
44
+ ```erb
45
+ <%= link_to_dialog "Open dialog", edit_article_path, overlay_target: :_self %>
46
+ ```
47
+
39
48
  Sometimes, you may want to alter the content depending on whether it's inside an overlay or not. Overlastic defines a new `:overlay` request variant that you can use to create custom partials like `_form.html+overlay.erb` or inside a controller like so:
40
49
 
41
50
  ```rb
@@ -203,12 +203,23 @@ var enableBodyScroll$1 = function enableBodyScroll(targetElement) {
203
203
  };
204
204
 
205
205
  addEventListener("click", (event => {
206
- window._overlasticTarget = event.target.closest("[data-turbo-frame*=overlay]");
206
+ window._overlasticClickedElement = event.target.closest("[data-turbo-frame^=overlay]");
207
+ }));
208
+
209
+ addEventListener("click", (_event => {
210
+ if (!window._overlasticClickedElement) return;
211
+ const target = window._overlasticClickedElement.dataset.overlayTarget;
212
+ const frame = document.querySelector(`turbo-frame#${window._overlasticClickedElement.dataset.turboFrame}`);
213
+ if (target === "_self") {
214
+ frame.removeAttribute("target");
215
+ } else {
216
+ frame.setAttribute("target", "_top");
217
+ }
207
218
  }));
208
219
 
209
220
  addEventListener("turbo:before-fetch-request", (event => {
210
- if (!window._overlasticTarget) return;
211
- const target = window._overlasticTarget;
221
+ if (!window._overlasticClickedElement) return;
222
+ const target = window._overlasticClickedElement;
212
223
  const type = target?.dataset?.overlayType;
213
224
  const args = target?.dataset?.overlayArgs;
214
225
  if (type) {
@@ -1,2 +1,2 @@
1
- var e=!1;if("undefined"!=typeof window){var t={get passive(){e=!0}};window.addEventListener("testPassive",null,t),window.removeEventListener("testPassive",null,t)}var o="undefined"!=typeof window&&window.navigator&&window.navigator.platform&&(/iP(ad|hone|od)/.test(window.navigator.platform)||"MacIntel"===window.navigator.platform&&window.navigator.maxTouchPoints>1),n=[],i=!1,r=-1,l=void 0,d=void 0,s=void 0,a=function(e){return n.some((function(t){return!(!t.options.allowTouchMove||!t.options.allowTouchMove(e))}))},c=function(e){var t=e||window.event;return!!a(t.target)||(t.touches.length>1||(t.preventDefault&&t.preventDefault(),!1))};addEventListener("click",(e=>{window._overlasticTarget=e.target.closest("[data-turbo-frame*=overlay]")})),addEventListener("turbo:before-fetch-request",(e=>{if(!window._overlasticTarget)return;const t=window._overlasticTarget,o=t?.dataset?.overlayType,n=t?.dataset?.overlayArgs;o&&(e.detail.fetchOptions.headers["Overlay-Type"]=o),n&&(e.detail.fetchOptions.headers["Overlay-Args"]=n),delete window._overlasticTarget}));class u extends HTMLElement{connectedCallback(){disableBodyScroll(this),this.addEventListener("click",(e=>this.close(e,!0))),this.querySelector(".overlastic-close").addEventListener("click",(e=>this.close(e)))}close(e,t=!1){t&&e.target!==this||(enableBodyScroll(this),setTimeout((()=>{this.remove()}),5))}}customElements.define("overlastic-dialog",u);customElements.define("overlastic-pane",class extends u{connectedCallback(){super.connectedCallback();const e=Turbo.navigator.history.location;window.modalVisitStack||(window.modalVisitStack=[]),window.modalVisitStack.push(e),Turbo.navigator.history.push(new URL(this.parentElement.src))}close(e,t=!1){t&&e.target!==this||(super.close(e,t),window.modalVisitStack.length>0&&Turbo.navigator.history.replace(window.modalVisitStack.pop()))}}),window.disableBodyScroll=function(t,u){if(t){if(!n.some((function(e){return e.targetElement===t}))){var v={targetElement:t,options:u||{}};n=[].concat(function(e){if(Array.isArray(e)){for(var t=0,o=Array(e.length);t<e.length;t++)o[t]=e[t];return o}return Array.from(e)}(n),[v]),o?window.requestAnimationFrame((function(){if(void 0===d){d={position:document.body.style.position,top:document.body.style.top,left:document.body.style.left};var e=window,t=e.scrollY,o=e.scrollX,n=e.innerHeight;document.body.style.position="fixed",document.body.style.top=-t,document.body.style.left=-o,setTimeout((function(){return window.requestAnimationFrame((function(){var e=n-window.innerHeight;e&&t>=n&&(document.body.style.top=-(t+e))}))}),300)}})):function(e){if(void 0===s){var t=!!e&&!0===e.reserveScrollBarGap,o=window.innerWidth-document.documentElement.clientWidth;if(t&&o>0){var n=parseInt(window.getComputedStyle(document.body).getPropertyValue("padding-right"),10);s=document.body.style.paddingRight,document.body.style.paddingRight=n+o+"px"}}void 0===l&&(l=document.body.style.overflow,document.body.style.overflow="hidden")}(u),o&&(t.ontouchstart=function(e){1===e.targetTouches.length&&(r=e.targetTouches[0].clientY)},t.ontouchmove=function(e){1===e.targetTouches.length&&function(e,t){var o=e.targetTouches[0].clientY-r;!a(e.target)&&(t&&0===t.scrollTop&&o>0||function(e){return!!e&&e.scrollHeight-e.scrollTop<=e.clientHeight}(t)&&o<0?c(e):e.stopPropagation())}(e,t)},i||(document.addEventListener("touchmove",c,e?{passive:!1}:void 0),i=!0))}}else console.error("disableBodyScroll unsuccessful - targetElement must be provided when calling disableBodyScroll on IOS devices.")},window.enableBodyScroll=function(t){t?(n=n.filter((function(e){return e.targetElement!==t})),o&&(t.ontouchstart=null,t.ontouchmove=null,i&&0===n.length&&(document.removeEventListener("touchmove",c,e?{passive:!1}:void 0),i=!1)),o?function(){if(void 0!==d){var e=-parseInt(document.body.style.top,10),t=-parseInt(document.body.style.left,10);document.body.style.position=d.position,document.body.style.top=d.top,document.body.style.left=d.left,window.scrollTo(t,e),d=void 0}}():(void 0!==s&&(document.body.style.paddingRight=s,s=void 0),void 0!==l&&(document.body.style.overflow=l,l=void 0))):console.error("enableBodyScroll unsuccessful - targetElement must be provided when calling enableBodyScroll on IOS devices.")};
1
+ var e=!1;if("undefined"!=typeof window){var t={get passive(){e=!0}};window.addEventListener("testPassive",null,t),window.removeEventListener("testPassive",null,t)}var o="undefined"!=typeof window&&window.navigator&&window.navigator.platform&&(/iP(ad|hone|od)/.test(window.navigator.platform)||"MacIntel"===window.navigator.platform&&window.navigator.maxTouchPoints>1),n=[],i=!1,r=-1,l=void 0,d=void 0,s=void 0,a=function(e){return n.some((function(t){return!(!t.options.allowTouchMove||!t.options.allowTouchMove(e))}))},c=function(e){var t=e||window.event;return!!a(t.target)||(t.touches.length>1||(t.preventDefault&&t.preventDefault(),!1))};addEventListener("click",(e=>{window._overlasticClickedElement=e.target.closest("[data-turbo-frame^=overlay]")})),addEventListener("click",(e=>{if(!window._overlasticClickedElement)return;const t=window._overlasticClickedElement.dataset.overlayTarget,o=document.querySelector(`turbo-frame#${window._overlasticClickedElement.dataset.turboFrame}`);"_self"===t?o.removeAttribute("target"):o.setAttribute("target","_top")})),addEventListener("turbo:before-fetch-request",(e=>{if(!window._overlasticClickedElement)return;const t=window._overlasticClickedElement,o=t?.dataset?.overlayType,n=t?.dataset?.overlayArgs;o&&(e.detail.fetchOptions.headers["Overlay-Type"]=o),n&&(e.detail.fetchOptions.headers["Overlay-Args"]=n),delete window._overlasticTarget}));class u extends HTMLElement{connectedCallback(){disableBodyScroll(this),this.addEventListener("click",(e=>this.close(e,!0))),this.querySelector(".overlastic-close").addEventListener("click",(e=>this.close(e)))}close(e,t=!1){t&&e.target!==this||(enableBodyScroll(this),setTimeout((()=>{this.remove()}),5))}}customElements.define("overlastic-dialog",u);customElements.define("overlastic-pane",class extends u{connectedCallback(){super.connectedCallback();const e=Turbo.navigator.history.location;window.modalVisitStack||(window.modalVisitStack=[]),window.modalVisitStack.push(e),Turbo.navigator.history.push(new URL(this.parentElement.src))}close(e,t=!1){t&&e.target!==this||(super.close(e,t),window.modalVisitStack.length>0&&Turbo.navigator.history.replace(window.modalVisitStack.pop()))}}),window.disableBodyScroll=function(t,u){if(t){if(!n.some((function(e){return e.targetElement===t}))){var v={targetElement:t,options:u||{}};n=[].concat(function(e){if(Array.isArray(e)){for(var t=0,o=Array(e.length);t<e.length;t++)o[t]=e[t];return o}return Array.from(e)}(n),[v]),o?window.requestAnimationFrame((function(){if(void 0===d){d={position:document.body.style.position,top:document.body.style.top,left:document.body.style.left};var e=window,t=e.scrollY,o=e.scrollX,n=e.innerHeight;document.body.style.position="fixed",document.body.style.top=-t,document.body.style.left=-o,setTimeout((function(){return window.requestAnimationFrame((function(){var e=n-window.innerHeight;e&&t>=n&&(document.body.style.top=-(t+e))}))}),300)}})):function(e){if(void 0===s){var t=!!e&&!0===e.reserveScrollBarGap,o=window.innerWidth-document.documentElement.clientWidth;if(t&&o>0){var n=parseInt(window.getComputedStyle(document.body).getPropertyValue("padding-right"),10);s=document.body.style.paddingRight,document.body.style.paddingRight=n+o+"px"}}void 0===l&&(l=document.body.style.overflow,document.body.style.overflow="hidden")}(u),o&&(t.ontouchstart=function(e){1===e.targetTouches.length&&(r=e.targetTouches[0].clientY)},t.ontouchmove=function(e){1===e.targetTouches.length&&function(e,t){var o=e.targetTouches[0].clientY-r;!a(e.target)&&(t&&0===t.scrollTop&&o>0||function(e){return!!e&&e.scrollHeight-e.scrollTop<=e.clientHeight}(t)&&o<0?c(e):e.stopPropagation())}(e,t)},i||(document.addEventListener("touchmove",c,e?{passive:!1}:void 0),i=!0))}}else console.error("disableBodyScroll unsuccessful - targetElement must be provided when calling disableBodyScroll on IOS devices.")},window.enableBodyScroll=function(t){t?(n=n.filter((function(e){return e.targetElement!==t})),o&&(t.ontouchstart=null,t.ontouchmove=null,i&&0===n.length&&(document.removeEventListener("touchmove",c,e?{passive:!1}:void 0),i=!1)),o?function(){if(void 0!==d){var e=-parseInt(document.body.style.top,10),t=-parseInt(document.body.style.left,10);document.body.style.position=d.position,document.body.style.top=d.top,document.body.style.left=d.left,window.scrollTo(t,e),d=void 0}}():(void 0!==s&&(document.body.style.paddingRight=s,s=void 0),void 0!==l&&(document.body.style.overflow=l,l=void 0))):console.error("enableBodyScroll unsuccessful - targetElement must be provided when calling enableBodyScroll on IOS devices.")};
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/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","addEventListener(\"click\", event => {\n window._overlasticTarget = event.target.closest(\"[data-turbo-frame*=overlay]\")\n})\n\naddEventListener(\"turbo:before-fetch-request\", event => {\n if (!window._overlasticTarget) return\n\n const target = window._overlasticTarget\n const type = target?.dataset?.overlayType\n const args = target?.dataset?.overlayArgs\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 delete window._overlasticTarget\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.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 \"./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","_overlasticTarget","closest","type","dataset","overlayType","args","overlayArgs","detail","fetchOptions","headers","DialogElement","HTMLElement","[object Object]","disableBodyScroll","this","close","querySelector","self","enableBodyScroll","setTimeout","remove","customElements","define","super","connectedCallback","lastVisit","Turbo","history","location","modalVisitStack","push","URL","parentElement","src","replace","pop","targetElement","concat","arr","Array","isArray","i","arr2","from","_toConsumableArray","requestAnimationFrame","undefined","position","document","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","filter","y","x","scrollTo","restorePositionSetting"],"mappings":"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"}
1
+ {"version":3,"file":"overlastic.min.js","sources":["../../../node_modules/body-scroll-lock/lib/bodyScrollLock.esm.js","../../javascript/overlastic/clickInterceptor.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 overlay link element for use down the line\naddEventListener(\"click\", event => {\n window._overlasticClickedElement = event.target.closest(\"[data-turbo-frame^=overlay]\")\n})\n\n// Set the correct target for the frame according to the desired behavior\naddEventListener(\"click\", _event => {\n if (!window._overlasticClickedElement) return\n\n const target = window._overlasticClickedElement.dataset.overlayTarget\n const frame = document.querySelector(`turbo-frame#${window._overlasticClickedElement.dataset.turboFrame}`)\n\n if (target === \"_self\") {\n frame.removeAttribute(\"target\")\n } else {\n frame.setAttribute(\"target\", \"_top\")\n }\n})\n\n// Send overlay type and args along with the frame request\naddEventListener(\"turbo:before-fetch-request\", event => {\n if (!window._overlasticClickedElement) return\n\n const target = window._overlasticClickedElement\n const type = target?.dataset?.overlayType\n const args = target?.dataset?.overlayArgs\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 delete window._overlasticTarget\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.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 \"./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","_overlasticClickedElement","closest","_event","dataset","overlayTarget","frame","document","querySelector","turboFrame","removeAttribute","setAttribute","type","overlayType","args","overlayArgs","detail","fetchOptions","headers","_overlasticTarget","DialogElement","HTMLElement","[object Object]","disableBodyScroll","this","close","self","enableBodyScroll","setTimeout","remove","customElements","define","super","connectedCallback","lastVisit","Turbo","history","location","modalVisitStack","push","URL","parentElement","src","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","filter","y","x","scrollTo","restorePositionSetting"],"mappings":"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"}
@@ -14,6 +14,9 @@ module Overlastic::NavigationHelper
14
14
  action = options.delete("overlay_action") || Overlastic.configuration.default_action
15
15
  options["data"][:turbo_frame] = turbo_frame_from_overlastic_action(action)
16
16
 
17
+ target = options.delete("overlay_target")
18
+ options["data"][:overlay_target] = target if target.present?
19
+
17
20
  args = options.delete("overlay_args")
18
21
  options["data"][:overlay_args] = args.to_json if args.present?
19
22
 
@@ -29,6 +32,9 @@ module Overlastic::NavigationHelper
29
32
  action = html_options.delete("overlay_action") || Overlastic.configuration.default_action
30
33
  html_options["data"][:turbo_frame] = turbo_frame_from_overlastic_action(action)
31
34
 
35
+ target = html_options.delete("overlay_target")
36
+ html_options["data"][:overlay_target] = target if target.present?
37
+
32
38
  args = html_options.delete("overlay_args")
33
39
  html_options["data"][:overlay_args] = args.to_json if args.present?
34
40
 
@@ -1,11 +1,27 @@
1
+ // Save the clicked overlay link element for use down the line
1
2
  addEventListener("click", event => {
2
- window._overlasticTarget = event.target.closest("[data-turbo-frame*=overlay]")
3
+ window._overlasticClickedElement = event.target.closest("[data-turbo-frame^=overlay]")
3
4
  })
4
5
 
6
+ // Set the correct target for the frame according to the desired behavior
7
+ addEventListener("click", _event => {
8
+ if (!window._overlasticClickedElement) return
9
+
10
+ const target = window._overlasticClickedElement.dataset.overlayTarget
11
+ const frame = document.querySelector(`turbo-frame#${window._overlasticClickedElement.dataset.turboFrame}`)
12
+
13
+ if (target === "_self") {
14
+ frame.removeAttribute("target")
15
+ } else {
16
+ frame.setAttribute("target", "_top")
17
+ }
18
+ })
19
+
20
+ // Send overlay type and args along with the frame request
5
21
  addEventListener("turbo:before-fetch-request", event => {
6
- if (!window._overlasticTarget) return
22
+ if (!window._overlasticClickedElement) return
7
23
 
8
- const target = window._overlasticTarget
24
+ const target = window._overlasticClickedElement
9
25
  const type = target?.dataset?.overlayType
10
26
  const args = target?.dataset?.overlayArgs
11
27
 
@@ -1,3 +1,3 @@
1
1
  module Overlastic
2
- VERSION = "0.2.0"
2
+ VERSION = "0.3.0"
3
3
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: overlastic
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.2.0
4
+ version: 0.3.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Martin Zamuner