PluginProbe
UpdraftPlus: WP Backup & Migration Plugin / 1.16.5
UpdraftPlus: WP Backup & Migration Plugin v1.16.5
1.26.7 1.26.6 1.26.5 1.26.4 1.26.3 1.9.19 1.9.25 1.9.26 1.9.30 1.9.31 1.9.32 1.9.4 1.9.40 1.9.41 1.9.42 1.9.43 1.9.44 1.9.45 1.9.46 1.9.5 1.9.50 1.9.51 1.9.60 1.9.62 1.9.63 All 371 releases
updraftplus / includes / tether / tether.js

tether.js in UpdraftPlus: WP Backup & Migration Plugin 1.16.5, at includes/tether/tether.js

1,814 lines 55.1 KB
No matching file
Up and down to move Enter to open Esc to close
Raw Download Zip
1 /*! tether 1.4.4 */
2
3 (function(root, factory) {
4 if (typeof define === 'function' && define.amd) {
5 define([], factory);
6 } else if (typeof exports === 'object') {
7 module.exports = factory();
8 } else {
9 root.Tether = factory();
10 }
11 }(this, function() {
12
13 'use strict';
14
15 var _createClass = (function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ('value' in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; })();
16
17 function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError('Cannot call a class as a function'); } }
18
19 var TetherBase = undefined;
20 if (typeof TetherBase === 'undefined') {
21 TetherBase = { modules: [] };
22 }
23
24 var zeroElement = null;
25
26 // Same as native getBoundingClientRect, except it takes into account parent <frame> offsets
27 // if the element lies within a nested document (<frame> or <iframe>-like).
28 function getActualBoundingClientRect(node) {
29 var boundingRect = node.getBoundingClientRect();
30
31 // The original object returned by getBoundingClientRect is immutable, so we clone it
32 // We can't use extend because the properties are not considered part of the object by hasOwnProperty in IE9
33 var rect = {};
34 for (var k in boundingRect) {
35 rect[k] = boundingRect[k];
36 }
37
38 if (node.ownerDocument !== document) {
39 var _frameElement = node.ownerDocument.defaultView.frameElement;
40 if (_frameElement) {
41 var frameRect = getActualBoundingClientRect(_frameElement);
42 rect.top += frameRect.top;
43 rect.bottom += frameRect.top;
44 rect.left += frameRect.left;
45 rect.right += frameRect.left;
46 }
47 }
48
49 return rect;
50 }
51
52 function getScrollParents(el) {
53 // In firefox if the el is inside an iframe with display: none; window.getComputedStyle() will return null;
54 // https://bugzilla.mozilla.org/show_bug.cgi?id=548397
55 var computedStyle = getComputedStyle(el) || {};
56 var position = computedStyle.position;
57 var parents = [];
58
59 if (position === 'fixed') {
60 return [el];
61 }
62
63 var parent = el;
64 while ((parent = parent.parentNode) && parent && parent.nodeType === 1) {
65 var style = undefined;
66 try {
67 style = getComputedStyle(parent);
68 } catch (err) {}
69
70 if (typeof style === 'undefined' || style === null) {
71 parents.push(parent);
72 return parents;
73 }
74
75 var _style = style;
76 var overflow = _style.overflow;
77 var overflowX = _style.overflowX;
78 var overflowY = _style.overflowY;
79
80 if (/(auto|scroll|overlay)/.test(overflow + overflowY + overflowX)) {
81 if (position !== 'absolute' || ['relative', 'absolute', 'fixed'].indexOf(style.position) >= 0) {
82 parents.push(parent);
83 }
84 }
85 }
86
87 parents.push(el.ownerDocument.body);
88
89 // If the node is within a frame, account for the parent window scroll
90 if (el.ownerDocument !== document) {
91 parents.push(el.ownerDocument.defaultView);
92 }
93
94 return parents;
95 }
96
97 var uniqueId = (function () {
98 var id = 0;
99 return function () {
100 return ++id;
101 };
102 })();
103
104 var zeroPosCache = {};
105 var getOrigin = function getOrigin() {
106 // getBoundingClientRect is unfortunately too accurate. It introduces a pixel or two of
107 // jitter as the user scrolls that messes with our ability to detect if two positions
108 // are equivilant or not. We place an element at the top left of the page that will
109 // get the same jitter, so we can cancel the two out.
110 var node = zeroElement;
111 if (!node || !document.body.contains(node)) {
112 node = document.createElement('div');
113 node.setAttribute('data-tether-id', uniqueId());
114 extend(node.style, {
115 top: 0,
116 left: 0,
117 position: 'absolute'
118 });
119
120 document.body.appendChild(node);
121
122 zeroElement = node;
123 }
124
125 var id = node.getAttribute('data-tether-id');
126 if (typeof zeroPosCache[id] === 'undefined') {
127 zeroPosCache[id] = getActualBoundingClientRect(node);
128
129 // Clear the cache when this position call is done
130 defer(function () {
131 delete zeroPosCache[id];
132 });
133 }
134
135 return zeroPosCache[id];
136 };
137
138 function removeUtilElements() {
139 if (zeroElement) {
140 document.body.removeChild(zeroElement);
141 }
142 zeroElement = null;
143 };
144
145 function getBounds(el) {
146 var doc = undefined;
147 if (el === document) {
148 doc = document;
149 el = document.documentElement;
150 } else {
151 doc = el.ownerDocument;
152 }
153
154 var docEl = doc.documentElement;
155
156 var box = getActualBoundingClientRect(el);
157
158 var origin = getOrigin();
159
160 box.top -= origin.top;
161 box.left -= origin.left;
162
163 if (typeof box.width === 'undefined') {
164 box.width = document.body.scrollWidth - box.left - box.right;
165 }
166 if (typeof box.height === 'undefined') {
167 box.height = document.body.scrollHeight - box.top - box.bottom;
168 }
169
170 box.top = box.top - docEl.clientTop;
171 box.left = box.left - docEl.clientLeft;
172 box.right = doc.body.clientWidth - box.width - box.left;
173 box.bottom = doc.body.clientHeight - box.height - box.top;
174
175 return box;
176 }
177
178 function getOffsetParent(el) {
179 return el.offsetParent || document.documentElement;
180 }
181
182 var _scrollBarSize = null;
183 function getScrollBarSize() {
184 if (_scrollBarSize) {
185 return _scrollBarSize;
186 }
187 var inner = document.createElement('div');
188 inner.style.width = '100%';
189 inner.style.height = '200px';
190
191 var outer = document.createElement('div');
192 extend(outer.style, {
193 position: 'absolute',
194 top: 0,
195 left: 0,
196 pointerEvents: 'none',
197 visibility: 'hidden',
198 width: '200px',
199 height: '150px',
200 overflow: 'hidden'
201 });
202
203 outer.appendChild(inner);
204
205 document.body.appendChild(outer);
206
207 var widthContained = inner.offsetWidth;
208 outer.style.overflow = 'scroll';
209 var widthScroll = inner.offsetWidth;
210
211 if (widthContained === widthScroll) {
212 widthScroll = outer.clientWidth;
213 }
214
215 document.body.removeChild(outer);
216
217 var width = widthContained - widthScroll;
218
219 _scrollBarSize = { width: width, height: width };
220 return _scrollBarSize;
221 }
222
223 function extend() {
224 var out = arguments.length <= 0 || arguments[0] === undefined ? {} : arguments[0];
225
226 var args = [];
227
228 Array.prototype.push.apply(args, arguments);
229
230 args.slice(1).forEach(function (obj) {
231 if (obj) {
232 for (var key in obj) {
233 if (({}).hasOwnProperty.call(obj, key)) {
234 out[key] = obj[key];
235 }
236 }
237 }
238 });
239
240 return out;
241 }
242
243 function removeClass(el, name) {
244 if (typeof el.classList !== 'undefined') {
245 name.split(' ').forEach(function (cls) {
246 if (cls.trim()) {
247 el.classList.remove(cls);
248 }
249 });
250 } else {
251 var regex = new RegExp('(^| )' + name.split(' ').join('|') + '( |$)', 'gi');
252 var className = getClassName(el).replace(regex, ' ');
253 setClassName(el, className);
254 }
255 }
256
257 function addClass(el, name) {
258 if (typeof el.classList !== 'undefined') {
259 name.split(' ').forEach(function (cls) {
260 if (cls.trim()) {
261 el.classList.add(cls);
262 }
263 });
264 } else {
265 removeClass(el, name);
266 var cls = getClassName(el) + (' ' + name);
267 setClassName(el, cls);
268 }
269 }
270
271 function hasClass(el, name) {
272 if (typeof el.classList !== 'undefined') {
273 return el.classList.contains(name);
274 }
275 var className = getClassName(el);
276 return new RegExp('(^| )' + name + '( |$)', 'gi').test(className);
277 }
278
279 function getClassName(el) {
280 // Can't use just SVGAnimatedString here since nodes within a Frame in IE have
281 // completely separately SVGAnimatedString base classes
282 if (el.className instanceof el.ownerDocument.defaultView.SVGAnimatedString) {
283 return el.className.baseVal;
284 }
285 return el.className;
286 }
287
288 function setClassName(el, className) {
289 el.setAttribute('class', className);
290 }
291
292 function updateClasses(el, add, all) {
293 // Of the set of 'all' classes, we need the 'add' classes, and only the
294 // 'add' classes to be set.
295 all.forEach(function (cls) {
296 if (add.indexOf(cls) === -1 && hasClass(el, cls)) {
297 removeClass(el, cls);
298 }
299 });
300
301 add.forEach(function (cls) {
302 if (!hasClass(el, cls)) {
303 addClass(el, cls);
304 }
305 });
306 }
307
308 var deferred = [];
309
310 var defer = function defer(fn) {
311 deferred.push(fn);
312 };
313
314 var flush = function flush() {
315 var fn = undefined;
316 while (fn = deferred.pop()) {
317 fn();
318 }
319 };
320
321 var Evented = (function () {
322 function Evented() {
323 _classCallCheck(this, Evented);
324 }
325
326 _createClass(Evented, [{
327 key: 'on',
328 value: function on(event, handler, ctx) {
329 var once = arguments.length <= 3 || arguments[3] === undefined ? false : arguments[3];
330
331 if (typeof this.bindings === 'undefined') {
332 this.bindings = {};
333 }
334 if (typeof this.bindings[event] === 'undefined') {
335 this.bindings[event] = [];
336 }
337 this.bindings[event].push({ handler: handler, ctx: ctx, once: once });
338 }
339 }, {
340 key: 'once',
341 value: function once(event, handler, ctx) {
342 this.on(event, handler, ctx, true);
343 }
344 }, {
345 key: 'off',
346 value: function off(event, handler) {
347 if (typeof this.bindings === 'undefined' || typeof this.bindings[event] === 'undefined') {
348 return;
349 }
350
351 if (typeof handler === 'undefined') {
352 delete this.bindings[event];
353 } else {
354 var i = 0;
355 while (i < this.bindings[event].length) {
356 if (this.bindings[event][i].handler === handler) {
357 this.bindings[event].splice(i, 1);
358 } else {
359 ++i;
360 }
361 }
362 }
363 }
364 }, {
365 key: 'trigger',
366 value: function trigger(event) {
367 if (typeof this.bindings !== 'undefined' && this.bindings[event]) {
368 var i = 0;
369
370 for (var _len = arguments.length, args = Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) {
371 args[_key - 1] = arguments[_key];
372 }
373
374 while (i < this.bindings[event].length) {
375 var _bindings$event$i = this.bindings[event][i];
376 var handler = _bindings$event$i.handler;
377 var ctx = _bindings$event$i.ctx;
378 var once = _bindings$event$i.once;
379
380 var context = ctx;
381 if (typeof context === 'undefined') {
382 context = this;
383 }
384
385 handler.apply(context, args);
386
387 if (once) {
388 this.bindings[event].splice(i, 1);
389 } else {
390 ++i;
391 }
392 }
393 }
394 }
395 }]);
396
397 return Evented;
398 })();
399
400 TetherBase.Utils = {
401 getActualBoundingClientRect: getActualBoundingClientRect,
402 getScrollParents: getScrollParents,
403 getBounds: getBounds,
404 getOffsetParent: getOffsetParent,
405 extend: extend,
406 addClass: addClass,
407 removeClass: removeClass,
408 hasClass: hasClass,
409 updateClasses: updateClasses,
410 defer: defer,
411 flush: flush,
412 uniqueId: uniqueId,
413 Evented: Evented,
414 getScrollBarSize: getScrollBarSize,
415 removeUtilElements: removeUtilElements
416 };
417 /* globals TetherBase, performance */
418
419 'use strict';
420
421 var _slicedToArray = (function () { function sliceIterator(arr, i) { var _arr = []; var _n = true; var _d = false; var _e = undefined; try { for (var _i = arr[Symbol.iterator](), _s; !(_n = (_s = _i.next()).done); _n = true) { _arr.push(_s.value); if (i && _arr.length === i) break; } } catch (err) { _d = true; _e = err; } finally { try { if (!_n && _i['return']) _i['return'](); } finally { if (_d) throw _e; } } return _arr; } return function (arr, i) { if (Array.isArray(arr)) { return arr; } else if (Symbol.iterator in Object(arr)) { return sliceIterator(arr, i); } else { throw new TypeError('Invalid attempt to destructure non-iterable instance'); } }; })();
422
423 var _createClass = (function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ('value' in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; })();
424
425 var _get = function get(_x6, _x7, _x8) { var _again = true; _function: while (_again) { var object = _x6, property = _x7, receiver = _x8; _again = false; if (object === null) object = Function.prototype; var desc = Object.getOwnPropertyDescriptor(object, property); if (desc === undefined) { var parent = Object.getPrototypeOf(object); if (parent === null) { return undefined; } else { _x6 = parent; _x7 = property; _x8 = receiver; _again = true; desc = parent = undefined; continue _function; } } else if ('value' in desc) { return desc.value; } else { var getter = desc.get; if (getter === undefined) { return undefined; } return getter.call(receiver); } } };
426
427 function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError('Cannot call a class as a function'); } }
428
429 function _inherits(subClass, superClass) { if (typeof superClass !== 'function' && superClass !== null) { throw new TypeError('Super expression must either be null or a function, not ' + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }
430
431 if (typeof TetherBase === 'undefined') {
432 throw new Error('You must include the utils.js file before tether.js');
433 }
434
435 var _TetherBase$Utils = TetherBase.Utils;
436 var getScrollParents = _TetherBase$Utils.getScrollParents;
437 var getBounds = _TetherBase$Utils.getBounds;
438 var getOffsetParent = _TetherBase$Utils.getOffsetParent;
439 var extend = _TetherBase$Utils.extend;
440 var addClass = _TetherBase$Utils.addClass;
441 var removeClass = _TetherBase$Utils.removeClass;
442 var updateClasses = _TetherBase$Utils.updateClasses;
443 var defer = _TetherBase$Utils.defer;
444 var flush = _TetherBase$Utils.flush;
445 var getScrollBarSize = _TetherBase$Utils.getScrollBarSize;
446 var removeUtilElements = _TetherBase$Utils.removeUtilElements;
447
448 function within(a, b) {
449 var diff = arguments.length <= 2 || arguments[2] === undefined ? 1 : arguments[2];
450
451 return a + diff >= b && b >= a - diff;
452 }
453
454 var transformKey = (function () {
455 if (typeof document === 'undefined') {
456 return '';
457 }
458 var el = document.createElement('div');
459
460 var transforms = ['transform', 'WebkitTransform', 'OTransform', 'MozTransform', 'msTransform'];
461 for (var i = 0; i < transforms.length; ++i) {
462 var key = transforms[i];
463 if (el.style[key] !== undefined) {
464 return key;
465 }
466 }
467 })();
468
469 var tethers = [];
470
471 var position = function position() {
472 tethers.forEach(function (tether) {
473 tether.position(false);
474 });
475 flush();
476 };
477
478 function now() {
479 if (typeof performance === 'object' && typeof performance.now === 'function') {
480 return performance.now();
481 }
482 return +new Date();
483 }
484
485 (function () {
486 var lastCall = null;
487 var lastDuration = null;
488 var pendingTimeout = null;
489
490 var tick = function tick() {
491 if (typeof lastDuration !== 'undefined' && lastDuration > 16) {
492 // We voluntarily throttle ourselves if we can't manage 60fps
493 lastDuration = Math.min(lastDuration - 16, 250);
494
495 // Just in case this is the last event, remember to position just once more
496 pendingTimeout = setTimeout(tick, 250);
497 return;
498 }
499
500 if (typeof lastCall !== 'undefined' && now() - lastCall < 10) {
501 // Some browsers call events a little too frequently, refuse to run more than is reasonable
502 return;
503 }
504
505 if (pendingTimeout != null) {
506 clearTimeout(pendingTimeout);
507 pendingTimeout = null;
508 }
509
510 lastCall = now();
511 position();
512 lastDuration = now() - lastCall;
513 };
514
515 if (typeof window !== 'undefined' && typeof window.addEventListener !== 'undefined') {
516 ['resize', 'scroll', 'touchmove'].forEach(function (event) {
517 window.addEventListener(event, tick);
518 });
519 }
520 })();
521
522 var MIRROR_LR = {
523 center: 'center',
524 left: 'right',
525 right: 'left'
526 };
527
528 var MIRROR_TB = {
529 middle: 'middle',
530 top: 'bottom',
531 bottom: 'top'
532 };
533
534 var OFFSET_MAP = {
535 top: 0,
536 left: 0,
537 middle: '50%',
538 center: '50%',
539 bottom: '100%',
540 right: '100%'
541 };
542
543 var autoToFixedAttachment = function autoToFixedAttachment(attachment, relativeToAttachment) {
544 var left = attachment.left;
545 var top = attachment.top;
546
547 if (left === 'auto') {
548 left = MIRROR_LR[relativeToAttachment.left];
549 }
550
551 if (top === 'auto') {
552 top = MIRROR_TB[relativeToAttachment.top];
553 }
554
555 return { left: left, top: top };
556 };
557
558 var attachmentToOffset = function attachmentToOffset(attachment) {
559 var left = attachment.left;
560 var top = attachment.top;
561
562 if (typeof OFFSET_MAP[attachment.left] !== 'undefined') {
563 left = OFFSET_MAP[attachment.left];
564 }
565
566 if (typeof OFFSET_MAP[attachment.top] !== 'undefined') {
567 top = OFFSET_MAP[attachment.top];
568 }
569
570 return { left: left, top: top };
571 };
572
573 function addOffset() {
574 var out = { top: 0, left: 0 };
575
576 for (var _len = arguments.length, offsets = Array(_len), _key = 0; _key < _len; _key++) {
577 offsets[_key] = arguments[_key];
578 }
579
580 offsets.forEach(function (_ref) {
581 var top = _ref.top;
582 var left = _ref.left;
583
584 if (typeof top === 'string') {
585 top = parseFloat(top, 10);
586 }
587 if (typeof left === 'string') {
588 left = parseFloat(left, 10);
589 }
590
591 out.top += top;
592 out.left += left;
593 });
594
595 return out;
596 }
597
598 function offsetToPx(offset, size) {
599 if (typeof offset.left === 'string' && offset.left.indexOf('%') !== -1) {
600 offset.left = parseFloat(offset.left, 10) / 100 * size.width;
601 }
602 if (typeof offset.top === 'string' && offset.top.indexOf('%') !== -1) {
603 offset.top = parseFloat(offset.top, 10) / 100 * size.height;
604 }
605
606 return offset;
607 }
608
609 var parseOffset = function parseOffset(value) {
610 var _value$split = value.split(' ');
611
612 var _value$split2 = _slicedToArray(_value$split, 2);
613
614 var top = _value$split2[0];
615 var left = _value$split2[1];
616
617 return { top: top, left: left };
618 };
619 var parseAttachment = parseOffset;
620
621 var TetherClass = (function (_Evented) {
622 _inherits(TetherClass, _Evented);
623
624 function TetherClass(options) {
625 var _this = this;
626
627 _classCallCheck(this, TetherClass);
628
629 _get(Object.getPrototypeOf(TetherClass.prototype), 'constructor', this).call(this);
630 this.position = this.position.bind(this);
631
632 tethers.push(this);
633
634 this.history = [];
635
636 this.setOptions(options, false);
637
638 TetherBase.modules.forEach(function (module) {
639 if (typeof module.initialize !== 'undefined') {
640 module.initialize.call(_this);
641 }
642 });
643
644 this.position();
645 }
646
647 _createClass(TetherClass, [{
648 key: 'getClass',
649 value: function getClass() {
650 var key = arguments.length <= 0 || arguments[0] === undefined ? '' : arguments[0];
651 var classes = this.options.classes;
652
653 if (typeof classes !== 'undefined' && classes[key]) {
654 return this.options.classes[key];
655 } else if (this.options.classPrefix) {
656 return this.options.classPrefix + '-' + key;
657 } else {
658 return key;
659 }
660 }
661 }, {
662 key: 'setOptions',
663 value: function setOptions(options) {
664 var _this2 = this;
665
666 var pos = arguments.length <= 1 || arguments[1] === undefined ? true : arguments[1];
667
668 var defaults = {
669 offset: '0 0',
670 targetOffset: '0 0',
671 targetAttachment: 'auto auto',
672 classPrefix: 'tether'
673 };
674
675 this.options = extend(defaults, options);
676
677 var _options = this.options;
678 var element = _options.element;
679 var target = _options.target;
680 var targetModifier = _options.targetModifier;
681
682 this.element = element;
683 this.target = target;
684 this.targetModifier = targetModifier;
685
686 if (this.target === 'viewport') {
687 this.target = document.body;
688 this.targetModifier = 'visible';
689 } else if (this.target === 'scroll-handle') {
690 this.target = document.body;
691 this.targetModifier = 'scroll-handle';
692 }
693
694 ['element', 'target'].forEach(function (key) {
695 if (typeof _this2[key] === 'undefined') {
696 throw new Error('Tether Error: Both element and target must be defined');
697 }
698
699 if (typeof _this2[key].jquery !== 'undefined') {
700 _this2[key] = _this2[key][0];
701 } else if (typeof _this2[key] === 'string') {
702 _this2[key] = document.querySelector(_this2[key]);
703 }
704 });
705
706 addClass(this.element, this.getClass('element'));
707 if (!(this.options.addTargetClasses === false)) {
708 addClass(this.target, this.getClass('target'));
709 }
710
711 if (!this.options.attachment) {
712 throw new Error('Tether Error: You must provide an attachment');
713 }
714
715 this.targetAttachment = parseAttachment(this.options.targetAttachment);
716 this.attachment = parseAttachment(this.options.attachment);
717 this.offset = parseOffset(this.options.offset);
718 this.targetOffset = parseOffset(this.options.targetOffset);
719
720 if (typeof this.scrollParents !== 'undefined') {
721 this.disable();
722 }
723
724 if (this.targetModifier === 'scroll-handle') {
725 this.scrollParents = [this.target];
726 } else {
727 this.scrollParents = getScrollParents(this.target);
728 }
729
730 if (!(this.options.enabled === false)) {
731 this.enable(pos);
732 }
733 }
734 }, {
735 key: 'getTargetBounds',
736 value: function getTargetBounds() {
737 if (typeof this.targetModifier !== 'undefined') {
738 if (this.targetModifier === 'visible') {
739 if (this.target === document.body) {
740 return { top: pageYOffset, left: pageXOffset, height: innerHeight, width: innerWidth };
741 } else {
742 var bounds = getBounds(this.target);
743
744 var out = {
745 height: bounds.height,
746 width: bounds.width,
747 top: bounds.top,
748 left: bounds.left
749 };
750
751 out.height = Math.min(out.height, bounds.height - (pageYOffset - bounds.top));
752 out.height = Math.min(out.height, bounds.height - (bounds.top + bounds.height - (pageYOffset + innerHeight)));
753 out.height = Math.min(innerHeight, out.height);
754 out.height -= 2;
755
756 out.width = Math.min(out.width, bounds.width - (pageXOffset - bounds.left));
757 out.width = Math.min(out.width, bounds.width - (bounds.left + bounds.width - (pageXOffset + innerWidth)));
758 out.width = Math.min(innerWidth, out.width);
759 out.width -= 2;
760
761 if (out.top < pageYOffset) {
762 out.top = pageYOffset;
763 }
764 if (out.left < pageXOffset) {
765 out.left = pageXOffset;
766 }
767
768 return out;
769 }
770 } else if (this.targetModifier === 'scroll-handle') {
771 var bounds = undefined;
772 var target = this.target;
773 if (target === document.body) {
774 target = document.documentElement;
775
776 bounds = {
777 left: pageXOffset,
778 top: pageYOffset,
779 height: innerHeight,
780 width: innerWidth
781 };
782 } else {
783 bounds = getBounds(target);
784 }
785
786 var style = getComputedStyle(target);
787
788 var hasBottomScroll = target.scrollWidth > target.clientWidth || [style.overflow, style.overflowX].indexOf('scroll') >= 0 || this.target !== document.body;
789
790 var scrollBottom = 0;
791 if (hasBottomScroll) {
792 scrollBottom = 15;
793 }
794
795 var height = bounds.height - parseFloat(style.borderTopWidth) - parseFloat(style.borderBottomWidth) - scrollBottom;
796
797 var out = {
798 width: 15,
799 height: height * 0.975 * (height / target.scrollHeight),
800 left: bounds.left + bounds.width - parseFloat(style.borderLeftWidth) - 15
801 };
802
803 var fitAdj = 0;
804 if (height < 408 && this.target === document.body) {
805 fitAdj = -0.00011 * Math.pow(height, 2) - 0.00727 * height + 22.58;
806 }
807
808 if (this.target !== document.body) {
809 out.height = Math.max(out.height, 24);
810 }
811
812 var scrollPercentage = this.target.scrollTop / (target.scrollHeight - height);
813 out.top = scrollPercentage * (height - out.height - fitAdj) + bounds.top + parseFloat(style.borderTopWidth);
814
815 if (this.target === document.body) {
816 out.height = Math.max(out.height, 24);
817 }
818
819 return out;
820 }
821 } else {
822 return getBounds(this.target);
823 }
824 }
825 }, {
826 key: 'clearCache',
827 value: function clearCache() {
828 this._cache = {};
829 }
830 }, {
831 key: 'cache',
832 value: function cache(k, getter) {
833 // More than one module will often need the same DOM info, so
834 // we keep a cache which is cleared on each position call
835 if (typeof this._cache === 'undefined') {
836 this._cache = {};
837 }
838
839 if (typeof this._cache[k] === 'undefined') {
840 this._cache[k] = getter.call(this);
841 }
842
843 return this._cache[k];
844 }
845 }, {
846 key: 'enable',
847 value: function enable() {
848 var _this3 = this;
849
850 var pos = arguments.length <= 0 || arguments[0] === undefined ? true : arguments[0];
851
852 if (!(this.options.addTargetClasses === false)) {
853 addClass(this.target, this.getClass('enabled'));
854 }
855 addClass(this.element, this.getClass('enabled'));
856 this.enabled = true;
857
858 this.scrollParents.forEach(function (parent) {
859 if (parent !== _this3.target.ownerDocument) {
860 parent.addEventListener('scroll', _this3.position);
861 }
862 });
863
864 if (pos) {
865 this.position();
866 }
867 }
868 }, {
869 key: 'disable',
870 value: function disable() {
871 var _this4 = this;
872
873 removeClass(this.target, this.getClass('enabled'));
874 removeClass(this.element, this.getClass('enabled'));
875 this.enabled = false;
876
877 if (typeof this.scrollParents !== 'undefined') {
878 this.scrollParents.forEach(function (parent) {
879 parent.removeEventListener('scroll', _this4.position);
880 });
881 }
882 }
883 }, {
884 key: 'destroy',
885 value: function destroy() {
886 var _this5 = this;
887
888 this.disable();
889
890 tethers.forEach(function (tether, i) {
891 if (tether === _this5) {
892 tethers.splice(i, 1);
893 }
894 });
895
896 // Remove any elements we were using for convenience from the DOM
897 if (tethers.length === 0) {
898 removeUtilElements();
899 }
900 }
901 }, {
902 key: 'updateAttachClasses',
903 value: function updateAttachClasses(elementAttach, targetAttach) {
904 var _this6 = this;
905
906 elementAttach = elementAttach || this.attachment;
907 targetAttach = targetAttach || this.targetAttachment;
908 var sides = ['left', 'top', 'bottom', 'right', 'middle', 'center'];
909
910 if (typeof this._addAttachClasses !== 'undefined' && this._addAttachClasses.length) {
911 // updateAttachClasses can be called more than once in a position call, so
912 // we need to clean up after ourselves such that when the last defer gets
913 // ran it doesn't add any extra classes from previous calls.
914 this._addAttachClasses.splice(0, this._addAttachClasses.length);
915 }
916
917 if (typeof this._addAttachClasses === 'undefined') {
918 this._addAttachClasses = [];
919 }
920 var add = this._addAttachClasses;
921
922 if (elementAttach.top) {
923 add.push(this.getClass('element-attached') + '-' + elementAttach.top);
924 }
925 if (elementAttach.left) {
926 add.push(this.getClass('element-attached') + '-' + elementAttach.left);
927 }
928 if (targetAttach.top) {
929 add.push(this.getClass('target-attached') + '-' + targetAttach.top);
930 }
931 if (targetAttach.left) {
932 add.push(this.getClass('target-attached') + '-' + targetAttach.left);
933 }
934
935 var all = [];
936 sides.forEach(function (side) {
937 all.push(_this6.getClass('element-attached') + '-' + side);
938 all.push(_this6.getClass('target-attached') + '-' + side);
939 });
940
941 defer(function () {
942 if (!(typeof _this6._addAttachClasses !== 'undefined')) {
943 return;
944 }
945
946 updateClasses(_this6.element, _this6._addAttachClasses, all);
947 if (!(_this6.options.addTargetClasses === false)) {
948 updateClasses(_this6.target, _this6._addAttachClasses, all);
949 }
950
951 delete _this6._addAttachClasses;
952 });
953 }
954 }, {
955 key: 'position',
956 value: function position() {
957 var _this7 = this;
958
959 var flushChanges = arguments.length <= 0 || arguments[0] === undefined ? true : arguments[0];
960
961 // flushChanges commits the changes immediately, leave true unless you are positioning multiple
962 // tethers (in which case call Tether.Utils.flush yourself when you're done)
963
964 if (!this.enabled) {
965 return;
966 }
967
968 this.clearCache();
969
970 // Turn 'auto' attachments into the appropriate corner or edge
971 var targetAttachment = autoToFixedAttachment(this.targetAttachment, this.attachment);
972
973 this.updateAttachClasses(this.attachment, targetAttachment);
974
975 var elementPos = this.cache('element-bounds', function () {
976 return getBounds(_this7.element);
977 });
978
979 var width = elementPos.width;
980 var height = elementPos.height;
981
982 if (width === 0 && height === 0 && typeof this.lastSize !== 'undefined') {
983 var _lastSize = this.lastSize;
984
985 // We cache the height and width to make it possible to position elements that are
986 // getting hidden.
987 width = _lastSize.width;
988 height = _lastSize.height;
989 } else {
990 this.lastSize = { width: width, height: height };
991 }
992
993 var targetPos = this.cache('target-bounds', function () {
994 return _this7.getTargetBounds();
995 });
996 var targetSize = targetPos;
997
998 // Get an actual px offset from the attachment
999 var offset = offsetToPx(attachmentToOffset(this.attachment), { width: width, height: height });
1000 var targetOffset = offsetToPx(attachmentToOffset(targetAttachment), targetSize);
1001
1002 var manualOffset = offsetToPx(this.offset, { width: width, height: height });
1003 var manualTargetOffset = offsetToPx(this.targetOffset, targetSize);
1004
1005 // Add the manually provided offset
1006 offset = addOffset(offset, manualOffset);
1007 targetOffset = addOffset(targetOffset, manualTargetOffset);
1008
1009 // It's now our goal to make (element position + offset) == (target position + target offset)
1010 var left = targetPos.left + targetOffset.left - offset.left;
1011 var top = targetPos.top + targetOffset.top - offset.top;
1012
1013 for (var i = 0; i < TetherBase.modules.length; ++i) {
1014 var _module2 = TetherBase.modules[i];
1015 var ret = _module2.position.call(this, {
1016 left: left,
1017 top: top,
1018 targetAttachment: targetAttachment,
1019 targetPos: targetPos,
1020 elementPos: elementPos,
1021 offset: offset,
1022 targetOffset: targetOffset,
1023 manualOffset: manualOffset,
1024 manualTargetOffset: manualTargetOffset,
1025 scrollbarSize: scrollbarSize,
1026 attachment: this.attachment
1027 });
1028
1029 if (ret === false) {
1030 return false;
1031 } else if (typeof ret === 'undefined' || typeof ret !== 'object') {
1032 continue;
1033 } else {
1034 top = ret.top;
1035 left = ret.left;
1036 }
1037 }
1038
1039 // We describe the position three different ways to give the optimizer
1040 // a chance to decide the best possible way to position the element
1041 // with the fewest repaints.
1042 var next = {
1043 // It's position relative to the page (absolute positioning when
1044 // the element is a child of the body)
1045 page: {
1046 top: top,
1047 left: left
1048 },
1049
1050 // It's position relative to the viewport (fixed positioning)
1051 viewport: {
1052 top: top - pageYOffset,
1053 bottom: pageYOffset - top - height + innerHeight,
1054 left: left - pageXOffset,
1055 right: pageXOffset - left - width + innerWidth
1056 }
1057 };
1058
1059 var doc = this.target.ownerDocument;
1060 var win = doc.defaultView;
1061
1062 var scrollbarSize = undefined;
1063 if (win.innerHeight > doc.documentElement.clientHeight) {
1064 scrollbarSize = this.cache('scrollbar-size', getScrollBarSize);
1065 next.viewport.bottom -= scrollbarSize.height;
1066 }
1067
1068 if (win.innerWidth > doc.documentElement.clientWidth) {
1069 scrollbarSize = this.cache('scrollbar-size', getScrollBarSize);
1070 next.viewport.right -= scrollbarSize.width;
1071 }
1072
1073 if (['', 'static'].indexOf(doc.body.style.position) === -1 || ['', 'static'].indexOf(doc.body.parentElement.style.position) === -1) {
1074 // Absolute positioning in the body will be relative to the page, not the 'initial containing block'
1075 next.page.bottom = doc.body.scrollHeight - top - height;
1076 next.page.right = doc.body.scrollWidth - left - width;
1077 }
1078
1079 if (typeof this.options.optimizations !== 'undefined' && this.options.optimizations.moveElement !== false && !(typeof this.targetModifier !== 'undefined')) {
1080 (function () {
1081 var offsetParent = _this7.cache('target-offsetparent', function () {
1082 return getOffsetParent(_this7.target);
1083 });
1084 var offsetPosition = _this7.cache('target-offsetparent-bounds', function () {
1085 return getBounds(offsetParent);
1086 });
1087 var offsetParentStyle = getComputedStyle(offsetParent);
1088 var offsetParentSize = offsetPosition;
1089
1090 var offsetBorder = {};
1091 ['Top', 'Left', 'Bottom', 'Right'].forEach(function (side) {
1092 offsetBorder[side.toLowerCase()] = parseFloat(offsetParentStyle['border' + side + 'Width']);
1093 });
1094
1095 offsetPosition.right = doc.body.scrollWidth - offsetPosition.left - offsetParentSize.width + offsetBorder.right;
1096 offsetPosition.bottom = doc.body.scrollHeight - offsetPosition.top - offsetParentSize.height + offsetBorder.bottom;
1097
1098 if (next.page.top >= offsetPosition.top + offsetBorder.top && next.page.bottom >= offsetPosition.bottom) {
1099 if (next.page.left >= offsetPosition.left + offsetBorder.left && next.page.right >= offsetPosition.right) {
1100 // We're within the visible part of the target's scroll parent
1101 var scrollTop = offsetParent.scrollTop;
1102 var scrollLeft = offsetParent.scrollLeft;
1103
1104 // It's position relative to the target's offset parent (absolute positioning when
1105 // the element is moved to be a child of the target's offset parent).
1106 next.offset = {
1107 top: next.page.top - offsetPosition.top + scrollTop - offsetBorder.top,
1108 left: next.page.left - offsetPosition.left + scrollLeft - offsetBorder.left
1109 };
1110 }
1111 }
1112 })();
1113 }
1114
1115 // We could also travel up the DOM and try each containing context, rather than only
1116 // looking at the body, but we're gonna get diminishing returns.
1117
1118 this.move(next);
1119
1120 this.history.unshift(next);
1121
1122 if (this.history.length > 3) {
1123 this.history.pop();
1124 }
1125
1126 if (flushChanges) {
1127 flush();
1128 }
1129
1130 return true;
1131 }
1132
1133 // THE ISSUE
1134 }, {
1135 key: 'move',
1136 value: function move(pos) {
1137 var _this8 = this;
1138
1139 if (!(typeof this.element.parentNode !== 'undefined')) {
1140 return;
1141 }
1142
1143 var same = {};
1144
1145 for (var type in pos) {
1146 same[type] = {};
1147
1148 for (var key in pos[type]) {
1149 var found = false;
1150
1151 for (var i = 0; i < this.history.length; ++i) {
1152 var point = this.history[i];
1153 if (typeof point[type] !== 'undefined' && !within(point[type][key], pos[type][key])) {
1154 found = true;
1155 break;
1156 }
1157 }
1158
1159 if (!found) {
1160 same[type][key] = true;
1161 }
1162 }
1163 }
1164
1165 var css = { top: '', left: '', right: '', bottom: '' };
1166
1167 var transcribe = function transcribe(_same, _pos) {
1168 var hasOptimizations = typeof _this8.options.optimizations !== 'undefined';
1169 var gpu = hasOptimizations ? _this8.options.optimizations.gpu : null;
1170 if (gpu !== false) {
1171 var yPos = undefined,
1172 xPos = undefined;
1173 if (_same.top) {
1174 css.top = 0;
1175 yPos = _pos.top;
1176 } else {
1177 css.bottom = 0;
1178 yPos = -_pos.bottom;
1179 }
1180
1181 if (_same.left) {
1182 css.left = 0;
1183 xPos = _pos.left;
1184 } else {
1185 css.right = 0;
1186 xPos = -_pos.right;
1187 }
1188
1189 if (window.matchMedia) {
1190 // HubSpot/tether#207
1191 var retina = window.matchMedia('only screen and (min-resolution: 1.3dppx)').matches || window.matchMedia('only screen and (-webkit-min-device-pixel-ratio: 1.3)').matches;
1192 if (!retina) {
1193 xPos = Math.round(xPos);
1194 yPos = Math.round(yPos);
1195 }
1196 }
1197
1198 css[transformKey] = 'translateX(' + xPos + 'px) translateY(' + yPos + 'px)';
1199
1200 if (transformKey !== 'msTransform') {
1201 // The Z transform will keep this in the GPU (faster, and prevents artifacts),
1202 // but IE9 doesn't support 3d transforms and will choke.
1203 css[transformKey] += " translateZ(0)";
1204 }
1205 } else {
1206 if (_same.top) {
1207 css.top = _pos.top + 'px';
1208 } else {
1209 css.bottom = _pos.bottom + 'px';
1210 }
1211
1212 if (_same.left) {
1213 css.left = _pos.left + 'px';
1214 } else {
1215 css.right = _pos.right + 'px';
1216 }
1217 }
1218 };
1219
1220 var moved = false;
1221 if ((same.page.top || same.page.bottom) && (same.page.left || same.page.right)) {
1222 css.position = 'absolute';
1223 transcribe(same.page, pos.page);
1224 } else if ((same.viewport.top || same.viewport.bottom) && (same.viewport.left || same.viewport.right)) {
1225 css.position = 'fixed';
1226 transcribe(same.viewport, pos.viewport);
1227 } else if (typeof same.offset !== 'undefined' && same.offset.top && same.offset.left) {
1228 (function () {
1229 css.position = 'absolute';
1230 var offsetParent = _this8.cache('target-offsetparent', function () {
1231 return getOffsetParent(_this8.target);
1232 });
1233
1234 if (getOffsetParent(_this8.element) !== offsetParent) {
1235 defer(function () {
1236 _this8.element.parentNode.removeChild(_this8.element);
1237 offsetParent.appendChild(_this8.element);
1238 });
1239 }
1240
1241 transcribe(same.offset, pos.offset);
1242 moved = true;
1243 })();
1244 } else {
1245 css.position = 'absolute';
1246 transcribe({ top: true, left: true }, pos.page);
1247 }
1248
1249 if (!moved) {
1250 if (this.options.bodyElement) {
1251 if (this.element.parentNode !== this.options.bodyElement) {
1252 this.options.bodyElement.appendChild(this.element);
1253 }
1254 } else {
1255 var offsetParentIsBody = true;
1256 var currentNode = this.element.parentNode;
1257 while (currentNode && currentNode.nodeType === 1 && currentNode.tagName !== 'BODY') {
1258 if (getComputedStyle(currentNode).position !== 'static') {
1259 offsetParentIsBody = false;
1260 break;
1261 }
1262
1263 currentNode = currentNode.parentNode;
1264 }
1265
1266 if (!offsetParentIsBody) {
1267 this.element.parentNode.removeChild(this.element);
1268 this.element.ownerDocument.body.appendChild(this.element);
1269 }
1270 }
1271 }
1272
1273 // Any css change will trigger a repaint, so let's avoid one if nothing changed
1274 var writeCSS = {};
1275 var write = false;
1276 for (var key in css) {
1277 var val = css[key];
1278 var elVal = this.element.style[key];
1279
1280 if (elVal !== val) {
1281 write = true;
1282 writeCSS[key] = val;
1283 }
1284 }
1285
1286 if (write) {
1287 defer(function () {
1288 extend(_this8.element.style, writeCSS);
1289 _this8.trigger('repositioned');
1290 });
1291 }
1292 }
1293 }]);
1294
1295 return TetherClass;
1296 })(Evented);
1297
1298 TetherClass.modules = [];
1299
1300 TetherBase.position = position;
1301
1302 var Tether = extend(TetherClass, TetherBase);
1303 /* globals TetherBase */
1304
1305 'use strict';
1306
1307 var _slicedToArray = (function () { function sliceIterator(arr, i) { var _arr = []; var _n = true; var _d = false; var _e = undefined; try { for (var _i = arr[Symbol.iterator](), _s; !(_n = (_s = _i.next()).done); _n = true) { _arr.push(_s.value); if (i && _arr.length === i) break; } } catch (err) { _d = true; _e = err; } finally { try { if (!_n && _i['return']) _i['return'](); } finally { if (_d) throw _e; } } return _arr; } return function (arr, i) { if (Array.isArray(arr)) { return arr; } else if (Symbol.iterator in Object(arr)) { return sliceIterator(arr, i); } else { throw new TypeError('Invalid attempt to destructure non-iterable instance'); } }; })();
1308
1309 var _TetherBase$Utils = TetherBase.Utils;
1310 var getBounds = _TetherBase$Utils.getBounds;
1311 var extend = _TetherBase$Utils.extend;
1312 var updateClasses = _TetherBase$Utils.updateClasses;
1313 var defer = _TetherBase$Utils.defer;
1314
1315 var BOUNDS_FORMAT = ['left', 'top', 'right', 'bottom'];
1316
1317 function getBoundingRect(tether, to) {
1318 if (to === 'scrollParent') {
1319 to = tether.scrollParents[0];
1320 } else if (to === 'window') {
1321 to = [pageXOffset, pageYOffset, innerWidth + pageXOffset, innerHeight + pageYOffset];
1322 }
1323
1324 if (to === document) {
1325 to = to.documentElement;
1326 }
1327
1328 if (typeof to.nodeType !== 'undefined') {
1329 (function () {
1330 var node = to;
1331 var size = getBounds(to);
1332 var pos = size;
1333 var style = getComputedStyle(to);
1334
1335 to = [pos.left, pos.top, size.width + pos.left, size.height + pos.top];
1336
1337 // Account any parent Frames scroll offset
1338 if (node.ownerDocument !== document) {
1339 var win = node.ownerDocument.defaultView;
1340 to[0] += win.pageXOffset;
1341 to[1] += win.pageYOffset;
1342 to[2] += win.pageXOffset;
1343 to[3] += win.pageYOffset;
1344 }
1345
1346 BOUNDS_FORMAT.forEach(function (side, i) {
1347 side = side[0].toUpperCase() + side.substr(1);
1348 if (side === 'Top' || side === 'Left') {
1349 to[i] += parseFloat(style['border' + side + 'Width']);
1350 } else {
1351 to[i] -= parseFloat(style['border' + side + 'Width']);
1352 }
1353 });
1354 })();
1355 }
1356
1357 return to;
1358 }
1359
1360 TetherBase.modules.push({
1361 position: function position(_ref) {
1362 var _this = this;
1363
1364 var top = _ref.top;
1365 var left = _ref.left;
1366 var targetAttachment = _ref.targetAttachment;
1367
1368 if (!this.options.constraints) {
1369 return true;
1370 }
1371
1372 var _cache = this.cache('element-bounds', function () {
1373 return getBounds(_this.element);
1374 });
1375
1376 var height = _cache.height;
1377 var width = _cache.width;
1378
1379 if (width === 0 && height === 0 && typeof this.lastSize !== 'undefined') {
1380 var _lastSize = this.lastSize;
1381
1382 // Handle the item getting hidden as a result of our positioning without glitching
1383 // the classes in and out
1384 width = _lastSize.width;
1385 height = _lastSize.height;
1386 }
1387
1388 var targetSize = this.cache('target-bounds', function () {
1389 return _this.getTargetBounds();
1390 });
1391
1392 var targetHeight = targetSize.height;
1393 var targetWidth = targetSize.width;
1394
1395 var allClasses = [this.getClass('pinned'), this.getClass('out-of-bounds')];
1396
1397 this.options.constraints.forEach(function (constraint) {
1398 var outOfBoundsClass = constraint.outOfBoundsClass;
1399 var pinnedClass = constraint.pinnedClass;
1400
1401 if (outOfBoundsClass) {
1402 allClasses.push(outOfBoundsClass);
1403 }
1404 if (pinnedClass) {
1405 allClasses.push(pinnedClass);
1406 }
1407 });
1408
1409 allClasses.forEach(function (cls) {
1410 ['left', 'top', 'right', 'bottom'].forEach(function (side) {
1411 allClasses.push(cls + '-' + side);
1412 });
1413 });
1414
1415 var addClasses = [];
1416
1417 var tAttachment = extend({}, targetAttachment);
1418 var eAttachment = extend({}, this.attachment);
1419
1420 this.options.constraints.forEach(function (constraint) {
1421 var to = constraint.to;
1422 var attachment = constraint.attachment;
1423 var pin = constraint.pin;
1424
1425 if (typeof attachment === 'undefined') {
1426 attachment = '';
1427 }
1428
1429 var changeAttachX = undefined,
1430 changeAttachY = undefined;
1431 if (attachment.indexOf(' ') >= 0) {
1432 var _attachment$split = attachment.split(' ');
1433
1434 var _attachment$split2 = _slicedToArray(_attachment$split, 2);
1435
1436 changeAttachY = _attachment$split2[0];
1437 changeAttachX = _attachment$split2[1];
1438 } else {
1439 changeAttachX = changeAttachY = attachment;
1440 }
1441
1442 var bounds = getBoundingRect(_this, to);
1443
1444 if (changeAttachY === 'target' || changeAttachY === 'both') {
1445 if (top < bounds[1] && tAttachment.top === 'top') {
1446 top += targetHeight;
1447 tAttachment.top = 'bottom';
1448 }
1449
1450 if (top + height > bounds[3] && tAttachment.top === 'bottom') {
1451 top -= targetHeight;
1452 tAttachment.top = 'top';
1453 }
1454 }
1455
1456 if (changeAttachY === 'together') {
1457 if (tAttachment.top === 'top') {
1458 if (eAttachment.top === 'bottom' && top < bounds[1]) {
1459 top += targetHeight;
1460 tAttachment.top = 'bottom';
1461
1462 top += height;
1463 eAttachment.top = 'top';
1464 } else if (eAttachment.top === 'top' && top + height > bounds[3] && top - (height - targetHeight) >= bounds[1]) {
1465 top -= height - targetHeight;
1466 tAttachment.top = 'bottom';
1467
1468 eAttachment.top = 'bottom';
1469 }
1470 }
1471
1472 if (tAttachment.top === 'bottom') {
1473 if (eAttachment.top === 'top' && top + height > bounds[3]) {
1474 top -= targetHeight;
1475 tAttachment.top = 'top';
1476
1477 top -= height;
1478 eAttachment.top = 'bottom';
1479 } else if (eAttachment.top === 'bottom' && top < bounds[1] && top + (height * 2 - targetHeight) <= bounds[3]) {
1480 top += height - targetHeight;
1481 tAttachment.top = 'top';
1482
1483 eAttachment.top = 'top';
1484 }
1485 }
1486
1487 if (tAttachment.top === 'middle') {
1488 if (top + height > bounds[3] && eAttachment.top === 'top') {
1489 top -= height;
1490 eAttachment.top = 'bottom';
1491 } else if (top < bounds[1] && eAttachment.top === 'bottom') {
1492 top += height;
1493 eAttachment.top = 'top';
1494 }
1495 }
1496 }
1497
1498 if (changeAttachX === 'target' || changeAttachX === 'both') {
1499 if (left < bounds[0] && tAttachment.left === 'left') {
1500 left += targetWidth;
1501 tAttachment.left = 'right';
1502 }
1503
1504 if (left + width > bounds[2] && tAttachment.left === 'right') {
1505 left -= targetWidth;
1506 tAttachment.left = 'left';
1507 }
1508 }
1509
1510 if (changeAttachX === 'together') {
1511 if (left < bounds[0] && tAttachment.left === 'left') {
1512 if (eAttachment.left === 'right') {
1513 left += targetWidth;
1514 tAttachment.left = 'right';
1515
1516 left += width;
1517 eAttachment.left = 'left';
1518 } else if (eAttachment.left === 'left') {
1519 left += targetWidth;
1520 tAttachment.left = 'right';
1521
1522 left -= width;
1523 eAttachment.left = 'right';
1524 }
1525 } else if (left + width > bounds[2] && tAttachment.left === 'right') {
1526 if (eAttachment.left === 'left') {
1527 left -= targetWidth;
1528 tAttachment.left = 'left';
1529
1530 left -= width;
1531 eAttachment.left = 'right';
1532 } else if (eAttachment.left === 'right') {
1533 left -= targetWidth;
1534 tAttachment.left = 'left';
1535
1536 left += width;
1537 eAttachment.left = 'left';
1538 }
1539 } else if (tAttachment.left === 'center') {
1540 if (left + width > bounds[2] && eAttachment.left === 'left') {
1541 left -= width;
1542 eAttachment.left = 'right';
1543 } else if (left < bounds[0] && eAttachment.left === 'right') {
1544 left += width;
1545 eAttachment.left = 'left';
1546 }
1547 }
1548 }
1549
1550 if (changeAttachY === 'element' || changeAttachY === 'both') {
1551 if (top < bounds[1] && eAttachment.top === 'bottom') {
1552 top += height;
1553 eAttachment.top = 'top';
1554 }
1555
1556 if (top + height > bounds[3] && eAttachment.top === 'top') {
1557 top -= height;
1558 eAttachment.top = 'bottom';
1559 }
1560 }
1561
1562 if (changeAttachX === 'element' || changeAttachX === 'both') {
1563 if (left < bounds[0]) {
1564 if (eAttachment.left === 'right') {
1565 left += width;
1566 eAttachment.left = 'left';
1567 } else if (eAttachment.left === 'center') {
1568 left += width / 2;
1569 eAttachment.left = 'left';
1570 }
1571 }
1572
1573 if (left + width > bounds[2]) {
1574 if (eAttachment.left === 'left') {
1575 left -= width;
1576 eAttachment.left = 'right';
1577 } else if (eAttachment.left === 'center') {
1578 left -= width / 2;
1579 eAttachment.left = 'right';
1580 }
1581 }
1582 }
1583
1584 if (typeof pin === 'string') {
1585 pin = pin.split(',').map(function (p) {
1586 return p.trim();
1587 });
1588 } else if (pin === true) {
1589 pin = ['top', 'left', 'right', 'bottom'];
1590 }
1591
1592 pin = pin || [];
1593
1594 var pinned = [];
1595 var oob = [];
1596
1597 if (top < bounds[1]) {
1598 if (pin.indexOf('top') >= 0) {
1599 top = bounds[1];
1600 pinned.push('top');
1601 } else {
1602 oob.push('top');
1603 }
1604 }
1605
1606 if (top + height > bounds[3]) {
1607 if (pin.indexOf('bottom') >= 0) {
1608 top = bounds[3] - height;
1609 pinned.push('bottom');
1610 } else {
1611 oob.push('bottom');
1612 }
1613 }
1614
1615 if (left < bounds[0]) {
1616 if (pin.indexOf('left') >= 0) {
1617 left = bounds[0];
1618 pinned.push('left');
1619 } else {
1620 oob.push('left');
1621 }
1622 }
1623
1624 if (left + width > bounds[2]) {
1625 if (pin.indexOf('right') >= 0) {
1626 left = bounds[2] - width;
1627 pinned.push('right');
1628 } else {
1629 oob.push('right');
1630 }
1631 }
1632
1633 if (pinned.length) {
1634 (function () {
1635 var pinnedClass = undefined;
1636 if (typeof _this.options.pinnedClass !== 'undefined') {
1637 pinnedClass = _this.options.pinnedClass;
1638 } else {
1639 pinnedClass = _this.getClass('pinned');
1640 }
1641
1642 addClasses.push(pinnedClass);
1643 pinned.forEach(function (side) {
1644 addClasses.push(pinnedClass + '-' + side);
1645 });
1646 })();
1647 }
1648
1649 if (oob.length) {
1650 (function () {
1651 var oobClass = undefined;
1652 if (typeof _this.options.outOfBoundsClass !== 'undefined') {
1653 oobClass = _this.options.outOfBoundsClass;
1654 } else {
1655 oobClass = _this.getClass('out-of-bounds');
1656 }
1657
1658 addClasses.push(oobClass);
1659 oob.forEach(function (side) {
1660 addClasses.push(oobClass + '-' + side);
1661 });
1662 })();
1663 }
1664
1665 if (pinned.indexOf('left') >= 0 || pinned.indexOf('right') >= 0) {
1666 eAttachment.left = tAttachment.left = false;
1667 }
1668 if (pinned.indexOf('top') >= 0 || pinned.indexOf('bottom') >= 0) {
1669 eAttachment.top = tAttachment.top = false;
1670 }
1671
1672 if (tAttachment.top !== targetAttachment.top || tAttachment.left !== targetAttachment.left || eAttachment.top !== _this.attachment.top || eAttachment.left !== _this.attachment.left) {
1673 _this.updateAttachClasses(eAttachment, tAttachment);
1674 _this.trigger('update', {
1675 attachment: eAttachment,
1676 targetAttachment: tAttachment
1677 });
1678 }
1679 });
1680
1681 defer(function () {
1682 if (!(_this.options.addTargetClasses === false)) {
1683 updateClasses(_this.target, addClasses, allClasses);
1684 }
1685 updateClasses(_this.element, addClasses, allClasses);
1686 });
1687
1688 return { top: top, left: left };
1689 }
1690 });
1691 /* globals TetherBase */
1692
1693 'use strict';
1694
1695 var _TetherBase$Utils = TetherBase.Utils;
1696 var getBounds = _TetherBase$Utils.getBounds;
1697 var updateClasses = _TetherBase$Utils.updateClasses;
1698 var defer = _TetherBase$Utils.defer;
1699
1700 TetherBase.modules.push({
1701 position: function position(_ref) {
1702 var _this = this;
1703
1704 var top = _ref.top;
1705 var left = _ref.left;
1706
1707 var _cache = this.cache('element-bounds', function () {
1708 return getBounds(_this.element);
1709 });
1710
1711 var height = _cache.height;
1712 var width = _cache.width;
1713
1714 var targetPos = this.getTargetBounds();
1715
1716 var bottom = top + height;
1717 var right = left + width;
1718
1719 var abutted = [];
1720 if (top <= targetPos.bottom && bottom >= targetPos.top) {
1721 ['left', 'right'].forEach(function (side) {
1722 var targetPosSide = targetPos[side];
1723 if (targetPosSide === left || targetPosSide === right) {
1724 abutted.push(side);
1725 }
1726 });
1727 }
1728
1729 if (left <= targetPos.right && right >= targetPos.left) {
1730 ['top', 'bottom'].forEach(function (side) {
1731 var targetPosSide = targetPos[side];
1732 if (targetPosSide === top || targetPosSide === bottom) {
1733 abutted.push(side);
1734 }
1735 });
1736 }
1737
1738 var allClasses = [];
1739 var addClasses = [];
1740
1741 var sides = ['left', 'top', 'right', 'bottom'];
1742 allClasses.push(this.getClass('abutted'));
1743 sides.forEach(function (side) {
1744 allClasses.push(_this.getClass('abutted') + '-' + side);
1745 });
1746
1747 if (abutted.length) {
1748 addClasses.push(this.getClass('abutted'));
1749 }
1750
1751 abutted.forEach(function (side) {
1752 addClasses.push(_this.getClass('abutted') + '-' + side);
1753 });
1754
1755 defer(function () {
1756 if (!(_this.options.addTargetClasses === false)) {
1757 updateClasses(_this.target, addClasses, allClasses);
1758 }
1759 updateClasses(_this.element, addClasses, allClasses);
1760 });
1761
1762 return true;
1763 }
1764 });
1765 /* globals TetherBase */
1766
1767 'use strict';
1768
1769 var _slicedToArray = (function () { function sliceIterator(arr, i) { var _arr = []; var _n = true; var _d = false; var _e = undefined; try { for (var _i = arr[Symbol.iterator](), _s; !(_n = (_s = _i.next()).done); _n = true) { _arr.push(_s.value); if (i && _arr.length === i) break; } } catch (err) { _d = true; _e = err; } finally { try { if (!_n && _i['return']) _i['return'](); } finally { if (_d) throw _e; } } return _arr; } return function (arr, i) { if (Array.isArray(arr)) { return arr; } else if (Symbol.iterator in Object(arr)) { return sliceIterator(arr, i); } else { throw new TypeError('Invalid attempt to destructure non-iterable instance'); } }; })();
1770
1771 TetherBase.modules.push({
1772 position: function position(_ref) {
1773 var top = _ref.top;
1774 var left = _ref.left;
1775
1776 if (!this.options.shift) {
1777 return;
1778 }
1779
1780 var shift = this.options.shift;
1781 if (typeof this.options.shift === 'function') {
1782 shift = this.options.shift.call(this, { top: top, left: left });
1783 }
1784
1785 var shiftTop = undefined,
1786 shiftLeft = undefined;
1787 if (typeof shift === 'string') {
1788 shift = shift.split(' ');
1789 shift[1] = shift[1] || shift[0];
1790
1791 var _shift = shift;
1792
1793 var _shift2 = _slicedToArray(_shift, 2);
1794
1795 shiftTop = _shift2[0];
1796 shiftLeft = _shift2[1];
1797
1798 shiftTop = parseFloat(shiftTop, 10);
1799 shiftLeft = parseFloat(shiftLeft, 10);
1800 } else {
1801 shiftTop = shift.top;
1802 shiftLeft = shift.left;
1803 }
1804
1805 top += shiftTop;
1806 left += shiftLeft;
1807
1808 return { top: top, left: left };
1809 }
1810 });
1811 return Tether;
1812
1813 }));
1814