2013-03-29 15:23:50 +00:00
|
|
|
/**
|
2017-05-19 22:12:53 +00:00
|
|
|
* DO NOT EDIT THIS FILE.
|
|
|
|
* See the following change record for more information,
|
2017-05-23 14:30:14 +00:00
|
|
|
* https://www.drupal.org/node/2815083
|
2017-05-19 22:12:53 +00:00
|
|
|
* @preserve
|
|
|
|
**/
|
2015-06-08 14:04:39 +00:00
|
|
|
|
2013-03-29 15:23:50 +00:00
|
|
|
(function ($, Drupal, debounce) {
|
2022-04-22 11:58:37 +00:00
|
|
|
const cache = {
|
2013-03-29 15:23:50 +00:00
|
|
|
right: 0,
|
2022-04-22 11:58:37 +00:00
|
|
|
left: 0,
|
2013-03-29 15:23:50 +00:00
|
|
|
bottom: 0,
|
2022-04-22 11:58:37 +00:00
|
|
|
top: 0
|
2013-03-29 15:23:50 +00:00
|
|
|
};
|
2022-04-22 11:58:37 +00:00
|
|
|
const cssVarPrefix = '--drupal-displace-offset';
|
|
|
|
const documentStyle = document.documentElement.style;
|
|
|
|
const offsetKeys = Object.keys(cache);
|
|
|
|
const offsetProps = {};
|
|
|
|
offsetKeys.forEach(edge => {
|
|
|
|
offsetProps[edge] = {
|
|
|
|
enumerable: true,
|
|
|
|
|
|
|
|
get() {
|
|
|
|
return cache[edge];
|
|
|
|
},
|
|
|
|
|
|
|
|
set(value) {
|
|
|
|
if (value !== cache[edge]) {
|
|
|
|
documentStyle.setProperty(`${cssVarPrefix}-${edge}`, `${value}px`);
|
|
|
|
}
|
|
|
|
|
|
|
|
cache[edge] = value;
|
|
|
|
}
|
|
|
|
|
|
|
|
};
|
|
|
|
});
|
|
|
|
const offsets = Object.seal(Object.defineProperties({}, offsetProps));
|
2013-03-29 15:23:50 +00:00
|
|
|
|
2014-01-27 21:41:32 +00:00
|
|
|
function getRawOffset(el, edge) {
|
2021-12-18 06:12:16 +00:00
|
|
|
const $el = $(el);
|
|
|
|
const documentElement = document.documentElement;
|
|
|
|
let displacement = 0;
|
|
|
|
const horizontal = edge === 'left' || edge === 'right';
|
|
|
|
let placement = $el.offset()[horizontal ? 'left' : 'top'];
|
|
|
|
placement -= window[`scroll${horizontal ? 'X' : 'Y'}`] || document.documentElement[`scroll${horizontal ? 'Left' : 'Top'}`] || 0;
|
2017-05-19 22:12:53 +00:00
|
|
|
|
2013-03-29 15:23:50 +00:00
|
|
|
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;
|
|
|
|
}
|
2020-01-30 09:08:38 +00:00
|
|
|
|
2013-03-29 15:23:50 +00:00
|
|
|
return displacement;
|
|
|
|
}
|
|
|
|
|
2018-03-05 09:14:08 +00:00
|
|
|
function calculateOffset(edge) {
|
2021-12-18 06:12:16 +00:00
|
|
|
let edgeOffset = 0;
|
|
|
|
const displacingElements = document.querySelectorAll(`[data-offset-${edge}]`);
|
|
|
|
const n = displacingElements.length;
|
2020-01-30 09:08:38 +00:00
|
|
|
|
2021-12-18 06:12:16 +00:00
|
|
|
for (let i = 0; i < n; i++) {
|
|
|
|
const el = displacingElements[i];
|
2018-03-05 09:14:08 +00:00
|
|
|
|
|
|
|
if (el.style.display === 'none') {
|
|
|
|
continue;
|
|
|
|
}
|
|
|
|
|
2021-12-18 06:12:16 +00:00
|
|
|
let displacement = parseInt(el.getAttribute(`data-offset-${edge}`), 10);
|
2018-03-05 09:14:08 +00:00
|
|
|
|
|
|
|
if (isNaN(displacement)) {
|
|
|
|
displacement = getRawOffset(el, edge);
|
|
|
|
}
|
|
|
|
|
|
|
|
edgeOffset = Math.max(edgeOffset, displacement);
|
|
|
|
}
|
|
|
|
|
|
|
|
return edgeOffset;
|
|
|
|
}
|
|
|
|
|
2022-04-22 11:58:37 +00:00
|
|
|
function displace() {
|
|
|
|
let broadcast = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : true;
|
|
|
|
const newOffsets = {};
|
|
|
|
offsetKeys.forEach(edge => {
|
|
|
|
newOffsets[edge] = calculateOffset(edge);
|
|
|
|
});
|
|
|
|
offsetKeys.forEach(edge => {
|
|
|
|
offsets[edge] = newOffsets[edge];
|
|
|
|
});
|
|
|
|
|
|
|
|
if (broadcast) {
|
2018-03-05 09:14:08 +00:00
|
|
|
$(document).trigger('drupalViewportOffsetChange', offsets);
|
|
|
|
}
|
2020-01-30 09:08:38 +00:00
|
|
|
|
2018-03-05 09:14:08 +00:00
|
|
|
return offsets;
|
|
|
|
}
|
|
|
|
|
|
|
|
Drupal.behaviors.drupalDisplace = {
|
2021-12-18 06:12:16 +00:00
|
|
|
attach() {
|
2018-03-05 09:14:08 +00:00
|
|
|
if (this.displaceProcessed) {
|
|
|
|
return;
|
|
|
|
}
|
2020-01-28 13:12:54 +00:00
|
|
|
|
2020-01-30 09:08:38 +00:00
|
|
|
this.displaceProcessed = true;
|
2018-03-05 09:14:08 +00:00
|
|
|
$(window).on('resize.drupalDisplace', debounce(displace, 200));
|
|
|
|
}
|
2021-12-18 06:12:16 +00:00
|
|
|
|
2018-03-05 09:14:08 +00:00
|
|
|
};
|
2013-03-29 15:23:50 +00:00
|
|
|
Drupal.displace = displace;
|
2022-04-22 11:58:37 +00:00
|
|
|
Object.defineProperty(Drupal.displace, 'offsets', {
|
|
|
|
value: offsets,
|
|
|
|
writable: false
|
2013-03-29 15:23:50 +00:00
|
|
|
});
|
2022-04-22 11:58:37 +00:00
|
|
|
Drupal.displace.calculateOffset = calculateOffset;
|
2017-05-19 22:12:53 +00:00
|
|
|
})(jQuery, Drupal, Drupal.debounce);
|