diff options
Diffstat (limited to 'templates/assets/tether/src/js/abutment.js')
| -rw-r--r-- | templates/assets/tether/src/js/abutment.js | 61 |
1 files changed, 61 insertions, 0 deletions
diff --git a/templates/assets/tether/src/js/abutment.js b/templates/assets/tether/src/js/abutment.js new file mode 100644 index 0000000..9605635 --- /dev/null +++ b/templates/assets/tether/src/js/abutment.js @@ -0,0 +1,61 @@ +/* globals TetherBase */ + +const {getBounds, updateClasses, defer} = TetherBase.Utils; + +TetherBase.modules.push({ + position({top, left}) { + const {height, width} = this.cache('element-bounds', () => { + return getBounds(this.element); + }); + + const targetPos = this.getTargetBounds(); + + const bottom = top + height; + const right = left + width; + + const abutted = []; + if (top <= targetPos.bottom && bottom >= targetPos.top) { + ['left', 'right'].forEach(side => { + const targetPosSide = targetPos[side]; + if (targetPosSide === left || targetPosSide === right) { + abutted.push(side); + } + }); + } + + if (left <= targetPos.right && right >= targetPos.left) { + ['top', 'bottom'].forEach(side => { + const targetPosSide = targetPos[side]; + if (targetPosSide === top || targetPosSide === bottom) { + abutted.push(side); + } + }); + } + + const allClasses = []; + const addClasses = []; + + const sides = ['left', 'top', 'right', 'bottom']; + allClasses.push(this.getClass('abutted')); + sides.forEach(side => { + allClasses.push(`${ this.getClass('abutted') }-${ side }`); + }); + + if (abutted.length) { + addClasses.push(this.getClass('abutted')); + } + + abutted.forEach(side => { + addClasses.push(`${ this.getClass('abutted') }-${ side }`); + }); + + defer(() => { + if (!(this.options.addTargetClasses === false)) { + updateClasses(this.target, addClasses, allClasses); + } + updateClasses(this.element, addClasses, allClasses); + }); + + return true; + } +}); |
