diff core/misc/displace.js @ 0:4c8ae668cc8c

Initial import (non-working)
author Chris Cannam
date Wed, 29 Nov 2017 16:09:58 +0000
parents
children 1fec387a4317
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/core/misc/displace.js	Wed Nov 29 16:09:58 2017 +0000
@@ -0,0 +1,106 @@
+/**
+* DO NOT EDIT THIS FILE.
+* See the following change record for more information,
+* https://www.drupal.org/node/2815083
+* @preserve
+**/
+
+(function ($, Drupal, debounce) {
+  var offsets = {
+    top: 0,
+    right: 0,
+    bottom: 0,
+    left: 0
+  };
+
+  Drupal.behaviors.drupalDisplace = {
+    attach: function attach() {
+      if (this.displaceProcessed) {
+        return;
+      }
+      this.displaceProcessed = true;
+
+      $(window).on('resize.drupalDisplace', debounce(displace, 200));
+    }
+  };
+
+  function displace(broadcast) {
+    offsets = Drupal.displace.offsets = calculateOffsets();
+    if (typeof broadcast === 'undefined' || broadcast) {
+      $(document).trigger('drupalViewportOffsetChange', offsets);
+    }
+    return offsets;
+  }
+
+  function calculateOffsets() {
+    return {
+      top: calculateOffset('top'),
+      right: calculateOffset('right'),
+      bottom: calculateOffset('bottom'),
+      left: calculateOffset('left')
+    };
+  }
+
+  function calculateOffset(edge) {
+    var edgeOffset = 0;
+    var displacingElements = document.querySelectorAll('[data-offset-' + edge + ']');
+    var n = displacingElements.length;
+    for (var i = 0; i < n; i++) {
+      var el = displacingElements[i];
+
+      if (el.style.display === 'none') {
+        continue;
+      }
+
+      var displacement = parseInt(el.getAttribute('data-offset-' + edge), 10);
+
+      if (isNaN(displacement)) {
+        displacement = getRawOffset(el, edge);
+      }
+
+      edgeOffset = Math.max(edgeOffset, displacement);
+    }
+
+    return edgeOffset;
+  }
+
+  function getRawOffset(el, edge) {
+    var $el = $(el);
+    var documentElement = document.documentElement;
+    var displacement = 0;
+    var horizontal = edge === 'left' || edge === 'right';
+
+    var placement = $el.offset()[horizontal ? 'left' : 'top'];
+
+    placement -= window['scroll' + (horizontal ? 'X' : 'Y')] || document.documentElement['scroll' + (horizontal ? 'Left' : 'Top')] || 0;
+
+    switch (edge) {
+      case 'top':
+        displacement = placement + $el.outerHeight();
+        break;
+
+      case 'left':
+        displacement = placement + $el.outerWidth();
+        break;
+
+      case 'bottom':
+        displacement = documentElement.clientHeight - placement;
+        break;
+
+      case 'right':
+        displacement = documentElement.clientWidth - placement;
+        break;
+
+      default:
+        displacement = 0;
+    }
+    return displacement;
+  }
+
+  Drupal.displace = displace;
+  $.extend(Drupal.displace, {
+    offsets: offsets,
+
+    calculateOffset: calculateOffset
+  });
+})(jQuery, Drupal, Drupal.debounce);
\ No newline at end of file