From b9588881978312a42a9d79a2c6df3374cbf37a58 Mon Sep 17 00:00:00 2001 From: Zack Bloom Date: Thu, 12 Dec 2013 00:01:58 -0500 Subject: [PATCH 01/40] Add hsdoc file --- .hsdoc | 0 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 .hsdoc diff --git a/.hsdoc b/.hsdoc new file mode 100644 index 000000000..e69de29bb From db8aff071a635a123e8c7cdbcb51cb926d3977f3 Mon Sep 17 00:00:00 2001 From: Zack Bloom Date: Tue, 31 Dec 2013 20:44:02 -0500 Subject: [PATCH 02/40] Rebuild docs --- Gruntfile.coffee | 27 +- abutment.coffee | 14 +- abutment.js | 34 +- config.rb | 5 - constraint.coffee | 135 +- constraint.js | 176 +- css/drop-select-theme-default.css | 116 - css/drop-theme-arrows.css | 48 +- css/drop-tooltip-theme-arrows.css | 48 +- docs/css/intro.css | 156 + docs/intro.html | 421 ++ docs/js/intro.js | 71 + docs/welcome/browser-demo.html | 2 +- docs/welcome/coffee/welcome.coffee | 59 +- docs/welcome/css/browser-demo.css | 19 +- docs/welcome/css/welcome.css | 93 +- docs/welcome/index.html | 112 +- docs/welcome/js/welcome.js | 66 +- docs/welcome/sass/browser-demo.sass | 20 +- docs/welcome/sass/welcome.sass | 110 +- drop.coffee | 183 - drop.js | 213 - examples/facebook/index.html | 1 + examples/select/index.html | 647 --- examples/simple/index.html | 17 +- examples/simple/style.css | 5 +- examples/tooltip/index.html | 3 +- index.html | 421 ++ markAttachment.coffee | 32 + markAttachment.js | 50 + package.json | 19 - resources/executr/build/css/executr.css | 56 + resources/executr/build/js/executr-run.js | 34 + resources/executr/build/js/executr.js | 239 + resources/executr/lib/CodeMirror/LICENSE | 23 + .../executr/lib/CodeMirror/codemirror.css | 240 + .../executr/lib/CodeMirror/codemirror.js | 4786 +++++++++++++++++ .../lib/CodeMirror/mode/coffeescript/LICENSE | 22 + .../mode/coffeescript/coffeescript.js | 346 ++ .../CodeMirror/mode/coffeescript/index.html | 728 +++ .../lib/CodeMirror/mode/javascript/index.html | 88 + .../CodeMirror/mode/javascript/javascript.js | 422 ++ .../mode/javascript/typescript.html | 48 + resources/executr/lib/coffee-script.js | 8 + resources/executr/lib/js2coffee.min.js | 2867 ++++++++++ resources/executr/lib/underscore.min.js | 32 + resources/styles/documentation.css | 1 + resources/styles/highlight-theme-github.css | 1 + resources/styles/navigation-tweaks.css | 1 + resources/styles/print.css | 1 + resources/templates/api.jade | 6 + resources/templates/base.jade | 46 + resources/templates/examples.jade | 6 + resources/templates/includes/analytics.html | 20 + resources/templates/includes/footer.jade | 63 + .../includes/navigation-and-content.jade | 13 + resources/templates/includes/navigation.jade | 25 + resources/templates/includes/page-header.jade | 15 + resources/templates/includes/topbar.html | 29 + resources/templates/index.jade | 34 + resources/templates/page.jade | 6 + sass/_checkmark.scss | 10 - sass/_checkmark.svg | 4 - sass/_no-mobile-tap-highlight.sass | 3 - sass/_pointer-events.scss | 6 - sass/_user-select.sass | 6 - sass/drop-select-theme-default.sass | 110 - sass/drop-theme-arrows.sass | 137 - sass/drop-theme-default.sass | 19 - sass/drop-tooltip-theme-arrows.sass | 139 - sass/drop.sass | 13 - select.coffee | 210 - select.js | 250 - shift.coffee | 26 +- shift.js | 29 +- source/Gruntfile.html | 148 + source/abutment.html | 123 + source/constraint.html | 315 ++ source/docco.css | 500 ++ source/markAttachment.html | 122 + source/public/fonts/aller-bold.eot | Bin 0 -> 29804 bytes source/public/fonts/aller-bold.ttf | Bin 0 -> 66836 bytes source/public/fonts/aller-bold.woff | Bin 0 -> 33244 bytes source/public/fonts/aller-light.eot | Bin 0 -> 29509 bytes source/public/fonts/aller-light.ttf | Bin 0 -> 68620 bytes source/public/fonts/aller-light.woff | Bin 0 -> 33124 bytes source/public/fonts/novecento-bold.eot | Bin 0 -> 18190 bytes source/public/fonts/novecento-bold.ttf | Bin 0 -> 48136 bytes source/public/fonts/novecento-bold.woff | Bin 0 -> 20576 bytes source/public/stylesheets/normalize.css | 375 ++ source/shift.html | 117 + source/tether.html | 664 +++ source/tooltip.html | 115 + source/utils.html | 214 + tether.coffee | 263 +- tether.js | 383 +- tether.min.js | 4 +- tooltip.coffee | 4 +- tooltip.js | 3 +- utils.coffee | 112 + utils.js | 192 + 101 files changed, 15485 insertions(+), 2660 deletions(-) delete mode 100644 config.rb delete mode 100644 css/drop-select-theme-default.css create mode 100644 docs/css/intro.css create mode 100644 docs/intro.html create mode 100644 docs/js/intro.js delete mode 100644 drop.coffee delete mode 100644 drop.js delete mode 100644 examples/select/index.html create mode 100644 index.html create mode 100644 markAttachment.coffee create mode 100644 markAttachment.js delete mode 100644 package.json create mode 100644 resources/executr/build/css/executr.css create mode 100644 resources/executr/build/js/executr-run.js create mode 100644 resources/executr/build/js/executr.js create mode 100644 resources/executr/lib/CodeMirror/LICENSE create mode 100644 resources/executr/lib/CodeMirror/codemirror.css create mode 100644 resources/executr/lib/CodeMirror/codemirror.js create mode 100644 resources/executr/lib/CodeMirror/mode/coffeescript/LICENSE create mode 100644 resources/executr/lib/CodeMirror/mode/coffeescript/coffeescript.js create mode 100644 resources/executr/lib/CodeMirror/mode/coffeescript/index.html create mode 100644 resources/executr/lib/CodeMirror/mode/javascript/index.html create mode 100644 resources/executr/lib/CodeMirror/mode/javascript/javascript.js create mode 100644 resources/executr/lib/CodeMirror/mode/javascript/typescript.html create mode 100644 resources/executr/lib/coffee-script.js create mode 100644 resources/executr/lib/js2coffee.min.js create mode 100644 resources/executr/lib/underscore.min.js create mode 100644 resources/styles/documentation.css create mode 100644 resources/styles/highlight-theme-github.css create mode 100644 resources/styles/navigation-tweaks.css create mode 100644 resources/styles/print.css create mode 100644 resources/templates/api.jade create mode 100644 resources/templates/base.jade create mode 100644 resources/templates/examples.jade create mode 100644 resources/templates/includes/analytics.html create mode 100644 resources/templates/includes/footer.jade create mode 100644 resources/templates/includes/navigation-and-content.jade create mode 100644 resources/templates/includes/navigation.jade create mode 100644 resources/templates/includes/page-header.jade create mode 100644 resources/templates/includes/topbar.html create mode 100644 resources/templates/index.jade create mode 100644 resources/templates/page.jade delete mode 100644 sass/_checkmark.scss delete mode 100644 sass/_checkmark.svg delete mode 100644 sass/_no-mobile-tap-highlight.sass delete mode 100644 sass/_pointer-events.scss delete mode 100644 sass/_user-select.sass delete mode 100644 sass/drop-select-theme-default.sass delete mode 100644 sass/drop-theme-arrows.sass delete mode 100644 sass/drop-theme-default.sass delete mode 100644 sass/drop-tooltip-theme-arrows.sass delete mode 100644 sass/drop.sass delete mode 100644 select.coffee delete mode 100644 select.js create mode 100644 source/Gruntfile.html create mode 100644 source/abutment.html create mode 100644 source/constraint.html create mode 100644 source/docco.css create mode 100644 source/markAttachment.html create mode 100755 source/public/fonts/aller-bold.eot create mode 100755 source/public/fonts/aller-bold.ttf create mode 100755 source/public/fonts/aller-bold.woff create mode 100755 source/public/fonts/aller-light.eot create mode 100755 source/public/fonts/aller-light.ttf create mode 100755 source/public/fonts/aller-light.woff create mode 100755 source/public/fonts/novecento-bold.eot create mode 100755 source/public/fonts/novecento-bold.ttf create mode 100755 source/public/fonts/novecento-bold.woff create mode 100644 source/public/stylesheets/normalize.css create mode 100644 source/shift.html create mode 100644 source/tether.html create mode 100644 source/tooltip.html create mode 100644 source/utils.html create mode 100644 utils.coffee create mode 100644 utils.js diff --git a/Gruntfile.coffee b/Gruntfile.coffee index 9adc01b77..d4744ad4d 100644 --- a/Gruntfile.coffee +++ b/Gruntfile.coffee @@ -4,23 +4,23 @@ module.exports = (grunt) -> coffee: compile: files: + 'utils.js': 'utils.coffee' 'tether.js': 'tether.coffee' - 'drop.js': 'drop.coffee' - 'select.js': 'select.coffee' - 'tooltip.js': 'tooltip.coffee' 'constraint.js': 'constraint.coffee' 'abutment.js': 'abutment.coffee' 'shift.js': 'shift.coffee' + 'markAttachment.js': 'markAttachment.coffee' + 'docs/js/intro.js': 'docs/coffee/intro.coffee' 'docs/welcome/js/welcome.js': 'docs/welcome/coffee/welcome.coffee' watch: coffee: - files: ['*.coffee', 'sass/*', 'docs/welcome/coffee/*.coffee', 'docs/welcome/sass/*.sass'] + files: ['*.coffee', 'sass/*', 'docs/**/*'] tasks: ['coffee', 'uglify', 'compass'] uglify: tether: - src: 'tether.js' + src: ['utils.js', 'tether.js', 'constraint.js', 'abutment.js', 'shift.js'] dest: 'tether.min.js' options: banner: '/*! tether.js <%= pkg.version %> */\n' @@ -30,14 +30,29 @@ module.exports = (grunt) -> options: sassDir: 'sass' cssDir: 'css' + introDocs: + options: + sassDir: 'docs/sass' + cssDir: 'docs/css' welcomeDocs: options: sassDir: 'docs/welcome/sass' cssDir: 'docs/welcome/css' + bower: + install: + options: + targetDir: 'deps' + cleanup: true + layout: 'byComponent' + bowerOptions: + forceLatest: true + production: true + grunt.loadNpmTasks 'grunt-contrib-watch' grunt.loadNpmTasks 'grunt-contrib-uglify' grunt.loadNpmTasks 'grunt-contrib-coffee' grunt.loadNpmTasks 'grunt-contrib-compass' + grunt.loadNpmTasks 'grunt-bower-task' - grunt.registerTask 'default', ['coffee', 'uglify', 'compass'] + grunt.registerTask 'default', ['bower', 'coffee', 'uglify', 'compass'] diff --git a/abutment.coffee b/abutment.coffee index d3405c3b5..7dd47d6f3 100644 --- a/abutment.coffee +++ b/abutment.coffee @@ -1,16 +1,10 @@ -$ = jQuery +{getBounds} = Tether.Utils Tether.modules.push position: ({top, left}) -> - # TODO: Just do this in tether, so we don't have to repeat it - height = @$element.outerHeight() - width = @$element.outerWidth() - targetHeight = @$target.outerHeight() - targetWidth = @$target.outerWidth() - - targetPos = @$target.offset() - targetPos.bottom = targetPos.top + targetHeight - targetPos.right = targetPos.left + targetWidth + {height, width} = @cache 'element-bounds', => getBounds @element + + targetPos = @getTargetBounds() bottom = top + height right = left + width diff --git a/abutment.js b/abutment.js index 8147f1212..b220cfd06 100644 --- a/abutment.js +++ b/abutment.js @@ -1,36 +1,34 @@ (function() { - var $; + var getBounds; - $ = jQuery; + getBounds = Tether.Utils.getBounds; Tether.modules.push({ position: function(_arg) { - var abutted, bottom, height, left, right, side, sides, targetHeight, targetPos, targetWidth, top, width, _i, _j, _k, _l, _len, _len1, _len2, _len3, _ref, _ref1, _ref2, _ref3; + var abutted, bottom, height, left, right, side, sides, targetPos, top, width, _i, _j, _k, _l, _len, _len1, _len2, _len3, _ref, _ref1, _ref2, _ref3, _ref4, + _this = this; top = _arg.top, left = _arg.left; - height = this.$element.outerHeight(); - width = this.$element.outerWidth(); - targetHeight = this.$target.outerHeight(); - targetWidth = this.$target.outerWidth(); - targetPos = this.$target.offset(); - targetPos.bottom = targetPos.top + targetHeight; - targetPos.right = targetPos.left + targetWidth; + _ref = this.cache('element-bounds', function() { + return getBounds(_this.element); + }), height = _ref.height, width = _ref.width; + targetPos = this.getTargetBounds(); bottom = top + height; right = left + width; abutted = []; if (top <= targetPos.bottom && bottom >= targetPos.top) { - _ref = ['left', 'right']; - for (_i = 0, _len = _ref.length; _i < _len; _i++) { - side = _ref[_i]; - if ((_ref1 = targetPos[side]) === left || _ref1 === right) { + _ref1 = ['left', 'right']; + for (_i = 0, _len = _ref1.length; _i < _len; _i++) { + side = _ref1[_i]; + if ((_ref2 = targetPos[side]) === left || _ref2 === right) { abutted.push(side); } } } if (left <= targetPos.right && right >= targetPos.left) { - _ref2 = ['top', 'bottom']; - for (_j = 0, _len1 = _ref2.length; _j < _len1; _j++) { - side = _ref2[_j]; - if ((_ref3 = targetPos[side]) === top || _ref3 === bottom) { + _ref3 = ['top', 'bottom']; + for (_j = 0, _len1 = _ref3.length; _j < _len1; _j++) { + side = _ref3[_j]; + if ((_ref4 = targetPos[side]) === top || _ref4 === bottom) { abutted.push(side); } } diff --git a/config.rb b/config.rb deleted file mode 100644 index 1b59e68b0..000000000 --- a/config.rb +++ /dev/null @@ -1,5 +0,0 @@ -css_dir = "css" -sass_dir = "sass" -output_style = :nested -relative_assets = true -line_comments = false \ No newline at end of file diff --git a/constraint.coffee b/constraint.coffee index 608895df6..3bc0520d2 100644 --- a/constraint.coffee +++ b/constraint.coffee @@ -1,4 +1,4 @@ -$ = jQuery +{getOuterSize, getBounds, getSize, extend} = Tether.Utils MIRROR_ATTACH = left: 'right' @@ -9,41 +9,53 @@ MIRROR_ATTACH = BOUNDS_FORMAT = ['left', 'top', 'right', 'bottom'] -getBounds = (tether, to) -> +getBoundingRect = (tether, to) -> if to is 'scrollParent' - to = tether.scrollParent[0] + to = tether.scrollParent else if to is 'window' to = [pageXOffset, pageYOffset, innerWidth + pageXOffset, innerHeight + pageYOffset] if to.nodeType? - $to = $ to - pos = $to.offset() + pos = size = getBounds to + style = getComputedStyle to - to = [pos.left, pos.top, $to.width() + pos.left, $to.height() + pos.top] + to = [pos.left, pos.top, size.width + pos.left, size.height + pos.top] for side, i in BOUNDS_FORMAT - to[i] += parseFloat($to.css("border-#{ side }-width"), 10) + if side in ['top', 'left'] + to[i] += parseFloat style["border-#{ side }-width"] + else + to[i] -= parseFloat style["border-#{ side }-width"] to Tether.modules.push position: ({top, left, targetAttachment}) -> - return unless @options.constraints + return true unless @options.constraints + + removeClass = (prefix) => + @removeClass prefix + for side in BOUNDS_FORMAT + @removeClass "#{ prefix }-#{ side }" - height = @$element.outerHeight() - width = @$element.outerWidth() - targetHeight = @$target.outerHeight() - targetWidth = @$target.outerWidth() + {height, width} = @cache 'element-bounds', => getBounds @element + + targetSize = @cache 'target-bounds', => @getTargetBounds() + targetHeight = targetSize.height + targetWidth = targetSize.width tAttachment = {} eAttachment = {} - @removeClass 'tether-pinned tether-out-of-bounds' - for side in BOUNDS_FORMAT - @removeClass "tether-pinned-#{ side } tether-out-of-bounds-#{ side }" + removeClasses = ['tether-pinned', 'tether-out-of-bounds'] + for constraint in @options.constraints + removeClasses.push(constraint.outOfBoundsClass) if constraint.outOfBoundsClass + removeClasses.push(constraint.pinnedClass) if constraint.pinnedClass - tAttachment = $.extend {}, targetAttachment - eAttachment = $.extend {}, @attachment + removeClass(cls) for cls in removeClasses + + tAttachment = extend {}, targetAttachment + eAttachment = extend {}, @attachment for constraint in @options.constraints {to, attachment, pin} = constraint @@ -55,9 +67,8 @@ Tether.modules.push else changeAttachX = changeAttachY = attachment - bounds = getBounds @, to + bounds = getBoundingRect @, to - # TODO Only change attachment if it will help the situation if changeAttachY in ['target', 'both'] if (top < bounds[1] and tAttachment.top is 'top') top += targetHeight @@ -68,19 +79,33 @@ Tether.modules.push tAttachment.top = 'top' if changeAttachY is 'together' - if (top < bounds[1] and tAttachment.top is 'top' and eAttachment.top is 'bottom') - top += targetHeight - tAttachment.top = 'bottom' - - top += height - eAttachment.top = 'top' - - if (top + height > bounds[3] and tAttachment.top is 'bottom' and eAttachment.top is 'top') - top -= targetHeight - tAttachment.top = 'top' - - top -= height - eAttachment.top = 'bottom' + if top < bounds[1] and tAttachment.top is 'top' + if eAttachment.top is 'bottom' + top += targetHeight + tAttachment.top = 'bottom' + + top += height + eAttachment.top = 'top' + else if eAttachment.top is 'top' + top += targetHeight + tAttachment.top = 'bottom' + + top -= height + eAttachment.top = 'bottom' + + if top + height > bounds[3] and tAttachment.top is 'bottom' + if eAttachment.top is 'top' + top -= targetHeight + tAttachment.top = 'top' + + top -= height + eAttachment.top = 'bottom' + else if eAttachment.top is 'bottom' + top -= targetHeight + tAttachment.top = 'top' + + top += height + eAttachment.top = 'top' if changeAttachX in ['target', 'both'] if (left < bounds[0] and tAttachment.left is 'left') @@ -92,19 +117,35 @@ Tether.modules.push tAttachment.left = 'left' if changeAttachX is 'together' - if (left < bounds[0] and tAttachment.left is 'left' and eAttachment.left is 'right') - left += targetWidth - tAttachment.left = 'right' + if left < bounds[0] and tAttachment.left is 'left' + if eAttachment.left is 'right' + left += targetWidth + tAttachment.left = 'right' - left += width - eAttachment.left = 'left' + left += width + eAttachment.left = 'left' - if (left + width > bounds[2] and tAttachment.left is 'right' and eAttachment.left is 'left') - left -= targetWidth - tAttachment.left = 'left' + else if eAttachment.left is 'left' + left += targetWidth + tAttachment.left = 'right' - left -= width - eAttachment.left = 'right' + left -= width + eAttachment.left = 'right' + + else if left + width > bounds[2] and tAttachment.left is 'right' + if eAttachment.left is 'left' + left -= targetWidth + tAttachment.left = 'left' + + left -= width + eAttachment.left = 'right' + + else if eAttachment.left is 'right' + left -= targetWidth + tAttachment.left = 'left' + + left += width + eAttachment.left = 'left' if changeAttachY in ['element', 'both'] if (top < bounds[1] and eAttachment.top is 'bottom') @@ -162,14 +203,16 @@ Tether.modules.push oob.push 'right' if pinned.length - @addClass 'tether-pinned' + pinnedClass = @options.pinnedClass ? 'tether-pinned' + @addClass pinnedClass for side in pinned - @addClass "tether-pinned-#{ side }" + @addClass "#{ pinnedClass }-#{ side }" if oob.length - @addClass 'tether-out-of-bounds' + oobClass = @options.outOfBoundsClass ? 'tether-out-of-bounds' + @addClass oobClass for side in oob - @addClass "tether-out-of-bounds-#{ side }" + @addClass "#{ oobClass }-#{ side }" if 'left' in pinned or 'right' in pinned eAttachment.left = tAttachment.left = false diff --git a/constraint.js b/constraint.js index afffec81d..4b526f9d5 100644 --- a/constraint.js +++ b/constraint.js @@ -1,8 +1,8 @@ (function() { - var $, BOUNDS_FORMAT, MIRROR_ATTACH, getBounds, + var BOUNDS_FORMAT, MIRROR_ATTACH, extend, getBoundingRect, getBounds, getOuterSize, getSize, _ref, __indexOf = [].indexOf || function(item) { for (var i = 0, l = this.length; i < l; i++) { if (i in this && this[i] === item) return i; } return -1; }; - $ = jQuery; + _ref = Tether.Utils, getOuterSize = _ref.getOuterSize, getBounds = _ref.getBounds, getSize = _ref.getSize, extend = _ref.extend; MIRROR_ATTACH = { left: 'right', @@ -14,20 +14,24 @@ BOUNDS_FORMAT = ['left', 'top', 'right', 'bottom']; - getBounds = function(tether, to) { - var $to, i, pos, side, _i, _len; + getBoundingRect = function(tether, to) { + var i, pos, side, size, style, _i, _len; if (to === 'scrollParent') { - to = tether.scrollParent[0]; + to = tether.scrollParent; } else if (to === 'window') { to = [pageXOffset, pageYOffset, innerWidth + pageXOffset, innerHeight + pageYOffset]; } if (to.nodeType != null) { - $to = $(to); - pos = $to.offset(); - to = [pos.left, pos.top, $to.width() + pos.left, $to.height() + pos.top]; + pos = size = getBounds(to); + style = getComputedStyle(to); + to = [pos.left, pos.top, size.width + pos.left, size.height + pos.top]; for (i = _i = 0, _len = BOUNDS_FORMAT.length; _i < _len; i = ++_i) { side = BOUNDS_FORMAT[i]; - to[i] += parseFloat($to.css("border-" + side + "-width"), 10); + if (side === 'top' || side === 'left') { + to[i] += parseFloat(style["border-" + side + "-width"]); + } else { + to[i] -= parseFloat(style["border-" + side + "-width"]); + } } } return to; @@ -35,37 +39,62 @@ Tether.modules.push({ position: function(_arg) { - var attachment, bounds, changeAttachX, changeAttachY, constraint, eAttachment, height, left, oob, p, pin, pinned, side, tAttachment, targetAttachment, targetHeight, targetWidth, to, top, width, _i, _j, _k, _l, _len, _len1, _len2, _len3, _ref, _ref1; + var attachment, bounds, changeAttachX, changeAttachY, cls, constraint, eAttachment, height, left, oob, oobClass, p, pin, pinned, pinnedClass, removeClass, removeClasses, side, tAttachment, targetAttachment, targetHeight, targetSize, targetWidth, to, top, width, _i, _j, _k, _l, _len, _len1, _len2, _len3, _len4, _m, _ref1, _ref2, _ref3, _ref4, _ref5, _ref6, + _this = this; top = _arg.top, left = _arg.left, targetAttachment = _arg.targetAttachment; if (!this.options.constraints) { - return; + return true; } - height = this.$element.outerHeight(); - width = this.$element.outerWidth(); - targetHeight = this.$target.outerHeight(); - targetWidth = this.$target.outerWidth(); + removeClass = function(prefix) { + var side, _i, _len, _results; + _this.removeClass(prefix); + _results = []; + for (_i = 0, _len = BOUNDS_FORMAT.length; _i < _len; _i++) { + side = BOUNDS_FORMAT[_i]; + _results.push(_this.removeClass("" + prefix + "-" + side)); + } + return _results; + }; + _ref1 = this.cache('element-bounds', function() { + return getBounds(_this.element); + }), height = _ref1.height, width = _ref1.width; + targetSize = this.cache('target-bounds', function() { + return _this.getTargetBounds(); + }); + targetHeight = targetSize.height; + targetWidth = targetSize.width; tAttachment = {}; eAttachment = {}; - this.removeClass('tether-pinned tether-out-of-bounds'); - for (_i = 0, _len = BOUNDS_FORMAT.length; _i < _len; _i++) { - side = BOUNDS_FORMAT[_i]; - this.removeClass("tether-pinned-" + side + " tether-out-of-bounds-" + side); + removeClasses = ['tether-pinned', 'tether-out-of-bounds']; + _ref2 = this.options.constraints; + for (_i = 0, _len = _ref2.length; _i < _len; _i++) { + constraint = _ref2[_i]; + if (constraint.outOfBoundsClass) { + removeClasses.push(constraint.outOfBoundsClass); + } + if (constraint.pinnedClass) { + removeClasses.push(constraint.pinnedClass); + } } - tAttachment = $.extend({}, targetAttachment); - eAttachment = $.extend({}, this.attachment); - _ref = this.options.constraints; - for (_j = 0, _len1 = _ref.length; _j < _len1; _j++) { - constraint = _ref[_j]; + for (_j = 0, _len1 = removeClasses.length; _j < _len1; _j++) { + cls = removeClasses[_j]; + removeClass(cls); + } + tAttachment = extend({}, targetAttachment); + eAttachment = extend({}, this.attachment); + _ref3 = this.options.constraints; + for (_k = 0, _len2 = _ref3.length; _k < _len2; _k++) { + constraint = _ref3[_k]; to = constraint.to, attachment = constraint.attachment, pin = constraint.pin; if (attachment == null) { attachment = ''; } if (__indexOf.call(attachment, ' ') >= 0) { - _ref1 = attachment.split(' '), changeAttachY = _ref1[0], changeAttachX = _ref1[1]; + _ref4 = attachment.split(' '), changeAttachY = _ref4[0], changeAttachX = _ref4[1]; } else { changeAttachX = changeAttachY = attachment; } - bounds = getBounds(this, to); + bounds = getBoundingRect(this, to); if (changeAttachY === 'target' || changeAttachY === 'both') { if (top < bounds[1] && tAttachment.top === 'top') { top += targetHeight; @@ -77,17 +106,31 @@ } } if (changeAttachY === 'together') { - if (top < bounds[1] && tAttachment.top === 'top' && eAttachment.top === 'bottom') { - top += targetHeight; - tAttachment.top = 'bottom'; - top += height; - eAttachment.top = 'top'; + if (top < bounds[1] && tAttachment.top === 'top') { + if (eAttachment.top === 'bottom') { + top += targetHeight; + tAttachment.top = 'bottom'; + top += height; + eAttachment.top = 'top'; + } else if (eAttachment.top === 'top') { + top += targetHeight; + tAttachment.top = 'bottom'; + top -= height; + eAttachment.top = 'bottom'; + } } - if (top + height > bounds[3] && tAttachment.top === 'bottom' && eAttachment.top === 'top') { - top -= targetHeight; - tAttachment.top = 'top'; - top -= height; - eAttachment.top = 'bottom'; + if (top + height > bounds[3] && tAttachment.top === 'bottom') { + if (eAttachment.top === 'top') { + top -= targetHeight; + tAttachment.top = 'top'; + top -= height; + eAttachment.top = 'bottom'; + } else if (eAttachment.top === 'bottom') { + top -= targetHeight; + tAttachment.top = 'top'; + top += height; + eAttachment.top = 'top'; + } } } if (changeAttachX === 'target' || changeAttachX === 'both') { @@ -101,17 +144,30 @@ } } if (changeAttachX === 'together') { - if (left < bounds[0] && tAttachment.left === 'left' && eAttachment.left === 'right') { - left += targetWidth; - tAttachment.left = 'right'; - left += width; - eAttachment.left = 'left'; - } - if (left + width > bounds[2] && tAttachment.left === 'right' && eAttachment.left === 'left') { - left -= targetWidth; - tAttachment.left = 'left'; - left -= width; - eAttachment.left = 'right'; + if (left < bounds[0] && tAttachment.left === 'left') { + if (eAttachment.left === 'right') { + left += targetWidth; + tAttachment.left = 'right'; + left += width; + eAttachment.left = 'left'; + } else if (eAttachment.left === 'left') { + left += targetWidth; + tAttachment.left = 'right'; + left -= width; + eAttachment.left = 'right'; + } + } else if (left + width > bounds[2] && tAttachment.left === 'right') { + if (eAttachment.left === 'left') { + left -= targetWidth; + tAttachment.left = 'left'; + left -= width; + eAttachment.left = 'right'; + } else if (eAttachment.left === 'right') { + left -= targetWidth; + tAttachment.left = 'left'; + left += width; + eAttachment.left = 'left'; + } } } if (changeAttachY === 'element' || changeAttachY === 'both') { @@ -136,11 +192,11 @@ } if (typeof pin === 'string') { pin = (function() { - var _k, _len2, _ref2, _results; - _ref2 = pin.split(','); + var _l, _len3, _ref5, _results; + _ref5 = pin.split(','); _results = []; - for (_k = 0, _len2 = _ref2.length; _k < _len2; _k++) { - p = _ref2[_k]; + for (_l = 0, _len3 = _ref5.length; _l < _len3; _l++) { + p = _ref5[_l]; _results.push(p.trim()); } return _results; @@ -184,17 +240,19 @@ } } if (pinned.length) { - this.addClass('tether-pinned'); - for (_k = 0, _len2 = pinned.length; _k < _len2; _k++) { - side = pinned[_k]; - this.addClass("tether-pinned-" + side); + pinnedClass = (_ref5 = this.options.pinnedClass) != null ? _ref5 : 'tether-pinned'; + this.addClass(pinnedClass); + for (_l = 0, _len3 = pinned.length; _l < _len3; _l++) { + side = pinned[_l]; + this.addClass("" + pinnedClass + "-" + side); } } if (oob.length) { - this.addClass('tether-out-of-bounds'); - for (_l = 0, _len3 = oob.length; _l < _len3; _l++) { - side = oob[_l]; - this.addClass("tether-out-of-bounds-" + side); + oobClass = (_ref6 = this.options.outOfBoundsClass) != null ? _ref6 : 'tether-out-of-bounds'; + this.addClass(oobClass); + for (_m = 0, _len4 = oob.length; _m < _len4; _m++) { + side = oob[_m]; + this.addClass("" + oobClass + "-" + side); } } if (__indexOf.call(pinned, 'left') >= 0 || __indexOf.call(pinned, 'right') >= 0) { diff --git a/css/drop-select-theme-default.css b/css/drop-select-theme-default.css deleted file mode 100644 index faec92d20..000000000 --- a/css/drop-select-theme-default.css +++ /dev/null @@ -1,116 +0,0 @@ -.drop.drop-select-theme-default .drop-content { - -webkit-border-radius: 0.25em; - -moz-border-radius: 0.25em; - -ms-border-radius: 0.25em; - -o-border-radius: 0.25em; - border-radius: 0.25em; - -webkit-box-shadow: 0 2px 8px rgba(0, 0, 0, 0.2); - -moz-box-shadow: 0 2px 8px rgba(0, 0, 0, 0.2); - box-shadow: 0 2px 8px rgba(0, 0, 0, 0.2); - background: white; - font-family: inherit; - color: inherit; - overflow: auto; - max-width: 400px; - max-height: 400px; } - @media (max-width: 576px), (max-height: 576px) { - .drop.drop-select-theme-default .drop-content { - max-width: 300px; - max-height: 300px; } } -.drop.drop-select-theme-default .drop-select-options { - -webkit-tap-highlight-color: rgba(0, 0, 0, 0); - -webkit-touch-callout: none; - margin: 0; - padding: 0; } - .drop.drop-select-theme-default .drop-select-options .drop-select-option { - -webkit-tap-highlight-color: rgba(0, 0, 0, 0); - -webkit-touch-callout: none; - position: relative; - list-style: none; - margin: 0; - line-height: 1.25em; - padding: 0.5em 1em 0.5em 2.5em; - display: block; - cursor: pointer; } - .drop.drop-select-theme-default .drop-select-options .drop-select-option[data-selected="true"]:before { - content: url("data:image/svg+xml;utf8,"); - position: absolute; - left: 1em; - top: 0; - bottom: 0.2em; - height: 1em; - width: 1em; - margin: auto; } - .drop.drop-select-theme-default .drop-select-options .drop-select-option:hover, .drop.drop-select-theme-default .drop-select-options .drop-select-option.drop-select-option-highlight { - background: #63a2f1; - color: white; } - .drop.drop-select-theme-default .drop-select-options .drop-select-option:hover[data-selected="true"]:before, .drop.drop-select-theme-default .drop-select-options .drop-select-option.drop-select-option-highlight[data-selected="true"]:before { - content: url("data:image/svg+xml;utf8,"); } - .drop.drop-select-theme-default .drop-select-options .drop-select-option:first-child { - -webkit-border-radius: 0.25em 0.25em 0 0; - -moz-border-radius: 0.25em 0.25em 0 0; - -ms-border-radius: 0.25em 0.25em 0 0; - -o-border-radius: 0.25em 0.25em 0 0; - border-radius: 0.25em 0.25em 0 0; } - .drop.drop-select-theme-default .drop-select-options .drop-select-option:last-child { - -webkit-border-radius: 0 0 0.25em 0.25em; - -moz-border-radius: 0 0 0.25em 0.25em; - -ms-border-radius: 0 0 0.25em 0.25em; - -o-border-radius: 0 0 0.25em 0.25em; - border-radius: 0 0 0.25em 0.25em; } - -.drop-select-target.drop-select-theme-default { - display: -moz-inline-stack; - display: inline-block; - vertical-align: middle; - *vertical-align: auto; - zoom: 1; - *display: inline; - -webkit-border-radius: 0.25em; - -moz-border-radius: 0.25em; - -ms-border-radius: 0.25em; - -o-border-radius: 0.25em; - border-radius: 0.25em; - -webkit-user-select: none; - -moz-user-select: none; - -ms-user-select: none; - -o-user-select: none; - user-select: none; - -webkit-tap-highlight-color: rgba(0, 0, 0, 0); - -webkit-touch-callout: none; - position: relative; - padding: 0.5em 3em 0.5em 1em; - background: #f6f6f6; - border: 0.18em solid #dddddd; - cursor: pointer; - color: #444444; - text-decoration: none; } - .drop-select-target.drop-select-theme-default:hover { - border-color: #aaaaaa; - color: black; } - .drop-select-target.drop-select-theme-default.drop-select-target-focused, .drop-select-target.drop-select-theme-default.drop-select-target-focused:focus { - border-color: #63a2f1; - outline: none; } - .drop-select-target.drop-select-theme-default b { - position: absolute; - right: 1em; - top: 0; - bottom: 0; - margin: auto; - height: 1.25em; - width: 2em; } - .drop-select-target.drop-select-theme-default b:before, .drop-select-target.drop-select-theme-default b:after { - content: ""; - display: block; - position: absolute; - margin: auto; - right: 0; - height: 0; - width: 0; - border: 0.263em solid transparent; } - .drop-select-target.drop-select-theme-default b:before { - top: 0; - border-bottom-color: inherit; } - .drop-select-target.drop-select-theme-default b:after { - bottom: 0; - border-top-color: inherit; } diff --git a/css/drop-theme-arrows.css b/css/drop-theme-arrows.css index 32dc255fc..41500a671 100644 --- a/css/drop-theme-arrows.css +++ b/css/drop-theme-arrows.css @@ -24,79 +24,79 @@ border-color: transparent; border-width: 16px; border-style: solid; } - .drop.drop-theme-arrows.tether-target-on-bottom.tether-target-on-center .drop-content { + .drop.drop-theme-arrows.tether-element-attached-bottom.tether-element-attached-center .drop-content { margin-bottom: 16px; } - .drop.drop-theme-arrows.tether-target-on-bottom.tether-target-on-center .drop-content:before { + .drop.drop-theme-arrows.tether-element-attached-bottom.tether-element-attached-center .drop-content:before { top: 100%; left: 50%; margin-left: -16px; border-top-color: white; } - .drop.drop-theme-arrows.tether-target-on-top.tether-target-on-center .drop-content { + .drop.drop-theme-arrows.tether-element-attached-top.tether-element-attached-center .drop-content { margin-top: 16px; } - .drop.drop-theme-arrows.tether-target-on-top.tether-target-on-center .drop-content:before { + .drop.drop-theme-arrows.tether-element-attached-top.tether-element-attached-center .drop-content:before { bottom: 100%; left: 50%; margin-left: -16px; border-bottom-color: white; } - .drop.drop-theme-arrows.tether-target-on-right.tether-target-on-middle .drop-content { + .drop.drop-theme-arrows.tether-element-attached-right.tether-element-attached-middle .drop-content { margin-right: 16px; } - .drop.drop-theme-arrows.tether-target-on-right.tether-target-on-middle .drop-content:before { + .drop.drop-theme-arrows.tether-element-attached-right.tether-element-attached-middle .drop-content:before { left: 100%; top: 50%; margin-top: -16px; border-left-color: white; } - .drop.drop-theme-arrows.tether-target-on-left.tether-target-on-middle .drop-content { + .drop.drop-theme-arrows.tether-element-attached-left.tether-element-attached-middle .drop-content { margin-left: 16px; } - .drop.drop-theme-arrows.tether-target-on-left.tether-target-on-middle .drop-content:before { + .drop.drop-theme-arrows.tether-element-attached-left.tether-element-attached-middle .drop-content:before { right: 100%; top: 50%; margin-top: -16px; border-right-color: white; } - .drop.drop-theme-arrows.tether-target-on-top.tether-target-on-left.tether-element-on-bottom .drop-content { + .drop.drop-theme-arrows.tether-element-attached-top.tether-element-attached-left.tether-target-attached-bottom .drop-content { margin-top: 16px; } - .drop.drop-theme-arrows.tether-target-on-top.tether-target-on-left.tether-element-on-bottom .drop-content:before { + .drop.drop-theme-arrows.tether-element-attached-top.tether-element-attached-left.tether-target-attached-bottom .drop-content:before { bottom: 100%; left: 16px; border-bottom-color: white; } - .drop.drop-theme-arrows.tether-target-on-top.tether-target-on-right.tether-element-on-bottom .drop-content { + .drop.drop-theme-arrows.tether-element-attached-top.tether-element-attached-right.tether-target-attached-bottom .drop-content { margin-top: 16px; } - .drop.drop-theme-arrows.tether-target-on-top.tether-target-on-right.tether-element-on-bottom .drop-content:before { + .drop.drop-theme-arrows.tether-element-attached-top.tether-element-attached-right.tether-target-attached-bottom .drop-content:before { bottom: 100%; right: 16px; border-bottom-color: white; } - .drop.drop-theme-arrows.tether-target-on-bottom.tether-target-on-left.tether-element-on-top .drop-content { + .drop.drop-theme-arrows.tether-element-attached-bottom.tether-element-attached-left.tether-target-attached-top .drop-content { margin-bottom: 16px; } - .drop.drop-theme-arrows.tether-target-on-bottom.tether-target-on-left.tether-element-on-top .drop-content:before { + .drop.drop-theme-arrows.tether-element-attached-bottom.tether-element-attached-left.tether-target-attached-top .drop-content:before { top: 100%; left: 16px; border-top-color: white; } - .drop.drop-theme-arrows.tether-target-on-bottom.tether-target-on-right.tether-element-on-top .drop-content { + .drop.drop-theme-arrows.tether-element-attached-bottom.tether-element-attached-right.tether-target-attached-top .drop-content { margin-bottom: 16px; } - .drop.drop-theme-arrows.tether-target-on-bottom.tether-target-on-right.tether-element-on-top .drop-content:before { + .drop.drop-theme-arrows.tether-element-attached-bottom.tether-element-attached-right.tether-target-attached-top .drop-content:before { top: 100%; right: 16px; border-top-color: white; } - .drop.drop-theme-arrows.tether-target-on-top.tether-target-on-right.tether-element-on-left .drop-content { + .drop.drop-theme-arrows.tether-element-attached-top.tether-element-attached-right.tether-target-attached-left .drop-content { margin-right: 16px; } - .drop.drop-theme-arrows.tether-target-on-top.tether-target-on-right.tether-element-on-left .drop-content:before { + .drop.drop-theme-arrows.tether-element-attached-top.tether-element-attached-right.tether-target-attached-left .drop-content:before { top: 16px; left: 100%; border-left-color: white; } - .drop.drop-theme-arrows.tether-target-on-top.tether-target-on-left.tether-element-on-right .drop-content { + .drop.drop-theme-arrows.tether-element-attached-top.tether-element-attached-left.tether-target-attached-right .drop-content { margin-left: 16px; } - .drop.drop-theme-arrows.tether-target-on-top.tether-target-on-left.tether-element-on-right .drop-content:before { + .drop.drop-theme-arrows.tether-element-attached-top.tether-element-attached-left.tether-target-attached-right .drop-content:before { top: 16px; right: 100%; border-right-color: white; } - .drop.drop-theme-arrows.tether-target-on-bottom.tether-target-on-right.tether-element-on-left .drop-content { + .drop.drop-theme-arrows.tether-element-attached-bottom.tether-element-attached-right.tether-target-attached-left .drop-content { margin-right: 16px; } - .drop.drop-theme-arrows.tether-target-on-bottom.tether-target-on-right.tether-element-on-left .drop-content:before { + .drop.drop-theme-arrows.tether-element-attached-bottom.tether-element-attached-right.tether-target-attached-left .drop-content:before { bottom: 16px; left: 100%; border-left-color: white; } - .drop.drop-theme-arrows.tether-target-on-bottom.tether-target-on-left.tether-element-on-right .drop-content { + .drop.drop-theme-arrows.tether-element-attached-bottom.tether-element-attached-left.tether-target-attached-right .drop-content { margin-left: 16px; } - .drop.drop-theme-arrows.tether-target-on-bottom.tether-target-on-left.tether-element-on-right .drop-content:before { + .drop.drop-theme-arrows.tether-element-attached-bottom.tether-element-attached-left.tether-target-attached-right .drop-content:before { bottom: 16px; right: 100%; border-right-color: white; } diff --git a/css/drop-tooltip-theme-arrows.css b/css/drop-tooltip-theme-arrows.css index 480ef9ca6..c103c42df 100644 --- a/css/drop-tooltip-theme-arrows.css +++ b/css/drop-tooltip-theme-arrows.css @@ -26,79 +26,79 @@ border-color: transparent; border-width: 0.5em; border-style: solid; } - .drop.drop-tooltip-theme-arrows.tether-target-on-bottom.tether-target-on-center .drop-content { + .drop.drop-tooltip-theme-arrows.tether-element-attached-bottom.tether-element-attached-center .drop-content { margin-bottom: 0.5em; } - .drop.drop-tooltip-theme-arrows.tether-target-on-bottom.tether-target-on-center .drop-content:before { + .drop.drop-tooltip-theme-arrows.tether-element-attached-bottom.tether-element-attached-center .drop-content:before { top: 100%; left: 50%; margin-left: -0.5em; border-top-color: black; } - .drop.drop-tooltip-theme-arrows.tether-target-on-top.tether-target-on-center .drop-content { + .drop.drop-tooltip-theme-arrows.tether-element-attached-top.tether-element-attached-center .drop-content { margin-top: 0.5em; } - .drop.drop-tooltip-theme-arrows.tether-target-on-top.tether-target-on-center .drop-content:before { + .drop.drop-tooltip-theme-arrows.tether-element-attached-top.tether-element-attached-center .drop-content:before { bottom: 100%; left: 50%; margin-left: -0.5em; border-bottom-color: black; } - .drop.drop-tooltip-theme-arrows.tether-target-on-right.tether-target-on-middle .drop-content { + .drop.drop-tooltip-theme-arrows.tether-element-attached-right.tether-element-attached-middle .drop-content { margin-right: 0.5em; } - .drop.drop-tooltip-theme-arrows.tether-target-on-right.tether-target-on-middle .drop-content:before { + .drop.drop-tooltip-theme-arrows.tether-element-attached-right.tether-element-attached-middle .drop-content:before { left: 100%; top: 50%; margin-top: -0.5em; border-left-color: black; } - .drop.drop-tooltip-theme-arrows.tether-target-on-left.tether-target-on-middle .drop-content { + .drop.drop-tooltip-theme-arrows.tether-element-attached-left.tether-element-attached-middle .drop-content { margin-left: 0.5em; } - .drop.drop-tooltip-theme-arrows.tether-target-on-left.tether-target-on-middle .drop-content:before { + .drop.drop-tooltip-theme-arrows.tether-element-attached-left.tether-element-attached-middle .drop-content:before { right: 100%; top: 50%; margin-top: -0.5em; border-right-color: black; } - .drop.drop-tooltip-theme-arrows.tether-target-on-top.tether-target-on-left.tether-element-on-bottom .drop-content { + .drop.drop-tooltip-theme-arrows.tether-element-attached-top.tether-element-attached-left.tether-target-attached-bottom .drop-content { margin-top: 0.5em; } - .drop.drop-tooltip-theme-arrows.tether-target-on-top.tether-target-on-left.tether-element-on-bottom .drop-content:before { + .drop.drop-tooltip-theme-arrows.tether-element-attached-top.tether-element-attached-left.tether-target-attached-bottom .drop-content:before { bottom: 100%; left: 0.5em; border-bottom-color: black; } - .drop.drop-tooltip-theme-arrows.tether-target-on-top.tether-target-on-right.tether-element-on-bottom .drop-content { + .drop.drop-tooltip-theme-arrows.tether-element-attached-top.tether-element-attached-right.tether-target-attached-bottom .drop-content { margin-top: 0.5em; } - .drop.drop-tooltip-theme-arrows.tether-target-on-top.tether-target-on-right.tether-element-on-bottom .drop-content:before { + .drop.drop-tooltip-theme-arrows.tether-element-attached-top.tether-element-attached-right.tether-target-attached-bottom .drop-content:before { bottom: 100%; right: 0.5em; border-bottom-color: black; } - .drop.drop-tooltip-theme-arrows.tether-target-on-bottom.tether-target-on-left.tether-element-on-top .drop-content { + .drop.drop-tooltip-theme-arrows.tether-element-attached-bottom.tether-element-attached-left.tether-target-attached-top .drop-content { margin-bottom: 0.5em; } - .drop.drop-tooltip-theme-arrows.tether-target-on-bottom.tether-target-on-left.tether-element-on-top .drop-content:before { + .drop.drop-tooltip-theme-arrows.tether-element-attached-bottom.tether-element-attached-left.tether-target-attached-top .drop-content:before { top: 100%; left: 0.5em; border-top-color: black; } - .drop.drop-tooltip-theme-arrows.tether-target-on-bottom.tether-target-on-right.tether-element-on-top .drop-content { + .drop.drop-tooltip-theme-arrows.tether-element-attached-bottom.tether-element-attached-right.tether-target-attached-top .drop-content { margin-bottom: 0.5em; } - .drop.drop-tooltip-theme-arrows.tether-target-on-bottom.tether-target-on-right.tether-element-on-top .drop-content:before { + .drop.drop-tooltip-theme-arrows.tether-element-attached-bottom.tether-element-attached-right.tether-target-attached-top .drop-content:before { top: 100%; right: 0.5em; border-top-color: black; } - .drop.drop-tooltip-theme-arrows.tether-target-on-top.tether-target-on-right.tether-element-on-left .drop-content { + .drop.drop-tooltip-theme-arrows.tether-element-attached-top.tether-element-attached-right.tether-target-attached-left .drop-content { margin-right: 0.5em; } - .drop.drop-tooltip-theme-arrows.tether-target-on-top.tether-target-on-right.tether-element-on-left .drop-content:before { + .drop.drop-tooltip-theme-arrows.tether-element-attached-top.tether-element-attached-right.tether-target-attached-left .drop-content:before { top: 0.5em; left: 100%; border-left-color: black; } - .drop.drop-tooltip-theme-arrows.tether-target-on-top.tether-target-on-left.tether-element-on-right .drop-content { + .drop.drop-tooltip-theme-arrows.tether-element-attached-top.tether-element-attached-left.tether-target-attached-right .drop-content { margin-left: 0.5em; } - .drop.drop-tooltip-theme-arrows.tether-target-on-top.tether-target-on-left.tether-element-on-right .drop-content:before { + .drop.drop-tooltip-theme-arrows.tether-element-attached-top.tether-element-attached-left.tether-target-attached-right .drop-content:before { top: 0.5em; right: 100%; border-right-color: black; } - .drop.drop-tooltip-theme-arrows.tether-target-on-bottom.tether-target-on-right.tether-element-on-left .drop-content { + .drop.drop-tooltip-theme-arrows.tether-element-attached-bottom.tether-element-attached-right.tether-target-attached-left .drop-content { margin-right: 0.5em; } - .drop.drop-tooltip-theme-arrows.tether-target-on-bottom.tether-target-on-right.tether-element-on-left .drop-content:before { + .drop.drop-tooltip-theme-arrows.tether-element-attached-bottom.tether-element-attached-right.tether-target-attached-left .drop-content:before { bottom: 0.5em; left: 100%; border-left-color: black; } - .drop.drop-tooltip-theme-arrows.tether-target-on-bottom.tether-target-on-left.tether-element-on-right .drop-content { + .drop.drop-tooltip-theme-arrows.tether-element-attached-bottom.tether-element-attached-left.tether-target-attached-right .drop-content { margin-left: 0.5em; } - .drop.drop-tooltip-theme-arrows.tether-target-on-bottom.tether-target-on-left.tether-element-on-right .drop-content:before { + .drop.drop-tooltip-theme-arrows.tether-element-attached-bottom.tether-element-attached-left.tether-target-attached-right .drop-content:before { bottom: 0.5em; right: 100%; border-right-color: black; } diff --git a/docs/css/intro.css b/docs/css/intro.css new file mode 100644 index 000000000..9ad0cf482 --- /dev/null +++ b/docs/css/intro.css @@ -0,0 +1,156 @@ +@charset "UTF-8"; +* { + box-sizing: border-box; } + +body { + position: relative; } + +.yellow-box { + width: 100px; + height: 100px; + background-color: #ffee88; + pointer-events: none; } + +.green-box { + margin-top: 65px; + margin-left: 100px; + width: 200px; + height: 50px; + background-color: #44ee99; } + +.scroll-box { + height: 150px; + border: 10px solid #eeeeee; + background: #fbfbfb; + overflow: auto; + position: relative; } + +.scroll-content { + height: 2000px; + width: 2000px; + padding: 910px 809px; } + +pre { + margin: 0; + width: 50%; + float: left; } + pre code mark { + background: #b8daff; + color: black; } + +p, h2, h3 { + clear: both; } + +output { + display: block; + position: relative; + width: 50%; + float: right; + margin-bottom: 15px; } + output:after { + content: "↕ scroll this area ↕"; + position: absolute; + bottom: 10px; + width: 100%; + text-align: center; + font-size: 16px; + font-variant: small-caps; + color: #777777; + opacity: 1; + transition: opacity 0.2s; } + output.scrolled:after { + opacity: 0; } + +.attachment-mark, .tether-marker-dot { + position: relative; } + .attachment-mark:after, .tether-marker-dot:after { + content: "A"; + width: 10px; + height: 10px; + background-color: red; + display: inline-block; + line-height: 10px; + font-size: 9px; + color: white; + text-align: center; + position: absolute; } + +span.attachment-mark:after, span.tether-marker-dot:after { + position: relative; + top: -1px; + margin-right: 1px; } + +.tether-marker-dot { + position: absolute; } + .tether-marker-dot:after { + top: -5px; + left: -5px; } + +.tether-target-marker { + position: absolute; } + .tether-target-attached-left .tether-target-marker { + left: 0; } + .tether-target-attached-top .tether-target-marker { + top: 0; } + .tether-target-attached-bottom .tether-target-marker { + bottom: 0; } + .tether-target-attached-right .tether-target-marker { + right: 0; } + .tether-target-attached-center .tether-target-marker { + left: 50%; } + +.tether-element-marker { + position: absolute; } + .tether-element-attached-left .tether-element-marker { + left: 0; } + .tether-element-attached-top .tether-element-marker { + top: 0; } + .tether-element-attached-bottom .tether-element-marker { + bottom: 0; } + .tether-element-attached-right .tether-element-marker { + right: 0; } + .tether-element-attached-center .tether-element-marker { + left: 50%; } + +.tether-element-attached-middle .tether-element-marker { + top: 50px; } + +.tether-target-attached-middle .tether-target-marker { + top: 25px; } + +.tether-element { + position: relative; } + .tether-element.tether-pinned-left { + box-shadow: inset 2px 0 0 0 red; } + .tether-element.tether-pinned-right { + box-shadow: inset -2px 0 0 0 red; } + .tether-element.tether-pinned-top { + box-shadow: inset 0 2px 0 0 red; } + .tether-element.tether-pinned-bottom { + box-shadow: inset 0 -2px 0 0 red; } + +.tether-target { + position: relative; } + +.tether-element.tether-out-of-bounds[data-example="hide"] { + display: none; } + +[data-example^="optimizer"].lang-javascript { + /* This should just be a `code` selector, but sass doesn't allow that with & */ + min-height: 220px; } +[data-example^="optimizer"].tether-element:before { + margin-top: 26px; + display: block; + text-align: center; + content: "I'm in the body"; + line-height: 1.2; + font-size: 15px; + padding: 4px; + color: #666666; } +[data-example^="optimizer"] .scroll-box .tether-element:before { + content: "I'm in my scroll parent!"; } + +output[data-example="window"] .scroll-box { + overflow: hidden; } +output[data-example="window"]:after { + content: "↕ scroll the page ↕"; } diff --git a/docs/intro.html b/docs/intro.html new file mode 100644 index 000000000..58ea74dcc --- /dev/null +++ b/docs/intro.html @@ -0,0 +1,421 @@ +tether +

+

+

+

+

+ + +

Tether

+

Tether is a javascript library for efficiently making an absolutely positioned +element stay next to another element on the page. For example, you might +want a tooltip or dialog to open, and remain, next to the relevant item +on the page.

+

Tether includes the ability to constrain the element within the viewport, it's +scroll parent, any other element on the page, or a fixed bounding box. When it +exceedes those constraints it can be pinned to the edge, flip to the other +side of it's target, or hide itself.

+

Tether optimizes it's location placement to result in the minimum amount of +'jankyness' as the page is scrolled and resized.

+

Usage

+

The element to be moved is called the 'element'. +The element in the page it's to be attached to is called the 'target'.

+

To use Tether, you define a point on the target and a point on the element. +Tether moves the element to keep those two points on top of each other.

+

That point is called the attachment (we've marked it in the examples with +a red ). For example, if you'd like +the element to sit on the left of the target:

+

new Tether({
+  element: yellowBox,
+  target: greenBox,
+  attachment: 'top right',
+  targetAttachment: 'top left'
+});
+

+

Attachment

+

You can move the attachment points of both the element and the target.

+

For example, lets move the element's attachment:

+

new Tether({
+  element: yellowBox,
+  target: greenBox,
+  attachment: 'bottom left',
+  targetAttachment: 'top left'
+});
+

+

We can also change the target's attachment point:

+

new Tether({
+  element: yellowBox,
+  target: greenBox,
+  attachment: 'bottom left',
+  targetAttachment: 'bottom right'
+});
+

+

There are two more attachment points we haven't seen yet, center and middle:

+

new Tether({
+  element: yellowBox,
+  target: greenBox,
+  attachment: 'middle center',
+  targetAttachment: 'middle center'
+});
+

+

All told, Tether provides six built in attachment positions:

+
    +
  • left
  • +
  • center
  • +
  • right
  • +
  • top
  • +
  • middle
  • +
  • bottom
  • +
+

The syntax of the attachment properties is: "vertical-attachment horizontal-attachment"

+

You must always supply an attachment. If you don't supply a target-attachment, it is +assumed to be the mirror image of attachment.

+

Offset

+

The six attachment points we provide are not always enough to place the element +exactly where you want it. To correct this, we provide two more properties, +offset and targetOffset.

+

new Tether({
+  element: yellowBox,
+  target: greenBox,
+  attachment: 'top right',
+  targetAttachment: 'top left',
+  offset: '0 10px'
+});
+

+

As you can see, we've moved the attachment point of the element 10px to the right. +We can also move the attachment point of the target:

+

new Tether({
+  element: yellowBox,
+  target: greenBox,
+  attachment: 'top right',
+  targetAttachment: 'top left',
+  offset: '0 10px',
+  targetOffset: '20px 0'
+});
+

+

The offset properties also accept percentages. Percentages in offset refer to +the height and width of the element, targetOffset the height and width of +the target.

+

new Tether({
+  element: yellowBox,
+  target: greenBox,
+  attachment: 'top right',
+  targetAttachment: 'top left',
+  targetOffset: '0 75%'
+});
+

+

The syntax of the offset properties is "vertical-offset horizontal-offset"

+

Constraints

+

If you have tried any of the previous examples, you'll notice that it's pretty +easy to scroll the regions in such a way that the element is hanging out on +it's own, with no target in sight.

+

Constraints allow you to control what happens when the tethered element would +have to fall outside of a defined region to maintain the attachment.

+

new Tether({
+  element: yellowBox,
+  target: greenBox,
+  attachment: 'middle left',
+  targetAttachment: 'middle left',
+  constraints: [
+    {
+      to: 'scrollParent',
+      pin: true
+    }
+  ]
+});
+

+

We've created a constraint which will keep the element within it's scroll +parent by 'pinning' it to the edges if it tries to escape. For the sake +of the example, we're also highlighting the pinned edge in red.

+

Specify an array of sides if you'd only like to pin those edges:

+

new Tether({
+  element: yellowBox,
+  target: greenBox,
+  attachment: 'middle left',
+  targetAttachment: 'middle left',
+  constraints: [
+    {
+      to: 'scrollParent',
+      pin: ['top']
+    }
+  ]
+});
+

+

You might want to allow the element to change it's attachment, if doing so +would keep more of it within it's assigned region:

+

new Tether({
+  element: yellowBox,
+  target: greenBox,
+  attachment: 'top left',
+  targetAttachment: 'bottom left',
+  constraints: [
+    {
+      to: 'scrollParent',
+      attachment: 'together'
+    }
+  ]
+});
+

+

If you scroll the example a bit, you'll see it flip the attachment when necessary. +You can combine pin and attachment as well:

+

new Tether({
+  element: yellowBox,
+  target: greenBox,
+  attachment: 'top left',
+  targetAttachment: 'bottom left',
+  constraints: [
+    {
+      to: 'scrollParent',
+      attachment: 'together',
+      pin: true
+    }
+  ]
+});
+

+

Attachment will accept any of these values:

+
    +
  • element: Only change the element's attachment
  • +
  • target: Only change the target's attachment
  • +
  • both: Change either's attachment (or both), as needed
  • +
  • together: Change both the element's and target's attachment at the same time (to +'flip' the element to the other side of the attachment)
  • +
  • none: Don't allow changes to attachment (the default)
  • +
+

Together is the option you will use most commonly:

+

new Tether({
+  element: yellowBox,
+  target: greenBox,
+  attachment: 'top right',
+  targetAttachment: 'bottom left',
+  constraints: [
+    {
+      to: 'scrollParent',
+      attachment: 'together'
+    }
+  ]
+});
+

+

You can also provide different settings for the horizontal +and vertical attachments:

+

new Tether({
+  element: yellowBox,
+  target: greenBox,
+  attachment: 'top left',
+  targetAttachment: 'bottom left',
+  constraints: [
+    {
+      to: 'scrollParent',
+      attachment: 'together none'
+    }
+  ]
+});
+

+

Whenever the element is out of the constrained area, we add the tether-out-of-bounds +class to it. If you add some CSS to make items with that class display: none, the +tether will hide.

+

new Tether({
+  element: yellowBox,
+  target: greenBox,
+  attachment: 'middle center',
+  targetAttachment: 'middle center',
+  constraints: [
+    {
+      to: 'scrollParent'
+    }
+  ]
+});
+

+

You can also constrain the element to the viewport, you'll have to scroll the +page to see this one. You can, of course, use pin with the window as well to +make it always visible no matter where the user scrolls.

+

new Tether({
+  element: yellowBox,
+  target: greenBox,
+  attachment: 'top left',
+  targetAttachment: 'bottom left',
+  constraints: [
+    {
+      to: 'window',
+      attachment: 'together'
+    }
+  ]
+});
+

+

to can be any of:

+
    +
  • 'scrollParent'
  • +
  • 'window'
  • +
  • any DOM element
  • +
  • an array of bound points relative to the body [X1, Y1, X2, Y2]
  • +
+

You can also provide multiple constraints, keeping in mind that they are +processed in the order supplied (the last one always has the final word).

+

new Tether({
+  element: yellowBox,
+  target: greenBox,
+  attachment: 'top left',
+  targetAttachment: 'bottom left',
+  constraints: [
+    {
+      to: 'scrollParent',
+      pin: true
+    },
+    {
+      to: 'window',
+      attachment: 'together'
+    }
+  ]
+});
+

+

Optimization

+

The goal of Tether's optimizer is to not have to change the positioning +CSS as the page is scrolled or resized. To accomplish this it looks at the +last few positions, finds commonalities, and uses them to decide whether to +position the element absolutely or with fixed positioning.

+

If the element is fully contained within it's scroll parent, its DOM node +can also be moved inside the scroll parent, to avoid repaints as the +container is scrolled.

+

new Tether({
+  element: yellowBox,
+  target: greenBox,
+  attachment: 'top left',
+  targetAttachment: 'bottom left'
+});
+

+

We are moving where the DOM node is, so if you have CSS which styles elements +within the offset parent, you may see some rendering changes. Also note +that this optimization works best if the scroll parent is the offset parent. +In other words, the scroll parent should be made position relative, fixed or +absolute to enable this optimization.

+

If you do see stylistic changes occur when the element is moved, +you might want to disable this optimization. You can do that by +setting optimizations.moveElement to false.

+

new Tether({
+  element: yellowBox,
+  target: greenBox,
+  attachment: 'top left',
+  targetAttachment: 'bottom left',
+  optimizations: {
+    moveElement: false
+  }
+});
+

+

Methods

+

The Tether constructor we've been using in these examples returns us a +Tether object.

+

The Tether object has these methods:

+
    +
  • setOptions({ options }) - Update any of the options (such as attachment)
  • +
  • disable() - Disable the tethering
  • +
  • enable() - Enable the tethering
  • +
  • destroy() - Disable and remove all references
  • +
  • position() - Manually trigger a repositioning
  • +
+

Options

+

The full list of options which can be passed to the Tether constructor and +setOptions:

+
    +
  • element: A DOM or jQuery element
  • +
  • target: A DOM or jQuery element
  • +
  • attachment: A string of the form 'vert-attachment horiz-attachment'
      +
    • vert-attachment can be any of 'top', 'middle', 'bottom'
    • +
    • horiz-attachment can be any of 'left', 'center', 'right'
    • +
    +
  • +
  • targetAttachment: A string similar to attachment. +The one difference is that, if it's not provided, targetAttachment will assume the mirror +image of attachment.
  • +
  • offset: A string of the form 'vert-offset horiz-offset'
      +
    • vert-offset and horiz-offset can be of the form "20px" or "55%"
    • +
    +
  • +
  • targetOffset: A string similar to offset
  • +
  • enabled: Should the tether be enabled initially? Defaults to true.
  • +
  • constraints: An array of constraint definition objects. Each definition is of the form:
      +
    • to: A DOM element, bounding box, the string 'window', or the string 'scrollParent'
    • +
    • pin: true or an array of strings representing the sides of the constraint
    • +
    • attachment: A string of the form "vert-modifier horiz-modifier", or a single value +representing both
        +
      • Each modifier should be one of "none", "together", "element", "target", or "both".
      • +
      +
    • +
    • outOfBoundsClass: An alternative to "tether-out-of-bounds", useful if the class +needs to be differentiated from that of another constraint.
    • +
    • pinnedClass: An alternative to "tether-pinned", similar to outOfBoundsClass.
    • +
    +
  • +
+

Classes

+

// Make classes mutable

+

Tether adds a variety of classes to the element and target to allow you to style +them based on their tethering.

+
    +
  • tether-element is added to the element
  • +
  • tether-target is added to the target
  • +
  • tether-enabled is added to both elements when tether is not disabled
  • +
  • tether-element-attached-[left,right,top,bottom,middle,center] is added to both +elements based on the elements attachment, if the element becomes detached (for +example, if it's pinned), that class is removed. The class reflects how the +element is actually attached, so if a constraint changes the attachment, that +change will be reflected in the class.
  • +
  • tether-target-attached-[left,right,top,bottom,middle,center] is added to both +elements based on the target's attachment. All of the characteristics are the +same as for element-attached.
  • +
+

Constraint-related Classes

+
    +
  • tether-out-of-bounds, tether-out-of-bounds-[side] are added to both the element and the target +when the element is placed outside of it's constraint.
  • +
  • tether-pinned, tether-pinned-[side] are added to both the element and target when a constraint +has pinned the element to the [side] of the container.
  • +
+
+ + + + + \ No newline at end of file diff --git a/docs/js/intro.js b/docs/js/intro.js new file mode 100644 index 000000000..3c27236ac --- /dev/null +++ b/docs/js/intro.js @@ -0,0 +1,71 @@ +(function() { + var OUTPUT_HTML, SETUP_JS, getOutput, init, run, setupBlock; + + SETUP_JS = "yellowBox = $('.yellow-box', $output);\ngreenBox = $('.green-box', $output);"; + + OUTPUT_HTML = function(key) { + return "
\n
\n
\n
\n
\n
"; + }; + + getOutput = function($block) { + var key; + key = $block.data('example'); + if (key && typeof key === 'string') { + return $("output[data-example='" + key + "']"); + } else { + return $block.parents('pre').nextAll('output').first(); + } + }; + + run = function(key) { + var $block, $output, code; + if (typeof key === 'string') { + $block = $("code[data-example='" + key + "']"); + } else { + $block = key; + } + $output = getOutput($block); + code = $block.text(); + if (code.indexOf(SETUP_JS) === -1) { + code = SETUP_JS + code; + } + window.$output = $output; + return eval(code); + }; + + setupBlock = function($block) { + var $output, $scrollBox, $scrollContent, key; + key = $block.data('example'); + $output = getOutput($block); + $output.html(OUTPUT_HTML(key)); + $scrollBox = $output.find('.scroll-box'); + $scrollContent = $scrollBox.find('.scroll-content'); + $scrollBox.scrollTop(parseInt($scrollContent.css('height')) / 2 - $scrollBox.height() / 2); + $scrollBox.scrollLeft(parseInt($scrollContent.css('width')) / 2 - $scrollBox.width() / 2); + setTimeout(function() { + return $scrollBox.on('scroll', function() { + return $output.addClass('scrolled'); + }); + }); + $scrollBox.css('height', "" + ($block.parent().outerHeight()) + "px"); + return run($block); + }; + + init = function() { + var $blocks, block, _i, _len, _results; + $blocks = $('code[data-example]'); + _results = []; + for (_i = 0, _len = $blocks.length; _i < _len; _i++) { + block = $blocks[_i]; + _results.push(setupBlock($(block))); + } + return _results; + }; + + window.EXECUTR_OPTIONS = { + codeSelector: 'code[executable]' + }; + + $(init); + +}).call(this); diff --git a/docs/welcome/browser-demo.html b/docs/welcome/browser-demo.html index 9361cbdf9..634d9f4f0 100644 --- a/docs/welcome/browser-demo.html +++ b/docs/welcome/browser-demo.html @@ -70,7 +70,7 @@ - + \ No newline at end of file diff --git a/docs/welcome/coffee/welcome.coffee b/docs/welcome/coffee/welcome.coffee index 1cb82e924..00733044d 100644 --- a/docs/welcome/coffee/welcome.coffee +++ b/docs/welcome/coffee/welcome.coffee @@ -10,12 +10,16 @@ setupHero = -> positions = [ 'top left' 'left top' + 'left middle' 'left bottom' 'bottom left' + 'bottom center' 'bottom right' 'right bottom' + 'right middle' 'right top' 'top right' + 'top center' ] if isMobile @@ -31,11 +35,11 @@ setupHero = -> for position in positions drops[position] = new Drop target: $target[0] - className: 'drop-theme-arrows' + className: 'drop-tooltip-theme-arrows' attach: position constrainToScrollParent: true openOn: '' - content: $.map(position.split(' '), (word) -> word.substr(0, 1).toUpperCase() + word.substr(1)).join(' ') + content: '
' # TODO - remove once zackbloom fixes drops[position].$drop.addClass "drop-attached-#{ position.replace(' ', '-')}" @@ -53,16 +57,24 @@ setupHero = -> drop.close() drops[positions[openIndex]].open() + drops[positions[(openIndex + 6) % positions.length]].open() openIndex = (openIndex + 1) % positions.length - if frames > 20 - return openAllDrops() + if frames > 5 + finalDropState() + return frames += 1 setTimeout openNextDrop, frameLengthMS * frames + finalDropState = -> + drops['top left'].$dropContent.html('Marrying DOM elements for life.') + drops['bottom right'].$dropContent.html('★ On Github') + drops['top left'].open() + drops['bottom right'].open() + if isMobile drops['top left'].open() drops['bottom right'].open() @@ -127,13 +139,23 @@ setupBrowserDemo = -> attach: 'right top' constrainToWindow: true openOn: 'click' - content: '
' + content: ''' + + ''' $item.data('drop', drop) # TODO - remove once zackbloom fixes drop.$drop.addClass "drop-attached-right-top" + scrollInterval = undefined + scrollTop = 0 + scrollTopDirection = 1 + setSection = (section) -> $browserDemo.attr('data-section', section) @@ -149,22 +171,41 @@ setupBrowserDemo = -> closeAllItems = -> $iframe.contents().find('.item').each -> $(@).data().drop.close() or true + scrollLeftSection = -> + scrollInterval = setInterval -> + $iframe.contents().find('.left').scrollTop scrollTop + scrollTop += scrollTopDirection + if scrollTop > 50 + scrollTopDirection = -1 + if scrollTop < 0 + scrollTopDirection = 1 + , 30 + + stopScrollingLeftSection = -> + clearInterval scrollInterval + switch section - when 'intro' + when 'what' closeAllItems() openExampleItem() + stopScrollingLeftSection() - when 'explain' + when 'how' closeAllItems() openExampleItem() + stopScrollingLeftSection() + scrollLeftSection() - when 'resize' + when 'why' closeAllItems() openExampleItem() + stopScrollingLeftSection() + scrollLeftSection() when 'outro' closeAllItems() openExampleItem() + stopScrollingLeftSection() -init() \ No newline at end of file +init() diff --git a/docs/welcome/css/browser-demo.css b/docs/welcome/css/browser-demo.css index ed3afe936..52278ce53 100644 --- a/docs/welcome/css/browser-demo.css +++ b/docs/welcome/css/browser-demo.css @@ -1,6 +1,19 @@ html, body { height: 100%; - overflow: hidden; } + overflow: hidden; + font-family: "proxima-nova", sans-serif; } + +.drop.drop-theme-arrows .drop-content { + background: black; + -webkit-filter: none; } + .drop.drop-theme-arrows .drop-content ul { + color: white; + list-style: none; + padding: 0; + margin: 0; } + +.drop.drop-theme-arrows.tether-element-attached-top.tether-element-attached-left.tether-target-attached-right .drop-content:before { + border-right-color: black; } .browser-demo { position: absolute; @@ -74,7 +87,3 @@ html, body { width: 14px; } .browser-demo .word:nth-last-child(9n+1) { width: 80px; } - -.drop-demo-spacer { - height: 100px; - width: 100px; } diff --git a/docs/welcome/css/welcome.css b/docs/welcome/css/welcome.css index f613b7b73..edf018c9f 100644 --- a/docs/welcome/css/welcome.css +++ b/docs/welcome/css/welcome.css @@ -5,9 +5,6 @@ body { margin: 0; font-family: "proxima-nova", "Helvetica Neue", sans-serif; } -.drop.drop-theme-arrows .drop-content { - font-family: inherit; } - .button { display: inline-block; border: 2px solid #333333; @@ -22,6 +19,21 @@ body { font-size: 0.8em; line-height: 1.3em; } +.drop.drop-tooltip-theme-arrows .drop-content { + padding: 1em; + font-size: 1.1em; } + .drop.drop-tooltip-theme-arrows .drop-content .button { + border-color: white; + color: white; + width: 170px; + pointer-events: all; } + +.mobile-copy { + display: none; } + @media (max-width: 568px) { + .mobile-copy { + display: block; } } + .button.dark { background: #333333; color: white; } @@ -81,10 +93,33 @@ table.showcase { *display: inline; border: 2px dotted black; margin: 5rem auto; - padding: 3rem; } + padding: 5rem; } @media (max-width: 567px) { table.showcase.hero .tether-target-demo { padding: 1rem; } } + table.showcase.share { + background: #f3f3f3; } + table.showcase.projects-showcase .showcase-inner .projects-list { + width: 80%; + max-width: 1200px; + margin: 0 auto; } + table.showcase.projects-showcase .showcase-inner .projects-list .project { + color: inherit; + text-decoration: none; + position: relative; + width: 50%; + float: left; + text-align: center; + margin-bottom: 2rem; } + table.showcase.projects-showcase .showcase-inner .projects-list .os-icon { + width: 8rem; + height: 8rem; + margin-bottom: 1rem; + background-size: 100%; } + table.showcase.projects-showcase .showcase-inner .projects-list h1 { + font-size: 2.5rem; } + table.showcase.projects-showcase .showcase-inner .projects-list p { + font-size: 1.3rem; } table.showcase.browser-demo { background-image: -webkit-gradient(linear, 0% 0%, 100% 100%, color-stop(0%, #723362), color-stop(100%, #9d223c)); background-image: -webkit-linear-gradient(top left, #723362 0%, #9d223c 100%); @@ -106,22 +141,21 @@ table.showcase { -moz-transition: width 2s ease-in-out, height 2s ease-in-out; -o-transition: width 2s ease-in-out, height 2s ease-in-out; transition: width 2s ease-in-out, height 2s ease-in-out; } - table.showcase.browser-demo.fixed[data-section="intro"] { + table.showcase.browser-demo.fixed[data-section="what"] { box-shadow: 0 0 0 0; } - table.showcase.browser-demo.fixed[data-section="resize"] .browser-demo-inner { - width: 50%; } + table.showcase.browser-demo.fixed[data-section="why"] .browser-demo-inner { + width: 70%; } + table.showcase.browser-demo.fixed[data-section="outro"] .showcase-inner { + pointer-events: all; } table.showcase.browser-demo .showcase-inner { + pointer-events: none; position: absolute; - left: 200px; - right: 200px; + left: 10%; + right: 40%; top: 220px; bottom: 120px; margin: 0; padding: 0; } - @media (max-width: 1200px) { - table.showcase.browser-demo .showcase-inner { - left: 10%; - right: 10%; } } @media (max-width: 567px) { table.showcase.browser-demo .showcase-inner { bottom: 90px; @@ -154,17 +188,10 @@ table.showcase { font-size: 40px; font-weight: bold; line-height: 1; - margin: 0 0 15px; } + margin: 25px 0 15px; } @media (max-width: 567px) { table.showcase.browser-demo .section-copy h2 { font-size: 30px; } } - table.showcase.browser-demo .section-copy p { - font-size: 26px; - font-weight: 300; - margin: 0; } - @media (max-width: 567px) { - table.showcase.browser-demo .section-copy p { - font-size: 16px; } } table.showcase.browser-demo .browser-window { -webkit-border-radius: 4px; -moz-border-radius: 4px; @@ -217,8 +244,28 @@ table.showcase { border: 0; width: 100%; height: 100%; } - table.showcase.browser-demo-section { - pointer-events: none; } + table.showcase.browser-demo-section .section-scroll-copy { + position: relative; + z-index: 10; + color: white; + width: 100%; + font-size: 22px; } + table.showcase.browser-demo-section .section-scroll-copy .section-scroll-copy-inner { + position: absolute; + z-index: 10; + color: white; + right: 10%; + width: 23%; } + table.showcase.browser-demo-section .section-scroll-copy .section-scroll-copy-inner a { + color: inherit; } + table.showcase.browser-demo-section .section-scroll-copy .section-scroll-copy-inner .example-paragraph { + -webkit-border-radius: 4px; + -moz-border-radius: 4px; + -ms-border-radius: 4px; + -o-border-radius: 4px; + border-radius: 4px; + background: black; + padding: 1rem; } .browser-content { display: none; } diff --git a/docs/welcome/index.html b/docs/welcome/index.html index 93df62e3c..326342017 100644 --- a/docs/welcome/index.html +++ b/docs/welcome/index.html @@ -14,10 +14,14 @@ + + + +
@@ -25,10 +29,12 @@

Tether

-

Marrying elements for life

-

- ★ On Github -

+
+

Marrying elements for life

+

+ ★ On Github +

+
@@ -38,21 +44,17 @@

Marrying elements for life

-
-

What?

-

Tether can be used for many types of floating elements on a page.

+
+

What is Tether?

-
-

 

-

In this example we're showing an action menu tethered to a list item.

+
+

How Tether works.

-
-

Resillient

-

Tether keeps your element tethered on resize and scroll events.

+
+

Tether is powerful.

-

Demo

-

Interact with this demo to learn more.

+

Play with Tether

@@ -67,14 +69,84 @@

Demo

-
-
-
-
+
+
+
+

Tether is a low-level UI library that can be used to position any element on a page next to any other element.

+

It can be used for dropdown menus, tooltips, popovers, tours, help information, scroll guides, autocompletes, etc. The possibilities are endless.

+

In this example we're showing an action menu tethered to a list item.

+
+
+
+ +
+
+
+

Tether works by creating an absolutely positioned element and meticulously tracking the movements of a target which you specify.

+

The target and element (or drop) can be tethered together in a variety of different ways.

+

Notice how the drop stays tethered to its target list item even as the left pane is scrolled up and down.

+
+
+
+ +
+
+
+

Tether can keep your element positioned properly even in some tough situations.

+

Tether handles all of the common pain points:

+
    +
  • Automatically detect collisions with the edge of the page or edge of the scrollParent
  • +
  • Automatically reposition on browser resize, scroll, and other events,
  • +
  • Constrain the position to any bounding box,
  • +
+

...and a lot more.

+
+
+
+ +
+
+
+

Interact with this demo.

+

 

+

To learn more, check out our documentation.

+
+
+
+
+
+ +
+ @@ -197,11 +196,17 @@

Help us spread the word.

- - - - + + + + + + + + + + diff --git a/docs/welcome/js/welcome.js b/docs/welcome/js/welcome.js index 5bb9b9168..d25df519f 100644 --- a/docs/welcome/js/welcome.js +++ b/docs/welcome/js/welcome.js @@ -1,32 +1,62 @@ (function() { - var init, isMobile, setupBrowserDemo, setupHero; + var MIRROR_ATTACH, init, isMobile, setupBrowserDemo, setupHero, sortAttach; isMobile = $(window).width() < 567; + MIRROR_ATTACH = { + left: 'right', + right: 'left', + top: 'bottom', + bottom: 'top', + middle: 'middle', + center: 'center' + }; + + sortAttach = function(str) { + var first, second, _ref, _ref1; + _ref = str.split(' '), first = _ref[0], second = _ref[1]; + if (first === 'left' || first === 'right') { + _ref1 = [second, first], first = _ref1[0], second = _ref1[1]; + } + return [first, second].join(' '); + }; + init = function() { - setupHero(); return setupBrowserDemo(); }; setupHero = function() { - var $target, finalDropState, frameLengthMS, frames, openAllDrops, openIndex, openNextDrop, position, positions, _i, _len; + var $target, dropAttach, finalDropState, frameLengthMS, frames, openAllDrops, openIndex, openNextDrop, targetAttachment, targetAttachments, _i, _len; $target = $('.tether-target-demo'); - positions = ['top left', 'left top', 'left middle', 'left bottom', 'bottom left', 'bottom center', 'bottom right', 'right bottom', 'right middle', 'right top', 'top right', 'top center']; + targetAttachments = ['top left', 'left top', 'left middle', 'left bottom', 'bottom left', 'bottom center', 'bottom right', 'right bottom', 'right middle', 'right top', 'top right', 'top center']; if (isMobile) { - positions = ['top left', 'bottom left', 'bottom right', 'top right']; + targetAttachments = ['top left', 'bottom left', 'bottom right', 'top right']; } window.drops = {}; - for (_i = 0, _len = positions.length; _i < _len; _i++) { - position = positions[_i]; - drops[position] = new Drop({ + for (_i = 0, _len = targetAttachments.length; _i < _len; _i++) { + targetAttachment = targetAttachments[_i]; + dropAttach = targetAttachment.split(' '); + dropAttach[0] = MIRROR_ATTACH[dropAttach[0]]; + dropAttach = dropAttach.join(' '); + drops[targetAttachment] = new Tether({ target: $target[0], - className: 'drop-tooltip-theme-arrows', - attach: position, - constrainToScrollParent: true, - openOn: '', - content: '
' + element: $('
'), + className: 'tooltip-theme-arrows', + classPrefix: 'tooltip', + enabled: false, + offset: '0 0', + targetOffset: '0 0', + attachment: sortAttach(dropAttach), + targetAttachment: sortAttach(targetAttachment), + constraints: [ + { + to: 'window', + pin: true, + attachment: 'together' + } + ] }); - drops[position].$drop.addClass("drop-attached-" + (position.replace(' ', '-'))); + $(drops[targetAttachment].drop).addClass("drop-attached-" + (targetAttachment.replace(' ', '-'))); } openIndex = 0; frames = 0; @@ -34,21 +64,21 @@ openAllDrops = function() { var drop, _results; _results = []; - for (position in drops) { - drop = drops[position]; + for (targetAttachment in drops) { + drop = drops[targetAttachment]; _results.push(drop.open()); } return _results; }; openNextDrop = function() { var drop; - for (position in drops) { - drop = drops[position]; + for (targetAttachment in drops) { + drop = drops[targetAttachment]; drop.close(); } - drops[positions[openIndex]].open(); - drops[positions[(openIndex + 6) % positions.length]].open(); - openIndex = (openIndex + 1) % positions.length; + drops[targetAttachments[openIndex]].open(); + drops[targetAttachments[(openIndex + 6) % targetAttachments.length]].open(); + openIndex = (openIndex + 1) % targetAttachments.length; if (frames > 5) { finalDropState(); return; @@ -110,13 +140,19 @@ return $items.each(function(i) { var $item, drop; $item = $(this); - drop = new iframeWindow.Drop({ + drop = new iframeWindow.Tether({ target: $item[0], className: 'drop-theme-arrows', - attach: 'right top', - constrainToWindow: true, - openOn: 'click', - content: '' + targetAttach: 'right top', + attach: 'left top', + constraints: [ + { + to: 'window', + pin: true, + attachment: 'together' + } + ], + element: $('') }); $item.data('drop', drop); return drop.$drop.addClass("drop-attached-right-top"); diff --git a/index.html b/index.html index 490e8232b..60ad953b9 100644 --- a/index.html +++ b/index.html @@ -28,14 +28,14 @@ -

+

-

Tether

+

Tether

Tether is a javascript library for efficiently making an absolutely positioned element stay next to another element on the page. For example, you might want a tooltip or dialog to open, and remain, next to the relevant item @@ -46,7 +46,7 @@

Tether

side of it's target, or hide itself.

Tether optimizes it's location placement to result in the minimum amount of 'jankyness' as the page is scrolled and resized.

-

Usage

+

Usage

The element to be moved is called the 'element'. The element in the page it's to be attached to is called the 'target'.

To use Tether, you define a point on the target and a point on the element. @@ -61,7 +61,7 @@

Usage

targetAttachment: 'top left' });

-

Attachment

+

Attachment

You can move the attachment points of both the element and the target.

For example, lets move the element's attachment:

new Tether({
@@ -99,7 +99,7 @@ 

Attachment

The syntax of the attachment properties is: "vertical-attachment horizontal-attachment"

You must always supply an attachment. If you don't supply a target-attachment, it is assumed to be the mirror image of attachment.

-

Offset

+

Offset

The six attachment points we provide are not always enough to place the element exactly where you want it. To correct this, we provide two more properties, offset and targetOffset.

@@ -134,7 +134,7 @@

Offset

});

The syntax of the offset properties is "vertical-offset horizontal-offset"

-

Constraints

+

Constraints

If you have tried any of the previous examples, you'll notice that it's pretty easy to scroll the regions in such a way that the element is hanging out on it's own, with no target in sight.

@@ -296,7 +296,7 @@

Constraints

] });

-

Optimization

+

Optimization

The goal of Tether's optimizer is to not have to change the positioning CSS as the page is scrolled or resized. To accomplish this it looks at the last few positions, finds commonalities, and uses them to decide whether to @@ -329,7 +329,7 @@

Optimization

} });

-

Methods

+

Methods

The Tether constructor we've been using in these examples returns us a Tether object.

The Tether object has these methods:

@@ -340,7 +340,7 @@

Methods

  • destroy() - Disable and remove all references
  • position() - Manually trigger a repositioning
  • -

    Options

    +

    Options

    The full list of options which can be passed to the Tether constructor and setOptions:

      @@ -374,7 +374,7 @@

      Options

    -

    Classes

    +

    Classes

    // Make classes mutable

    Tether adds a variety of classes to the element and target to allow you to style them based on their tethering.

    @@ -391,7 +391,7 @@

    Classes

    elements based on the target's attachment. All of the characteristics are the same as for element-attached. -

    Constraint-related Classes

    +
    • tether-out-of-bounds, tether-out-of-bounds-[side] are added to both the element and the target when the element is placed outside of it's constraint.
    • diff --git a/markAttachment.coffee b/markAttachment.coffee index 378c2684a..9406d230d 100644 --- a/markAttachment.coffee +++ b/markAttachment.coffee @@ -6,10 +6,10 @@ Tether.modules.push for type in ['target', 'element'] el = document.createElement 'div' - el.className = "tether-#{ type }-marker" + el.className = @getClass("#{ type }-marker") dot = document.createElement 'div' - dot.className = "tether-marker-dot" + dot.className = @getClass('marker-dot') el.appendChild dot @[type].appendChild el diff --git a/markAttachment.js b/markAttachment.js index 59ae351d8..c4246800c 100644 --- a/markAttachment.js +++ b/markAttachment.js @@ -12,9 +12,9 @@ for (_i = 0, _len = _ref.length; _i < _len; _i++) { type = _ref[_i]; el = document.createElement('div'); - el.className = "tether-" + type + "-marker"; + el.className = this.getClass("" + type + "-marker"); dot = document.createElement('div'); - dot.className = "tether-marker-dot"; + dot.className = this.getClass('marker-dot'); el.appendChild(dot); this[type].appendChild(el); _results.push(this.markers[type] = { diff --git a/source/abutment.html b/source/abutment.html index 48379152e..2ec7c7356 100644 --- a/source/abutment.html +++ b/source/abutment.html @@ -104,14 +104,14 @@

      abutment.coffee

      abutted.push side sides = ['left', 'top', 'right', 'bottom'] - @removeClass "tether-abutted" + @removeClass @getClass('abutted') for side in sides - @removeClass "tether-abutted-#{ side }" + @removeClass "#{ @getClass('abutted') }-#{ side }" if abutted.length - @addClass "tether-abutted" + @addClass @getClass('abutted') for side in abutted - @addClass "tether-abutted-#{ side }" + @addClass "#{ @getClass('abutted') }-#{ side }" true
    diff --git a/source/constraint.html b/source/constraint.html index f45a2c185..ee8bd25fd 100644 --- a/source/constraint.html +++ b/source/constraint.html @@ -130,7 +130,7 @@

    constraint.coffee

    tAttachment = {} eAttachment = {} - removeClasses = ['tether-pinned', 'tether-out-of-bounds'] + removeClasses = [@getClass('pinned'), @getClass('out-of-bounds')] for constraint in @options.constraints removeClasses.push(constraint.outOfBoundsClass) if constraint.outOfBoundsClass removeClasses.push(constraint.pinnedClass) if constraint.pinnedClass @@ -286,13 +286,13 @@

    constraint.coffee

    oob.push 'right' if pinned.length - pinnedClass = @options.pinnedClass ? 'tether-pinned' + pinnedClass = @options.pinnedClass ? @getClass('pinned') @addClass pinnedClass for side in pinned @addClass "#{ pinnedClass }-#{ side }" if oob.length - oobClass = @options.outOfBoundsClass ? 'tether-out-of-bounds' + oobClass = @options.outOfBoundsClass ? @getClass('out-of-bounds') @addClass oobClass for side in oob @addClass "#{ oobClass }-#{ side }" diff --git a/source/markAttachment.html b/source/markAttachment.html index 2134db0d1..750d85f2f 100644 --- a/source/markAttachment.html +++ b/source/markAttachment.html @@ -89,10 +89,10 @@

    markAttachment.coffee

    for type in ['target', 'element'] el = document.createElement 'div' - el.className = "tether-#{ type }-marker" + el.className = @getClass("#{ type }-marker") dot = document.createElement 'div' - dot.className = "tether-marker-dot" + dot.className = @getClass('marker-dot') el.appendChild dot @[type].appendChild el diff --git a/source/tether.html b/source/tether.html index fe741fa25..4c51f83e0 100644 --- a/source/tether.html +++ b/source/tether.html @@ -202,11 +202,23 @@

    tether.coffee

    @position() + getClass: (key) -> + if @options.classes?[key] + @options.classes[key] + else if @options.classes?[key] isnt false + if @options.classPrefix + "#{ @options.classPrefix }-#{ key }" + else + key + else + '' + setOptions: (@options, position=true) -> defaults = offset: '0 0' targetOffset: '0 0' targetAttachment: 'auto auto' + classPrefix: 'tether' @options = extend defaults, @options @@ -242,8 +254,8 @@

    tether.coffee

    if not @[key]? throw new Error "Tether Error: Both element and target must be defined" - addClass @element, 'tether-element' - addClass @target, 'tether-target' + addClass @element, @getClass 'element' + addClass @target, @getClass 'target' @targetAttachment = parseAttachment @options.targetAttachment @attachment = parseAttachment @options.attachment @@ -300,16 +312,16 @@

    tether.coffee

    @_cache[k] enable: (position=true) -> - @addClass 'tether-enabled' + @addClass @getClass 'enabled' @enabled = true @scrollParent.addEventListener 'scroll', @position if position - @position() + setTimeout => @position() disable: -> - @removeClass 'tether-enabled' + @removeClass @getClass 'enabled' @enabled = false if @scrollParent? @@ -326,13 +338,13 @@

    tether.coffee

    updateAttachClasses: (elementAttach=@attachment, targetAttach=@targetAttachment) -> sides = ['left', 'top', 'bottom', 'right', 'middle', 'center'] - @removeClass "tether-element-attached-#{ side }" for side in sides - @addClass "tether-element-attached-#{ elementAttach.top }" if elementAttach.top - @addClass "tether-element-attached-#{ elementAttach.left }" if elementAttach.left + @removeClass "#{ @getClass('element-attached') }-#{ side }" for side in sides + @addClass "#{ @getClass('element-attached') }-#{ elementAttach.top }" if elementAttach.top + @addClass "#{ @getClass('element-attached') }-#{ elementAttach.left }" if elementAttach.left - @removeClass "tether-target-attached-#{ side }" for side in sides - @addClass "tether-target-attached-#{ targetAttach.top }" if targetAttach.top - @addClass "tether-target-attached-#{ targetAttach.left }" if targetAttach.left + @removeClass "#{ @getClass('target-attached') }-#{ side }" for side in sides + @addClass "#{ @getClass('target-attached') }-#{ targetAttach.top }" if targetAttach.top + @addClass "#{ @getClass('target-attached') }-#{ targetAttach.left }" if targetAttach.left addClass: (classes) -> addClass @element, classes diff --git a/tether.coffee b/tether.coffee index 76c0d093d..f1cc6753b 100644 --- a/tether.coffee +++ b/tether.coffee @@ -106,11 +106,23 @@ class _Tether @position() + getClass: (key) -> + if @options.classes?[key] + @options.classes[key] + else if @options.classes?[key] isnt false + if @options.classPrefix + "#{ @options.classPrefix }-#{ key }" + else + key + else + '' + setOptions: (@options, position=true) -> defaults = offset: '0 0' targetOffset: '0 0' targetAttachment: 'auto auto' + classPrefix: 'tether' @options = extend defaults, @options @@ -133,8 +145,8 @@ class _Tether if not @[key]? throw new Error "Tether Error: Both element and target must be defined" - addClass @element, 'tether-element' - addClass @target, 'tether-target' + addClass @element, @getClass 'element' + addClass @target, @getClass 'target' @targetAttachment = parseAttachment @options.targetAttachment @attachment = parseAttachment @options.attachment @@ -178,16 +190,16 @@ class _Tether @_cache[k] enable: (position=true) -> - @addClass 'tether-enabled' + @addClass @getClass 'enabled' @enabled = true @scrollParent.addEventListener 'scroll', @position if position - @position() + setTimeout => @position() disable: -> - @removeClass 'tether-enabled' + @removeClass @getClass 'enabled' @enabled = false if @scrollParent? @@ -204,13 +216,13 @@ class _Tether updateAttachClasses: (elementAttach=@attachment, targetAttach=@targetAttachment) -> sides = ['left', 'top', 'bottom', 'right', 'middle', 'center'] - @removeClass "tether-element-attached-#{ side }" for side in sides - @addClass "tether-element-attached-#{ elementAttach.top }" if elementAttach.top - @addClass "tether-element-attached-#{ elementAttach.left }" if elementAttach.left + @removeClass "#{ @getClass('element-attached') }-#{ side }" for side in sides + @addClass "#{ @getClass('element-attached') }-#{ elementAttach.top }" if elementAttach.top + @addClass "#{ @getClass('element-attached') }-#{ elementAttach.left }" if elementAttach.left - @removeClass "tether-target-attached-#{ side }" for side in sides - @addClass "tether-target-attached-#{ targetAttach.top }" if targetAttach.top - @addClass "tether-target-attached-#{ targetAttach.left }" if targetAttach.left + @removeClass "#{ @getClass('target-attached') }-#{ side }" for side in sides + @addClass "#{ @getClass('target-attached') }-#{ targetAttach.top }" if targetAttach.top + @addClass "#{ @getClass('target-attached') }-#{ targetAttach.left }" if targetAttach.left addClass: (classes) -> addClass @element, classes diff --git a/tether.js b/tether.js index 4b23af1db..2ff2e64e5 100644 --- a/tether.js +++ b/tether.js @@ -154,6 +154,21 @@ this.position(); } + _Tether.prototype.getClass = function(key) { + var _ref2, _ref3; + if ((_ref2 = this.options.classes) != null ? _ref2[key] : void 0) { + return this.options.classes[key]; + } else if (((_ref3 = this.options.classes) != null ? _ref3[key] : void 0) !== false) { + if (this.options.classPrefix) { + return "" + this.options.classPrefix + "-" + key; + } else { + return key; + } + } else { + return ''; + } + }; + _Tether.prototype.setOptions = function(options, position) { var defaults, key, _j, _len1, _ref2, _ref3; this.options = options; @@ -163,7 +178,8 @@ defaults = { offset: '0 0', targetOffset: '0 0', - targetAttachment: 'auto auto' + targetAttachment: 'auto auto', + classPrefix: 'tether' }; this.options = extend(defaults, this.options); _ref2 = this.options, this.element = _ref2.element, this.target = _ref2.target, this.targetModifier = _ref2.targetModifier; @@ -186,8 +202,8 @@ throw new Error("Tether Error: Both element and target must be defined"); } } - addClass(this.element, 'tether-element'); - addClass(this.target, 'tether-target'); + addClass(this.element, this.getClass('element')); + addClass(this.target, this.getClass('target')); this.targetAttachment = parseAttachment(this.options.targetAttachment); this.attachment = parseAttachment(this.options.attachment); this.offset = parseOffset(this.options.offset); @@ -239,19 +255,22 @@ }; _Tether.prototype.enable = function(position) { + var _this = this; if (position == null) { position = true; } - this.addClass('tether-enabled'); + this.addClass(this.getClass('enabled')); this.enabled = true; this.scrollParent.addEventListener('scroll', this.position); if (position) { - return this.position(); + return setTimeout(function() { + return _this.position(); + }); } }; _Tether.prototype.disable = function() { - this.removeClass('tether-enabled'); + this.removeClass(this.getClass('enabled')); this.enabled = false; if (this.scrollParent != null) { return this.scrollParent.removeEventListener('scroll', this.position); @@ -285,23 +304,23 @@ sides = ['left', 'top', 'bottom', 'right', 'middle', 'center']; for (_j = 0, _len1 = sides.length; _j < _len1; _j++) { side = sides[_j]; - this.removeClass("tether-element-attached-" + side); + this.removeClass("" + (this.getClass('element-attached')) + "-" + side); } if (elementAttach.top) { - this.addClass("tether-element-attached-" + elementAttach.top); + this.addClass("" + (this.getClass('element-attached')) + "-" + elementAttach.top); } if (elementAttach.left) { - this.addClass("tether-element-attached-" + elementAttach.left); + this.addClass("" + (this.getClass('element-attached')) + "-" + elementAttach.left); } for (_k = 0, _len2 = sides.length; _k < _len2; _k++) { side = sides[_k]; - this.removeClass("tether-target-attached-" + side); + this.removeClass("" + (this.getClass('target-attached')) + "-" + side); } if (targetAttach.top) { - this.addClass("tether-target-attached-" + targetAttach.top); + this.addClass("" + (this.getClass('target-attached')) + "-" + targetAttach.top); } if (targetAttach.left) { - return this.addClass("tether-target-attached-" + targetAttach.left); + return this.addClass("" + (this.getClass('target-attached')) + "-" + targetAttach.left); } }; diff --git a/tether.min.js b/tether.min.js index 2788d57cd..0d55c7a5c 100644 --- a/tether.min.js +++ b/tether.min.js @@ -1,2 +1,2 @@ -/*! tether.js 0.2.4 */ -(function(){var a,b,c,d,e,f,g,h,i={}.hasOwnProperty,j=[].slice;null==window.Tether&&(window.Tether={}),f=function(a){var b,c,d,e,f;if(c=getComputedStyle(a).position,"fixed"===c)return a;for(d=void 0,b=a;b=b.parentNode;){if(!(e=getComputedStyle(b)))return b;if(/(auto|scroll)/.test(e.overflow+e["overflow-y"]+e["overflow-x"])&&("absolute"!==c||"relative"===(f=e.position)||"absolute"===f||"fixed"===f))return b}return document.body},d=function(a){var b,d,e,f;return d=a.ownerDocument,e=d.documentElement,b=c({},a.getBoundingClientRect()),b.top=b.top+window.pageYOffset-e.clientTop,b.left=b.left+window.pageXOffset-e.clientLeft,b.right=d.body.clientWidth-b.width-b.left,b.bottom=d.body.clientHeight-b.height-b.top,b.height&&b.width||(f=getComputedStyle(a),b.height||(b.height=parseFloat(f.height)),b.width||(b.width=parseFloat(f.width))),b},e=function(a){return a.offsetParent||document.documentElement},c=function(a){var b,c,d,e,f,g,h;for(null==a&&(a={}),b=[],Array.prototype.push.apply(b,arguments),h=b.slice(1),f=0,g=h.length;g>f;f++)if(d=h[f])for(c in d)i.call(d,c)&&(e=d[c],a[c]=e);return a},h=function(a,b){var c,d,e,f,g;if(null!=a.classList){for(f=b.split(" "),g=[],d=0,e=f.length;e>d;d++)c=f[d],g.push(a.classList.remove(c));return g}return a.className=a.className.replace(new RegExp("(^| )"+b.split(" ").join("|")+"( |$)","gi")," ")},b=function(a,b){var c,d,e,f,g;if(null!=a.classList){for(f=b.split(" "),g=[],d=0,e=f.length;e>d;d++)c=f[d],g.push(a.classList.add(c));return g}return h(a,b),a.className+=" "+b},g=function(a,b){return null!=a.classList?a.classList.contains(b):new RegExp("(^| )"+b+"( |$)","gi").test(a.className)},a=function(){function a(){}return a.prototype.on=function(a,b,c,d){var e;return null==d&&(d=!1),null==this.bindings&&(this.bindings={}),null==(e=this.bindings)[a]&&(e[a]=[]),this.bindings[a].push({handler:b,ctx:c,once:d})},a.prototype.once=function(a,b,c){return this.on(a,b,c,!0)},a.prototype.off=function(a,b){var c,d,e;if(null!=(null!=(d=this.bindings)?d[a]:void 0)){if(null==b)return delete this.bindings[a];for(c=0,e=[];cb;b++)a=v[b],d.push(a.position());return d},p=null,A=["resize","scroll"],x=0,y=A.length;y>x;x++)i=A[x],window.addEventListener(i,function(){return null==p||new Date-p>16?(p=+new Date,t()):void 0});a={center:"center",left:"right",right:"left"},b={middle:"middle",top:"bottom",bottom:"top"},c={top:"0",left:"0",middle:"50%",center:"50%",bottom:"100%",right:"100%"},g=function(c,d){var e,f;return e=c.left,f=c.top,"auto"===e&&(e=a[d.left]),"auto"===f&&(f=b[d.top]),{left:e,top:f}},f=function(a){var b,d;return{left:null!=(b=c[a.left])?b:a.left,top:null!=(d=c[a.top])?d:a.top}},e=function(){var a,b,c,d,e,f,g;for(b=1<=arguments.length?B.call(arguments,0):[],c={top:0,left:0},e=0,f=b.length;f>e;e++)g=b[e],d=g.top,a=g.left,"string"==typeof d&&(d=parseFloat(d,10)),"string"==typeof a&&(a=parseFloat(a,10)),c.top+=d,c.left+=a;return c},q=function(a,b){return"string"==typeof a.left&&-1!==a.left.indexOf("%")&&(a.left=parseFloat(a.left,10)/100*b.width),"string"==typeof a.top&&-1!==a.top.indexOf("%")&&(a.top=parseFloat(a.top,10)/100*b.height),a},r=s=function(a){var b,c,d;return d=a.split(" "),c=d[0],b=d[1],{top:c,left:b}},w=function(){function a(a){this.position=C(this.position,this);var b,c,d,e,f;for(v.push(this),this.history=[],this.setOptions(a,!1),e=Tether.modules,c=0,d=e.length;d>c;c++)b=e[c],null!=(f=b.initialize)&&f.call(this);this.position()}return a.modules=[],a.prototype.setOptions=function(a,b){var c,e,f,g,h,i;for(this.options=a,null==b&&(b=!0),c={offset:"0 0",targetOffset:"0 0",targetAttachment:"auto auto"},this.options=j(c,this.options),h=this.options,this.element=h.element,this.target=h.target,this.targetModifier=h.targetModifier,"viewport"===this.target?(this.target=document.body,this.targetModifier="visible"):"scroll-handle"===this.target&&(this.target=document.body,this.targetModifier="scroll-handle"),i=["element","target"],f=0,g=i.length;g>f;f++)if(e=i[f],null!=this[e].jquery?this[e]=this[e][0]:"string"==typeof this[e]&&(this[e]=document.querySelector(this[e])),null==this[e])throw new Error("Tether Error: Both element and target must be defined");return d(this.element,"tether-element"),d(this.target,"tether-target"),this.targetAttachment=r(this.options.targetAttachment),this.attachment=r(this.options.attachment),this.offset=s(this.options.offset),this.targetOffset=s(this.options.targetOffset),null!=this.scrollParent&&this.disable(),this.scrollParent=n(this.target),this.options.enabled!==!1?this.enable(b):void 0},a.prototype.getTargetBounds=function(){if(null==this.targetModifier)return k(this.target);switch(this.targetModifier){case"visible":return{top:pageYOffset,left:pageXOffset,height:innerHeight,width:innerWidth};case"scroll-handle":return{top:pageYOffset+innerHeight*(pageYOffset/document.body.scrollHeight),left:innerWidth-15,height:.98*innerHeight*(innerHeight/document.body.scrollHeight),width:15}}},a.prototype.clearCache=function(){return this._cache={}},a.prototype.cache=function(a,b){return null==this._cache&&(this._cache={}),null==this._cache[a]&&(this._cache[a]=b.call(this)),this._cache[a]},a.prototype.enable=function(a){return null==a&&(a=!0),this.addClass("tether-enabled"),this.enabled=!0,this.scrollParent.addEventListener("scroll",this.position),a?this.position():void 0},a.prototype.disable=function(){return this.removeClass("tether-enabled"),this.enabled=!1,null!=this.scrollParent?this.scrollParent.removeEventListener("scroll",this.position):void 0},a.prototype.destroy=function(){var a,b,c,d,e;for(this.disable(),e=[],a=c=0,d=v.length;d>c;a=++c){if(b=v[a],b===this){v.splice(a,1);break}e.push(void 0)}return e},a.prototype.updateAttachClasses=function(a,b){var c,d,e,f,g,h;for(null==a&&(a=this.attachment),null==b&&(b=this.targetAttachment),d=["left","top","bottom","right","middle","center"],e=0,g=d.length;g>e;e++)c=d[e],this.removeClass("tether-element-attached-"+c);for(a.top&&this.addClass("tether-element-attached-"+a.top),a.left&&this.addClass("tether-element-attached-"+a.left),f=0,h=d.length;h>f;f++)c=d[f],this.removeClass("tether-target-attached-"+c);return b.top&&this.addClass("tether-target-attached-"+b.top),b.left?this.addClass("tether-target-attached-"+b.left):void 0},a.prototype.addClass=function(a){return d(this.element,a),d(this.target,a)},a.prototype.removeClass=function(a){return u(this.element,a),u(this.target,a)},a.prototype.position=function(){var a,b,c,d,h,i,j,m,n,o,p,r,s,t,u,v,w,x,y,z,A,B,C,D,E,F,G,H,I,J,K=this;if(this.enabled){for(this.clearCache(),x=g(this.targetAttachment,this.attachment),this.updateAttachClasses(this.attachment,x),a=this.cache("element-bounds",function(){return k(K.element)}),C=a.width,b=a.height,A=z=this.cache("target-bounds",function(){return K.getTargetBounds()}),m=q(f(this.attachment),{width:C,height:b}),y=q(f(x),A),d=q(this.offset,{width:C,height:b}),h=q(this.targetOffset,A),m=e(m,d),y=e(y,h),c=z.left+y.left-m.left,B=z.top+y.top-m.top,H=Tether.modules,D=0,F=H.length;F>D;D++)if(i=H[D],t=i.position.call(this,{left:c,top:B,targetAttachment:x,targetPos:z,elementPos:a,offset:m,targetOffset:y,manualOffset:d,manualTargetOffset:h}),null!=t&&"object"==typeof t){if(t===!1)return!1;B=t.top,c=t.left}if(j={page:{top:B,bottom:document.body.scrollHeight-B-b,left:c,right:document.body.scrollWidth-c-C},viewport:{top:B-pageYOffset,bottom:pageYOffset-B-b+innerHeight,left:c-pageXOffset,right:pageXOffset-c-C+innerWidth}},(null!=(I=this.options.optimizations)?I.moveElement:void 0)!==!1&&null==this.targetModifier){for(o=this.cache("target-offsetparent",function(){return l(K.target)}),s=this.cache("target-offsetparent-bounds",function(){return k(o)}),r=getComputedStyle(o),p=s,n={},J=["top","left","bottom","right"],E=0,G=J.length;G>E;E++)w=J[E],n[w]=parseFloat(r["border-"+w+"-width"]);s.left+=n.left,s.top+=n.top,s.right=document.body.scrollWidth-s.left-p.width,s.bottom=document.body.scrollHeight-s.top-p.height,j.page.top>=s.top&&j.page.bottom>=s.bottom&&j.page.left>=s.left&&j.page.right>=s.right&&(v=o.scrollTop,u=o.scrollLeft,j.offset={top:j.page.top-s.top+v+n.top,left:j.page.left-s.left+u+n.left,right:j.page.right-s.right+o.scrollWidth-u+n.right,bottom:j.page.bottom-s.bottom+o.scrollHeight-v+n.bottom})}return this.move(j),this.history.unshift(j),this.history.length>3&&this.history.pop(),!0}},a.prototype.move=function(a){var b,c,d,e,f,g,h,i,k,m,n,o,p,q,r,s,t,u,v,w,x,y=this;k={};for(o in a){k[o]={};for(d in a[o]){for(c=!1,v=this.history,r=0,t=v.length;t>r;r++)if(i=v[r],(null!=(w=i[o])?w[d]:void 0)!==a[o][d]){c=!0;break}c||(k[o][d]=!0)}}if(b={top:"",left:"",right:"",bottom:""},n=function(a,c){return a.top?b.top=""+c.top+"px":b.bottom=""+c.bottom+"px",a.left?b.left=""+c.left+"px":b.right=""+c.right+"px"},e=!1,(k.page.top||k.page.bottom)&&(k.page.left||k.page.right))b.position="absolute",n(k.page,a.page);else if((k.viewport.top||k.viewport.bottom)&&(k.viewport.left||k.viewport.right))b.position="fixed",n(k.viewport,a.viewport);else if(null!=k.offset&&(k.offset.top||k.offset.bottom)&&(k.offset.left||k.offset.right)){for(b.position="absolute",g=this.cache("target-offsetparent",function(){return l(y.target)}),l(this.element)!==g&&(this.element.parentNode.removeChild(this.element),g.appendChild(this.element)),h=getComputedStyle(g),f=j({},a.offset),x=["top","left","bottom","right"],s=0,u=x.length;u>s;s++)m=x[s],f[m]-=parseFloat(h["border-"+m+"-width"]);n(k.offset,f),e=!0}else b.position="absolute",b.top=""+a.page.top+"px",b.left=""+a.page.left+"px";e||"BODY"===this.element.parentNode.tagName||(this.element.parentNode.removeChild(this.element),document.body.appendChild(this.element)),q=!1;for(d in b)if(p=b[d],this.element.style[d]!==p){q=!0;break}return q?j(this.element.style,b):void 0},a}(),window.Tether=j(w,Tether)}.call(this),function(){var a,b,c,d,e,f,g,h,i=[].indexOf||function(a){for(var b=0,c=this.length;c>b;b++)if(b in this&&this[b]===a)return b;return-1};h=Tether.Utils,f=h.getOuterSize,e=h.getBounds,g=h.getSize,c=h.extend,b={left:"right",right:"left",top:"bottom",bottom:"top",middle:"middle"},a=["left","top","right","bottom"],d=function(b,c){var d,f,g,h,i,j,k;if("scrollParent"===c?c=b.scrollParent:"window"===c&&(c=[pageXOffset,pageYOffset,innerWidth+pageXOffset,innerHeight+pageYOffset]),null!=c.nodeType)for(f=h=e(c),i=getComputedStyle(c),c=[f.left,f.top,h.width+f.left,h.height+f.top],d=j=0,k=a.length;k>j;d=++j)g=a[d],"top"===g||"left"===g?c[d]+=parseFloat(i["border-"+g+"-width"]):c[d]-=parseFloat(i["border-"+g+"-width"]);return c},Tether.modules.push({position:function(b){var f,g,h,j,k,l,m,n,o,p,q,r,s,t,u,v,w,x,y,z,A,B,C,D,E,F,G,H,I,J,K,L,M,N,O,P,Q,R,S,T,U,V,W=this;if(E=b.top,o=b.left,z=b.targetAttachment,!this.options.constraints)return!0;for(v=function(b){var c,d,e,f;for(W.removeClass(b),f=[],d=0,e=a.length;e>d;d++)c=a[d],f.push(W.removeClass(""+b+"-"+c));return f},Q=this.cache("element-bounds",function(){return e(W.element)}),n=Q.height,F=Q.width,B=this.cache("target-bounds",function(){return W.getTargetBounds()}),A=B.height,C=B.width,y={},m={},w=["tether-pinned","tether-out-of-bounds"],R=this.options.constraints,G=0,K=R.length;K>G;G++)l=R[G],l.outOfBoundsClass&&w.push(l.outOfBoundsClass),l.pinnedClass&&w.push(l.pinnedClass);for(H=0,L=w.length;L>H;H++)k=w[H],v(k);for(y=c({},z),m=c({},this.attachment),S=this.options.constraints,I=0,M=S.length;M>I;I++){if(l=S[I],D=l.to,f=l.attachment,s=l.pin,null==f&&(f=""),i.call(f," ")>=0?(T=f.split(" "),j=T[0],h=T[1]):h=j=f,g=d(this,D),("target"===j||"both"===j)&&(Eg[3]&&"bottom"===y.top&&(E-=A,y.top="top")),"together"===j&&(Eg[3]&&"bottom"===y.top&&("top"===m.top?(E-=A,y.top="top",E-=n,m.top="bottom"):"bottom"===m.top&&(E-=A,y.top="top",E+=n,m.top="top"))),("target"===h||"both"===h)&&(og[2]&&"right"===y.left&&(o-=C,y.left="left")),"together"===h&&(og[2]&&"right"===y.left&&("left"===m.left?(o-=C,y.left="left",o-=F,m.left="right"):"right"===m.left&&(o-=C,y.left="left",o+=F,m.left="left"))),("element"===j||"both"===j)&&(Eg[3]&&"top"===m.top&&(E-=n,m.top="bottom")),("element"===h||"both"===h)&&(og[2]&&"left"===m.left&&(o-=F,m.left="right")),"string"==typeof s?s=function(){var a,b,c,d;for(c=s.split(","),d=[],a=0,b=c.length;b>a;a++)r=c[a],d.push(r.trim());return d}():s===!0&&(s=["top","left","right","bottom"]),s||(s=[]),t=[],p=[],E=0?(E=g[1],t.push("top")):p.push("top")),E+n>g[3]&&(i.call(s,"bottom")>=0?(E=g[3]-n,t.push("bottom")):p.push("bottom")),o=0?(o=g[0],t.push("left")):p.push("left")),o+F>g[2]&&(i.call(s,"right")>=0?(o=g[2]-F,t.push("right")):p.push("right")),t.length)for(u=null!=(U=this.options.pinnedClass)?U:"tether-pinned",this.addClass(u),J=0,N=t.length;N>J;J++)x=t[J],this.addClass(""+u+"-"+x);if(p.length)for(q=null!=(V=this.options.outOfBoundsClass)?V:"tether-out-of-bounds",this.addClass(q),P=0,O=p.length;O>P;P++)x=p[P],this.addClass(""+q+"-"+x);(i.call(t,"left")>=0||i.call(t,"right")>=0)&&(m.left=y.left=!1),(i.call(t,"top")>=0||i.call(t,"bottom")>=0)&&(m.top=y.top=!1),(y.top!==z.top||y.left!==z.left||m.top!==this.attachment.top||m.left!==this.attachment.left)&&this.updateAttachClasses(m,y)}return{top:E,left:o}}})}.call(this),function(){var a;a=Tether.Utils.getBounds,Tether.modules.push({position:function(b){var c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u,v,w,x,y,z=this;if(k=b.top,f=b.left,u=this.cache("element-bounds",function(){return a(z.element)}),e=u.height,l=u.width,j=this.getTargetBounds(),d=k+e,g=f+l,c=[],k<=j.bottom&&d>=j.top)for(v=["left","right"],m=0,q=v.length;q>m;m++)h=v[m],((w=j[h])===f||w===g)&&c.push(h);if(f<=j.right&&g>=j.left)for(x=["top","bottom"],n=0,r=x.length;r>n;n++)h=x[n],((y=j[h])===k||y===d)&&c.push(h);for(i=["left","top","right","bottom"],this.removeClass("tether-abutted"),o=0,s=i.length;s>o;o++)h=i[o],this.removeClass("tether-abutted-"+h);for(c.length&&this.addClass("tether-abutted"),p=0,t=c.length;t>p;p++)h=c[p],this.addClass("tether-abutted-"+h);return!0}})}.call(this),function(){Tether.modules.push({position:function(a){var b,c,d,e,f,g,h;return g=a.top,b=a.left,this.options.shift?(c=function(a){return"function"==typeof a?a.call(this,{top:g,left:b}):a},d=c(this.options.shift),"string"==typeof d?(d=d.split(" "),d[1]||(d[1]=d[0]),f=d[0],e=d[1],f=parseFloat(f,10),e=parseFloat(e,10)):(h=[d.top,d.left],f=h[0],e=h[1]),g+=f,b+=e,{top:g,left:b}):void 0}})}.call(this); \ No newline at end of file +/*! tether.js 0.2.8 */ +(function(){var a,b,c,d,e,f,g,h,i={}.hasOwnProperty,j=[].slice;null==window.Tether&&(window.Tether={}),f=function(a){var b,c,d,e,f;if(c=getComputedStyle(a).position,"fixed"===c)return a;for(d=void 0,b=a;b=b.parentNode;){if(!(e=getComputedStyle(b)))return b;if(/(auto|scroll)/.test(e.overflow+e["overflow-y"]+e["overflow-x"])&&("absolute"!==c||"relative"===(f=e.position)||"absolute"===f||"fixed"===f))return b}return document.body},d=function(a){var b,d,e,f;return d=a.ownerDocument,e=d.documentElement,b=c({},a.getBoundingClientRect()),b.top=b.top+window.pageYOffset-e.clientTop,b.left=b.left+window.pageXOffset-e.clientLeft,b.right=d.body.clientWidth-b.width-b.left,b.bottom=d.body.clientHeight-b.height-b.top,b.height&&b.width||(f=getComputedStyle(a),b.height||(b.height=parseFloat(f.height)),b.width||(b.width=parseFloat(f.width))),b},e=function(a){return a.offsetParent||document.documentElement},c=function(a){var b,c,d,e,f,g,h;for(null==a&&(a={}),b=[],Array.prototype.push.apply(b,arguments),h=b.slice(1),f=0,g=h.length;g>f;f++)if(d=h[f])for(c in d)i.call(d,c)&&(e=d[c],a[c]=e);return a},h=function(a,b){var c,d,e,f,g;if(null!=a.classList){for(f=b.split(" "),g=[],d=0,e=f.length;e>d;d++)c=f[d],g.push(a.classList.remove(c));return g}return a.className=a.className.replace(new RegExp("(^| )"+b.split(" ").join("|")+"( |$)","gi")," ")},b=function(a,b){var c,d,e,f,g;if(null!=a.classList){for(f=b.split(" "),g=[],d=0,e=f.length;e>d;d++)c=f[d],g.push(a.classList.add(c));return g}return h(a,b),a.className+=" "+b},g=function(a,b){return null!=a.classList?a.classList.contains(b):new RegExp("(^| )"+b+"( |$)","gi").test(a.className)},a=function(){function a(){}return a.prototype.on=function(a,b,c,d){var e;return null==d&&(d=!1),null==this.bindings&&(this.bindings={}),null==(e=this.bindings)[a]&&(e[a]=[]),this.bindings[a].push({handler:b,ctx:c,once:d})},a.prototype.once=function(a,b,c){return this.on(a,b,c,!0)},a.prototype.off=function(a,b){var c,d,e;if(null!=(null!=(d=this.bindings)?d[a]:void 0)){if(null==b)return delete this.bindings[a];for(c=0,e=[];cb;b++)a=v[b],d.push(a.position());return d},p=null,A=["resize","scroll"],x=0,y=A.length;y>x;x++)i=A[x],window.addEventListener(i,function(){return null==p||new Date-p>16?(p=+new Date,t()):void 0});a={center:"center",left:"right",right:"left"},b={middle:"middle",top:"bottom",bottom:"top"},c={top:"0",left:"0",middle:"50%",center:"50%",bottom:"100%",right:"100%"},g=function(c,d){var e,f;return e=c.left,f=c.top,"auto"===e&&(e=a[d.left]),"auto"===f&&(f=b[d.top]),{left:e,top:f}},f=function(a){var b,d;return{left:null!=(b=c[a.left])?b:a.left,top:null!=(d=c[a.top])?d:a.top}},e=function(){var a,b,c,d,e,f,g;for(b=1<=arguments.length?B.call(arguments,0):[],c={top:0,left:0},e=0,f=b.length;f>e;e++)g=b[e],d=g.top,a=g.left,"string"==typeof d&&(d=parseFloat(d,10)),"string"==typeof a&&(a=parseFloat(a,10)),c.top+=d,c.left+=a;return c},q=function(a,b){return"string"==typeof a.left&&-1!==a.left.indexOf("%")&&(a.left=parseFloat(a.left,10)/100*b.width),"string"==typeof a.top&&-1!==a.top.indexOf("%")&&(a.top=parseFloat(a.top,10)/100*b.height),a},r=s=function(a){var b,c,d;return d=a.split(" "),c=d[0],b=d[1],{top:c,left:b}},w=function(){function a(a){this.position=C(this.position,this);var b,c,d,e,f;for(v.push(this),this.history=[],this.setOptions(a,!1),e=Tether.modules,c=0,d=e.length;d>c;c++)b=e[c],null!=(f=b.initialize)&&f.call(this);this.position()}return a.modules=[],a.prototype.getClass=function(a){var b,c;return(null!=(b=this.options.classes)?b[a]:void 0)?this.options.classes[a]:(null!=(c=this.options.classes)?c[a]:void 0)!==!1?this.options.classPrefix?""+this.options.classPrefix+"-"+a:a:""},a.prototype.setOptions=function(a,b){var c,e,f,g,h,i;for(this.options=a,null==b&&(b=!0),c={offset:"0 0",targetOffset:"0 0",targetAttachment:"auto auto",classPrefix:"tether"},this.options=j(c,this.options),h=this.options,this.element=h.element,this.target=h.target,this.targetModifier=h.targetModifier,"viewport"===this.target?(this.target=document.body,this.targetModifier="visible"):"scroll-handle"===this.target&&(this.target=document.body,this.targetModifier="scroll-handle"),i=["element","target"],f=0,g=i.length;g>f;f++)if(e=i[f],null!=this[e].jquery?this[e]=this[e][0]:"string"==typeof this[e]&&(this[e]=document.querySelector(this[e])),null==this[e])throw new Error("Tether Error: Both element and target must be defined");return d(this.element,this.getClass("element")),d(this.target,this.getClass("target")),this.targetAttachment=r(this.options.targetAttachment),this.attachment=r(this.options.attachment),this.offset=s(this.options.offset),this.targetOffset=s(this.options.targetOffset),null!=this.scrollParent&&this.disable(),this.scrollParent=n(this.target),this.options.enabled!==!1?this.enable(b):void 0},a.prototype.getTargetBounds=function(){if(null==this.targetModifier)return k(this.target);switch(this.targetModifier){case"visible":return{top:pageYOffset,left:pageXOffset,height:innerHeight,width:innerWidth};case"scroll-handle":return{top:pageYOffset+innerHeight*(pageYOffset/document.body.scrollHeight),left:innerWidth-15,height:.98*innerHeight*(innerHeight/document.body.scrollHeight),width:15}}},a.prototype.clearCache=function(){return this._cache={}},a.prototype.cache=function(a,b){return null==this._cache&&(this._cache={}),null==this._cache[a]&&(this._cache[a]=b.call(this)),this._cache[a]},a.prototype.enable=function(a){var b=this;return null==a&&(a=!0),this.addClass(this.getClass("enabled")),this.enabled=!0,this.scrollParent.addEventListener("scroll",this.position),a?setTimeout(function(){return b.position()}):void 0},a.prototype.disable=function(){return this.removeClass(this.getClass("enabled")),this.enabled=!1,null!=this.scrollParent?this.scrollParent.removeEventListener("scroll",this.position):void 0},a.prototype.destroy=function(){var a,b,c,d,e;for(this.disable(),e=[],a=c=0,d=v.length;d>c;a=++c){if(b=v[a],b===this){v.splice(a,1);break}e.push(void 0)}return e},a.prototype.updateAttachClasses=function(a,b){var c,d,e,f,g,h;for(null==a&&(a=this.attachment),null==b&&(b=this.targetAttachment),d=["left","top","bottom","right","middle","center"],e=0,g=d.length;g>e;e++)c=d[e],this.removeClass(""+this.getClass("element-attached")+"-"+c);for(a.top&&this.addClass(""+this.getClass("element-attached")+"-"+a.top),a.left&&this.addClass(""+this.getClass("element-attached")+"-"+a.left),f=0,h=d.length;h>f;f++)c=d[f],this.removeClass(""+this.getClass("target-attached")+"-"+c);return b.top&&this.addClass(""+this.getClass("target-attached")+"-"+b.top),b.left?this.addClass(""+this.getClass("target-attached")+"-"+b.left):void 0},a.prototype.addClass=function(a){return d(this.element,a),d(this.target,a)},a.prototype.removeClass=function(a){return u(this.element,a),u(this.target,a)},a.prototype.position=function(){var a,b,c,d,h,i,j,m,n,o,p,r,s,t,u,v,w,x,y,z,A,B,C,D,E,F,G,H,I,J,K=this;if(this.enabled){for(this.clearCache(),x=g(this.targetAttachment,this.attachment),this.updateAttachClasses(this.attachment,x),a=this.cache("element-bounds",function(){return k(K.element)}),C=a.width,b=a.height,A=z=this.cache("target-bounds",function(){return K.getTargetBounds()}),m=q(f(this.attachment),{width:C,height:b}),y=q(f(x),A),d=q(this.offset,{width:C,height:b}),h=q(this.targetOffset,A),m=e(m,d),y=e(y,h),c=z.left+y.left-m.left,B=z.top+y.top-m.top,H=Tether.modules,D=0,F=H.length;F>D;D++)if(i=H[D],t=i.position.call(this,{left:c,top:B,targetAttachment:x,targetPos:z,elementPos:a,offset:m,targetOffset:y,manualOffset:d,manualTargetOffset:h}),null!=t&&"object"==typeof t){if(t===!1)return!1;B=t.top,c=t.left}if(j={page:{top:B,bottom:document.body.scrollHeight-B-b,left:c,right:document.body.scrollWidth-c-C},viewport:{top:B-pageYOffset,bottom:pageYOffset-B-b+innerHeight,left:c-pageXOffset,right:pageXOffset-c-C+innerWidth}},(null!=(I=this.options.optimizations)?I.moveElement:void 0)!==!1&&null==this.targetModifier){for(o=this.cache("target-offsetparent",function(){return l(K.target)}),s=this.cache("target-offsetparent-bounds",function(){return k(o)}),r=getComputedStyle(o),p=s,n={},J=["top","left","bottom","right"],E=0,G=J.length;G>E;E++)w=J[E],n[w]=parseFloat(r["border-"+w+"-width"]);s.left+=n.left,s.top+=n.top,s.right=document.body.scrollWidth-s.left-p.width,s.bottom=document.body.scrollHeight-s.top-p.height,j.page.top>=s.top&&j.page.bottom>=s.bottom&&j.page.left>=s.left&&j.page.right>=s.right&&(v=o.scrollTop,u=o.scrollLeft,j.offset={top:j.page.top-s.top+v+n.top,left:j.page.left-s.left+u+n.left,right:j.page.right-s.right+o.scrollWidth-u+n.right,bottom:j.page.bottom-s.bottom+o.scrollHeight-v+n.bottom})}return this.move(j),this.history.unshift(j),this.history.length>3&&this.history.pop(),!0}},a.prototype.move=function(a){var b,c,d,e,f,g,h,i,k,m,n,o,p,q,r,s,t,u,v,w,x,y=this;k={};for(o in a){k[o]={};for(d in a[o]){for(c=!1,v=this.history,r=0,t=v.length;t>r;r++)if(i=v[r],(null!=(w=i[o])?w[d]:void 0)!==a[o][d]){c=!0;break}c||(k[o][d]=!0)}}if(b={top:"",left:"",right:"",bottom:""},n=function(a,c){return a.top?b.top=""+c.top+"px":b.bottom=""+c.bottom+"px",a.left?b.left=""+c.left+"px":b.right=""+c.right+"px"},e=!1,(k.page.top||k.page.bottom)&&(k.page.left||k.page.right))b.position="absolute",n(k.page,a.page);else if((k.viewport.top||k.viewport.bottom)&&(k.viewport.left||k.viewport.right))b.position="fixed",n(k.viewport,a.viewport);else if(null!=k.offset&&(k.offset.top||k.offset.bottom)&&(k.offset.left||k.offset.right)){for(b.position="absolute",g=this.cache("target-offsetparent",function(){return l(y.target)}),l(this.element)!==g&&(this.element.parentNode.removeChild(this.element),g.appendChild(this.element)),h=getComputedStyle(g),f=j({},a.offset),x=["top","left","bottom","right"],s=0,u=x.length;u>s;s++)m=x[s],f[m]-=parseFloat(h["border-"+m+"-width"]);n(k.offset,f),e=!0}else b.position="absolute",b.top=""+a.page.top+"px",b.left=""+a.page.left+"px";e||"BODY"===this.element.parentNode.tagName||(this.element.parentNode.removeChild(this.element),document.body.appendChild(this.element)),q=!1;for(d in b)if(p=b[d],this.element.style[d]!==p){q=!0;break}return q?j(this.element.style,b):void 0},a}(),window.Tether=j(w,Tether)}.call(this),function(){var a,b,c,d,e,f,g,h,i=[].indexOf||function(a){for(var b=0,c=this.length;c>b;b++)if(b in this&&this[b]===a)return b;return-1};h=Tether.Utils,f=h.getOuterSize,e=h.getBounds,g=h.getSize,c=h.extend,b={left:"right",right:"left",top:"bottom",bottom:"top",middle:"middle"},a=["left","top","right","bottom"],d=function(b,c){var d,f,g,h,i,j,k;if("scrollParent"===c?c=b.scrollParent:"window"===c&&(c=[pageXOffset,pageYOffset,innerWidth+pageXOffset,innerHeight+pageYOffset]),null!=c.nodeType)for(f=h=e(c),i=getComputedStyle(c),c=[f.left,f.top,h.width+f.left,h.height+f.top],d=j=0,k=a.length;k>j;d=++j)g=a[d],"top"===g||"left"===g?c[d]+=parseFloat(i["border-"+g+"-width"]):c[d]-=parseFloat(i["border-"+g+"-width"]);return c},Tether.modules.push({position:function(b){var f,g,h,j,k,l,m,n,o,p,q,r,s,t,u,v,w,x,y,z,A,B,C,D,E,F,G,H,I,J,K,L,M,N,O,P,Q,R,S,T,U,V,W=this;if(E=b.top,o=b.left,z=b.targetAttachment,!this.options.constraints)return!0;for(v=function(b){var c,d,e,f;for(W.removeClass(b),f=[],d=0,e=a.length;e>d;d++)c=a[d],f.push(W.removeClass(""+b+"-"+c));return f},Q=this.cache("element-bounds",function(){return e(W.element)}),n=Q.height,F=Q.width,B=this.cache("target-bounds",function(){return W.getTargetBounds()}),A=B.height,C=B.width,y={},m={},w=[this.getClass("pinned"),this.getClass("out-of-bounds")],R=this.options.constraints,G=0,K=R.length;K>G;G++)l=R[G],l.outOfBoundsClass&&w.push(l.outOfBoundsClass),l.pinnedClass&&w.push(l.pinnedClass);for(H=0,L=w.length;L>H;H++)k=w[H],v(k);for(y=c({},z),m=c({},this.attachment),S=this.options.constraints,I=0,M=S.length;M>I;I++){if(l=S[I],D=l.to,f=l.attachment,s=l.pin,null==f&&(f=""),i.call(f," ")>=0?(T=f.split(" "),j=T[0],h=T[1]):h=j=f,g=d(this,D),("target"===j||"both"===j)&&(Eg[3]&&"bottom"===y.top&&(E-=A,y.top="top")),"together"===j&&(Eg[3]&&"bottom"===y.top&&("top"===m.top?(E-=A,y.top="top",E-=n,m.top="bottom"):"bottom"===m.top&&(E-=A,y.top="top",E+=n,m.top="top"))),("target"===h||"both"===h)&&(og[2]&&"right"===y.left&&(o-=C,y.left="left")),"together"===h&&(og[2]&&"right"===y.left&&("left"===m.left?(o-=C,y.left="left",o-=F,m.left="right"):"right"===m.left&&(o-=C,y.left="left",o+=F,m.left="left"))),("element"===j||"both"===j)&&(Eg[3]&&"top"===m.top&&(E-=n,m.top="bottom")),("element"===h||"both"===h)&&(og[2]&&"left"===m.left&&(o-=F,m.left="right")),"string"==typeof s?s=function(){var a,b,c,d;for(c=s.split(","),d=[],a=0,b=c.length;b>a;a++)r=c[a],d.push(r.trim());return d}():s===!0&&(s=["top","left","right","bottom"]),s||(s=[]),t=[],p=[],E=0?(E=g[1],t.push("top")):p.push("top")),E+n>g[3]&&(i.call(s,"bottom")>=0?(E=g[3]-n,t.push("bottom")):p.push("bottom")),o=0?(o=g[0],t.push("left")):p.push("left")),o+F>g[2]&&(i.call(s,"right")>=0?(o=g[2]-F,t.push("right")):p.push("right")),t.length)for(u=null!=(U=this.options.pinnedClass)?U:this.getClass("pinned"),this.addClass(u),J=0,N=t.length;N>J;J++)x=t[J],this.addClass(""+u+"-"+x);if(p.length)for(q=null!=(V=this.options.outOfBoundsClass)?V:this.getClass("out-of-bounds"),this.addClass(q),P=0,O=p.length;O>P;P++)x=p[P],this.addClass(""+q+"-"+x);(i.call(t,"left")>=0||i.call(t,"right")>=0)&&(m.left=y.left=!1),(i.call(t,"top")>=0||i.call(t,"bottom")>=0)&&(m.top=y.top=!1),(y.top!==z.top||y.left!==z.left||m.top!==this.attachment.top||m.left!==this.attachment.left)&&this.updateAttachClasses(m,y)}return{top:E,left:o}}})}.call(this),function(){var a;a=Tether.Utils.getBounds,Tether.modules.push({position:function(b){var c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u,v,w,x,y,z=this;if(k=b.top,f=b.left,u=this.cache("element-bounds",function(){return a(z.element)}),e=u.height,l=u.width,j=this.getTargetBounds(),d=k+e,g=f+l,c=[],k<=j.bottom&&d>=j.top)for(v=["left","right"],m=0,q=v.length;q>m;m++)h=v[m],((w=j[h])===f||w===g)&&c.push(h);if(f<=j.right&&g>=j.left)for(x=["top","bottom"],n=0,r=x.length;r>n;n++)h=x[n],((y=j[h])===k||y===d)&&c.push(h);for(i=["left","top","right","bottom"],this.removeClass(this.getClass("abutted")),o=0,s=i.length;s>o;o++)h=i[o],this.removeClass(""+this.getClass("abutted")+"-"+h);for(c.length&&this.addClass(this.getClass("abutted")),p=0,t=c.length;t>p;p++)h=c[p],this.addClass(""+this.getClass("abutted")+"-"+h);return!0}})}.call(this),function(){Tether.modules.push({position:function(a){var b,c,d,e,f,g,h;return g=a.top,b=a.left,this.options.shift?(c=function(a){return"function"==typeof a?a.call(this,{top:g,left:b}):a},d=c(this.options.shift),"string"==typeof d?(d=d.split(" "),d[1]||(d[1]=d[0]),f=d[0],e=d[1],f=parseFloat(f,10),e=parseFloat(e,10)):(h=[d.top,d.left],f=h[0],e=h[1]),g+=f,b+=e,{top:g,left:b}):void 0}})}.call(this); \ No newline at end of file From 2582057520ae6d3250759bf15dbb96223181bc82 Mon Sep 17 00:00:00 2001 From: Zack Bloom Date: Tue, 25 Feb 2014 00:15:43 -0500 Subject: [PATCH 04/40] Rebuild docs --- CNAME | 1 + Gruntfile.coffee | 58 - abutment.coffee | 33 - abutment.js | 53 - advanced/embedding_tether/index.html | 59 + advanced/extending_tether/index.html | 85 ++ constraint.coffee | 225 ---- css/tether-theme-arrows-dark.css | 112 ++ css/tether-theme-arrows.css | 69 +- css/tether-theme-basic.css | 10 +- css/tether.css | 6 +- docs/css/intro.css | 99 +- docs/intro.html | 191 ++- docs/js/intro.js | 60 +- docs/welcome/browser-demo.html | 20 +- docs/welcome/coffee/welcome.coffee | 95 +- docs/welcome/css/browser-demo.css | 14 +- docs/welcome/css/welcome.css | 7 +- docs/welcome/index.html | 24 +- docs/welcome/js/drop.js | 239 ++++ docs/welcome/js/tether-v0.1.3.js | 2 + docs/welcome/js/welcome.js | 112 +- docs/welcome/sass/browser-demo.sass | 8 +- docs/welcome/sass/welcome.sass | 3 +- examples/{simple => common/css}/style.css | 27 +- examples/content-visible/index.html | 64 + examples/dolls/dolls.css | 18 + examples/dolls/dolls.js | 83 ++ examples/dolls/index.html | 7 + examples/element-scroll/index.html | 499 ++++++++ examples/enable-disable/index.html | 37 + examples/list_of_examples/index.html | 77 ++ examples/out-of-bounds/index.html | 35 + examples/pin/index.html | 30 + examples/projects_using_tether/index.html | 68 + examples/scroll/index.html | 922 ++++++++++++++ examples/simple/index.html | 37 +- examples/string-selector/index.html | 30 + examples/testbed/index.html | 36 + examples/viewport/colors.css | 145 +++ examples/viewport/index.html | 70 + gulpfile.coffee | 60 + gulpfile.js | 2 + index.html | 191 ++- js/abutment.js | 59 + constraint.js => js/constraint.js | 82 +- markAttachment.js => js/markAttachment.js | 4 - shift.js => js/shift.js | 0 js/tether.js | 673 ++++++++++ js/tether.min.js | 2 + utils.js => js/utils.js | 124 +- markAttachment.coffee | 32 - overview/repositioning/index.html | 79 ++ overview/why_we_dont_support_ie_8/index.html | 89 ++ overview/why_you_should_use_tether/index.html | 86 ++ resources/templates/base.jade | 32 +- resources/templates/includes/analytics.html | 2 +- resources/templates/includes/navigation.jade | 8 - resources/templates/includes/page-header.jade | 2 +- resources/templates/includes/topbar.html | 2 +- shift.coffee | 27 - source/Gruntfile.html | 148 --- source/abutment.html | 123 -- source/constraint.html | 315 ----- source/docco.css | 500 -------- source/markAttachment.html | 122 -- source/public/fonts/aller-bold.eot | Bin 29804 -> 0 bytes source/public/fonts/aller-bold.ttf | Bin 66836 -> 0 bytes source/public/fonts/aller-bold.woff | Bin 33244 -> 0 bytes source/public/fonts/aller-light.eot | Bin 29509 -> 0 bytes source/public/fonts/aller-light.ttf | Bin 68620 -> 0 bytes source/public/fonts/aller-light.woff | Bin 33124 -> 0 bytes source/public/fonts/novecento-bold.eot | Bin 18190 -> 0 bytes source/public/fonts/novecento-bold.ttf | Bin 48136 -> 0 bytes source/public/fonts/novecento-bold.woff | Bin 20576 -> 0 bytes source/public/stylesheets/normalize.css | 375 ------ source/shift.html | 117 -- source/tether.html | 676 ---------- source/tooltip.html | 115 -- source/utils.html | 214 ---- tether.coffee | 415 ------ tether.js | 1123 ++++++++++++++--- tether.min.js | 4 +- tooltip.coffee | 25 - tooltip.js | 39 - utils.coffee | 112 -- 86 files changed, 5457 insertions(+), 4292 deletions(-) create mode 100644 CNAME delete mode 100644 Gruntfile.coffee delete mode 100644 abutment.coffee delete mode 100644 abutment.js create mode 100644 advanced/embedding_tether/index.html create mode 100644 advanced/extending_tether/index.html delete mode 100644 constraint.coffee create mode 100644 css/tether-theme-arrows-dark.css create mode 100644 docs/welcome/js/drop.js create mode 100644 docs/welcome/js/tether-v0.1.3.js rename examples/{simple => common/css}/style.css (51%) create mode 100644 examples/content-visible/index.html create mode 100644 examples/dolls/dolls.css create mode 100644 examples/dolls/dolls.js create mode 100644 examples/dolls/index.html create mode 100644 examples/element-scroll/index.html create mode 100644 examples/enable-disable/index.html create mode 100644 examples/list_of_examples/index.html create mode 100644 examples/out-of-bounds/index.html create mode 100644 examples/pin/index.html create mode 100644 examples/projects_using_tether/index.html create mode 100644 examples/scroll/index.html create mode 100644 examples/string-selector/index.html create mode 100644 examples/testbed/index.html create mode 100644 examples/viewport/colors.css create mode 100644 examples/viewport/index.html create mode 100644 gulpfile.coffee create mode 100644 gulpfile.js create mode 100644 js/abutment.js rename constraint.js => js/constraint.js (74%) rename markAttachment.js => js/markAttachment.js (98%) rename shift.js => js/shift.js (100%) create mode 100644 js/tether.js create mode 100644 js/tether.min.js rename utils.js => js/utils.js (62%) delete mode 100644 markAttachment.coffee create mode 100644 overview/repositioning/index.html create mode 100644 overview/why_we_dont_support_ie_8/index.html create mode 100644 overview/why_you_should_use_tether/index.html delete mode 100644 shift.coffee delete mode 100644 source/Gruntfile.html delete mode 100644 source/abutment.html delete mode 100644 source/constraint.html delete mode 100644 source/docco.css delete mode 100644 source/markAttachment.html delete mode 100755 source/public/fonts/aller-bold.eot delete mode 100755 source/public/fonts/aller-bold.ttf delete mode 100755 source/public/fonts/aller-bold.woff delete mode 100755 source/public/fonts/aller-light.eot delete mode 100755 source/public/fonts/aller-light.ttf delete mode 100755 source/public/fonts/aller-light.woff delete mode 100755 source/public/fonts/novecento-bold.eot delete mode 100755 source/public/fonts/novecento-bold.ttf delete mode 100755 source/public/fonts/novecento-bold.woff delete mode 100644 source/public/stylesheets/normalize.css delete mode 100644 source/shift.html delete mode 100644 source/tether.html delete mode 100644 source/tooltip.html delete mode 100644 source/utils.html delete mode 100644 tether.coffee delete mode 100644 tooltip.coffee delete mode 100644 tooltip.js delete mode 100644 utils.coffee diff --git a/CNAME b/CNAME new file mode 100644 index 000000000..85a1c68ba --- /dev/null +++ b/CNAME @@ -0,0 +1 @@ +tether.io diff --git a/Gruntfile.coffee b/Gruntfile.coffee deleted file mode 100644 index d4744ad4d..000000000 --- a/Gruntfile.coffee +++ /dev/null @@ -1,58 +0,0 @@ -module.exports = (grunt) -> - grunt.initConfig - pkg: grunt.file.readJSON('package.json') - coffee: - compile: - files: - 'utils.js': 'utils.coffee' - 'tether.js': 'tether.coffee' - 'constraint.js': 'constraint.coffee' - 'abutment.js': 'abutment.coffee' - 'shift.js': 'shift.coffee' - 'markAttachment.js': 'markAttachment.coffee' - 'docs/js/intro.js': 'docs/coffee/intro.coffee' - 'docs/welcome/js/welcome.js': 'docs/welcome/coffee/welcome.coffee' - - watch: - coffee: - files: ['*.coffee', 'sass/*', 'docs/**/*'] - tasks: ['coffee', 'uglify', 'compass'] - - uglify: - tether: - src: ['utils.js', 'tether.js', 'constraint.js', 'abutment.js', 'shift.js'] - dest: 'tether.min.js' - options: - banner: '/*! tether.js <%= pkg.version %> */\n' - - compass: - dist: - options: - sassDir: 'sass' - cssDir: 'css' - introDocs: - options: - sassDir: 'docs/sass' - cssDir: 'docs/css' - welcomeDocs: - options: - sassDir: 'docs/welcome/sass' - cssDir: 'docs/welcome/css' - - bower: - install: - options: - targetDir: 'deps' - cleanup: true - layout: 'byComponent' - bowerOptions: - forceLatest: true - production: true - - grunt.loadNpmTasks 'grunt-contrib-watch' - grunt.loadNpmTasks 'grunt-contrib-uglify' - grunt.loadNpmTasks 'grunt-contrib-coffee' - grunt.loadNpmTasks 'grunt-contrib-compass' - grunt.loadNpmTasks 'grunt-bower-task' - - grunt.registerTask 'default', ['bower', 'coffee', 'uglify', 'compass'] diff --git a/abutment.coffee b/abutment.coffee deleted file mode 100644 index bacb37d40..000000000 --- a/abutment.coffee +++ /dev/null @@ -1,33 +0,0 @@ -{getBounds} = Tether.Utils - -Tether.modules.push - position: ({top, left}) -> - {height, width} = @cache 'element-bounds', => getBounds @element - - targetPos = @getTargetBounds() - - bottom = top + height - right = left + width - - abutted = [] - if top <= targetPos.bottom and bottom >= targetPos.top - for side in ['left', 'right'] - if targetPos[side] in [left, right] - abutted.push side - - if left <= targetPos.right and right >= targetPos.left - for side in ['top', 'bottom'] - if targetPos[side] in [top, bottom] - abutted.push side - - sides = ['left', 'top', 'right', 'bottom'] - @removeClass @getClass('abutted') - for side in sides - @removeClass "#{ @getClass('abutted') }-#{ side }" - - if abutted.length - @addClass @getClass('abutted') - for side in abutted - @addClass "#{ @getClass('abutted') }-#{ side }" - - true diff --git a/abutment.js b/abutment.js deleted file mode 100644 index 3b0866bc5..000000000 --- a/abutment.js +++ /dev/null @@ -1,53 +0,0 @@ -(function() { - var getBounds; - - getBounds = Tether.Utils.getBounds; - - Tether.modules.push({ - position: function(_arg) { - var abutted, bottom, height, left, right, side, sides, targetPos, top, width, _i, _j, _k, _l, _len, _len1, _len2, _len3, _ref, _ref1, _ref2, _ref3, _ref4, - _this = this; - top = _arg.top, left = _arg.left; - _ref = this.cache('element-bounds', function() { - return getBounds(_this.element); - }), height = _ref.height, width = _ref.width; - targetPos = this.getTargetBounds(); - bottom = top + height; - right = left + width; - abutted = []; - if (top <= targetPos.bottom && bottom >= targetPos.top) { - _ref1 = ['left', 'right']; - for (_i = 0, _len = _ref1.length; _i < _len; _i++) { - side = _ref1[_i]; - if ((_ref2 = targetPos[side]) === left || _ref2 === right) { - abutted.push(side); - } - } - } - if (left <= targetPos.right && right >= targetPos.left) { - _ref3 = ['top', 'bottom']; - for (_j = 0, _len1 = _ref3.length; _j < _len1; _j++) { - side = _ref3[_j]; - if ((_ref4 = targetPos[side]) === top || _ref4 === bottom) { - abutted.push(side); - } - } - } - sides = ['left', 'top', 'right', 'bottom']; - this.removeClass(this.getClass('abutted')); - for (_k = 0, _len2 = sides.length; _k < _len2; _k++) { - side = sides[_k]; - this.removeClass("" + (this.getClass('abutted')) + "-" + side); - } - if (abutted.length) { - this.addClass(this.getClass('abutted')); - } - for (_l = 0, _len3 = abutted.length; _l < _len3; _l++) { - side = abutted[_l]; - this.addClass("" + (this.getClass('abutted')) + "-" + side); - } - return true; - } - }); - -}).call(this); diff --git a/advanced/embedding_tether/index.html b/advanced/embedding_tether/index.html new file mode 100644 index 000000000..23463039c --- /dev/null +++ b/advanced/embedding_tether/index.html @@ -0,0 +1,59 @@ +Tether +

    Embedding Tether

    +

    Tether is designed to be embedable in other libraries.

    +

    There is one thing you should think about doing to create an embedded Tether:

    +
      +
    • Set the classPrefix of the tethers you create. That prefix will replace 'tether' in +all of the classes. You can also disable classes you don't intend on using with the classes +option.
    • +
    +
    + + + + + \ No newline at end of file diff --git a/advanced/extending_tether/index.html b/advanced/extending_tether/index.html new file mode 100644 index 000000000..0c8c2abbc --- /dev/null +++ b/advanced/extending_tether/index.html @@ -0,0 +1,85 @@ +Tether +

    Extending Tether

    +

    Tether has a module system which can be used to modify Tether's positioning, or just do something each time the Tether is moved.

    +

    Tether has an array called Tether.modules, push onto it to add a module:

    +
    Tether.modules.push
    +  position: ({top, left}) ->
    +    top += 10
    +
    +    {top, left}
    +

    Position

    +

    Your position function can either return a new object with top and left, null/undefined to leave the coordinates unchanged, or +false to cancel the positioning.

    +

    The position function is passed an object with the following elements:

    +
    {
    +  left, // The element's new position, from the top left corner of the page
    +  top,
    +  targetAttachment, // The targetAttachment, with 'auto' resolved to an actual attachment
    +  targetPos, // The coordinates of the target
    +  attachment, // The attachment, as passed in the option
    +  elementPos, // The cooridinates of the element
    +  offset, // The offset, after it's converted into pixels and the manual offset is added
    +  targetOffset, // The attachment is converted into an offset and is included in these values
    +  manualOffset, // The manual offset, in pixels
    +  manualTargetOffset
    +}
    +

    It is called with the Tether instance as its context (this).

    +

    Initialize

    +

    Modules can also have an initialize function which will be called when a new tether is created. The initialize function +is also called with the Tether instance as its context.

    +
    Tether.modules.push
    +  initialize: ->
    +    console.log "New Tether Created!", @
    +

    Examples

    +

    Constraints and shift are both implemented as modules. +Mark Attachment is used by the docs.

    +
    + + + + + \ No newline at end of file diff --git a/constraint.coffee b/constraint.coffee deleted file mode 100644 index 8424a93d1..000000000 --- a/constraint.coffee +++ /dev/null @@ -1,225 +0,0 @@ -{getOuterSize, getBounds, getSize, extend} = Tether.Utils - -MIRROR_ATTACH = - left: 'right' - right: 'left' - top: 'bottom' - bottom: 'top' - middle: 'middle' - -BOUNDS_FORMAT = ['left', 'top', 'right', 'bottom'] - -getBoundingRect = (tether, to) -> - if to is 'scrollParent' - to = tether.scrollParent - else if to is 'window' - to = [pageXOffset, pageYOffset, innerWidth + pageXOffset, innerHeight + pageYOffset] - - if to.nodeType? - pos = size = getBounds to - style = getComputedStyle to - - to = [pos.left, pos.top, size.width + pos.left, size.height + pos.top] - - for side, i in BOUNDS_FORMAT - if side in ['top', 'left'] - to[i] += parseFloat style["border-#{ side }-width"] - else - to[i] -= parseFloat style["border-#{ side }-width"] - - to - -Tether.modules.push - position: ({top, left, targetAttachment}) -> - return true unless @options.constraints - - removeClass = (prefix) => - @removeClass prefix - for side in BOUNDS_FORMAT - @removeClass "#{ prefix }-#{ side }" - - {height, width} = @cache 'element-bounds', => getBounds @element - - targetSize = @cache 'target-bounds', => @getTargetBounds() - targetHeight = targetSize.height - targetWidth = targetSize.width - - tAttachment = {} - eAttachment = {} - - removeClasses = [@getClass('pinned'), @getClass('out-of-bounds')] - for constraint in @options.constraints - removeClasses.push(constraint.outOfBoundsClass) if constraint.outOfBoundsClass - removeClasses.push(constraint.pinnedClass) if constraint.pinnedClass - - removeClass(cls) for cls in removeClasses - - tAttachment = extend {}, targetAttachment - eAttachment = extend {}, @attachment - - for constraint in @options.constraints - {to, attachment, pin} = constraint - - attachment ?= '' - - if ' ' in attachment - [changeAttachY, changeAttachX] = attachment.split(' ') - else - changeAttachX = changeAttachY = attachment - - bounds = getBoundingRect @, to - - if changeAttachY in ['target', 'both'] - if (top < bounds[1] and tAttachment.top is 'top') - top += targetHeight - tAttachment.top = 'bottom' - - if (top + height > bounds[3] and tAttachment.top is 'bottom') - top -= targetHeight - tAttachment.top = 'top' - - if changeAttachY is 'together' - if top < bounds[1] and tAttachment.top is 'top' - if eAttachment.top is 'bottom' - top += targetHeight - tAttachment.top = 'bottom' - - top += height - eAttachment.top = 'top' - else if eAttachment.top is 'top' - top += targetHeight - tAttachment.top = 'bottom' - - top -= height - eAttachment.top = 'bottom' - - if top + height > bounds[3] and tAttachment.top is 'bottom' - if eAttachment.top is 'top' - top -= targetHeight - tAttachment.top = 'top' - - top -= height - eAttachment.top = 'bottom' - else if eAttachment.top is 'bottom' - top -= targetHeight - tAttachment.top = 'top' - - top += height - eAttachment.top = 'top' - - if changeAttachX in ['target', 'both'] - if (left < bounds[0] and tAttachment.left is 'left') - left += targetWidth - tAttachment.left = 'right' - - if (left + width > bounds[2] and tAttachment.left is 'right') - left -= targetWidth - tAttachment.left = 'left' - - if changeAttachX is 'together' - if left < bounds[0] and tAttachment.left is 'left' - if eAttachment.left is 'right' - left += targetWidth - tAttachment.left = 'right' - - left += width - eAttachment.left = 'left' - - else if eAttachment.left is 'left' - left += targetWidth - tAttachment.left = 'right' - - left -= width - eAttachment.left = 'right' - - else if left + width > bounds[2] and tAttachment.left is 'right' - if eAttachment.left is 'left' - left -= targetWidth - tAttachment.left = 'left' - - left -= width - eAttachment.left = 'right' - - else if eAttachment.left is 'right' - left -= targetWidth - tAttachment.left = 'left' - - left += width - eAttachment.left = 'left' - - if changeAttachY in ['element', 'both'] - if (top < bounds[1] and eAttachment.top is 'bottom') - top += height - eAttachment.top = 'top' - - if (top + height > bounds[3] and eAttachment.top is 'top') - top -= height - eAttachment.top = 'bottom' - - if changeAttachX in ['element', 'both'] - if (left < bounds[0] and eAttachment.left is 'right') - left += width - eAttachment.left = 'left' - - if (left + width > bounds[2] and eAttachment.left is 'left') - left -= width - eAttachment.left = 'right' - - if typeof pin is 'string' - pin = (p.trim() for p in pin.split ',') - else if pin is true - pin = ['top', 'left', 'right', 'bottom'] - - pin or= [] - - pinned = [] - oob = [] - if top < bounds[1] - if 'top' in pin - top = bounds[1] - pinned.push 'top' - else - oob.push 'top' - - if top + height > bounds[3] - if 'bottom' in pin - top = bounds[3] - height - pinned.push 'bottom' - else - oob.push 'bottom' - - if left < bounds[0] - if 'left' in pin - left = bounds[0] - pinned.push 'left' - else - oob.push 'left' - - if left + width > bounds[2] - if 'right' in pin - left = bounds[2] - width - pinned.push 'right' - else - oob.push 'right' - - if pinned.length - pinnedClass = @options.pinnedClass ? @getClass('pinned') - @addClass pinnedClass - for side in pinned - @addClass "#{ pinnedClass }-#{ side }" - - if oob.length - oobClass = @options.outOfBoundsClass ? @getClass('out-of-bounds') - @addClass oobClass - for side in oob - @addClass "#{ oobClass }-#{ side }" - - if 'left' in pinned or 'right' in pinned - eAttachment.left = tAttachment.left = false - if 'top' in pinned or 'bottom' in pinned - eAttachment.top = tAttachment.top = false - - if tAttachment.top isnt targetAttachment.top or tAttachment.left isnt targetAttachment.left or eAttachment.top isnt @attachment.top or eAttachment.left isnt @attachment.left - @updateAttachClasses eAttachment, tAttachment - - {top, left} diff --git a/css/tether-theme-arrows-dark.css b/css/tether-theme-arrows-dark.css new file mode 100644 index 000000000..2576f19cc --- /dev/null +++ b/css/tether-theme-arrows-dark.css @@ -0,0 +1,112 @@ +.tether-element, .tether-element:after, .tether-element:before, .tether-element *, .tether-element *:after, .tether-element *:before { + -webkit-box-sizing: border-box; + -moz-box-sizing: border-box; + box-sizing: border-box; } + +.tether-element { + position: absolute; + display: none; } + .tether-element.tether-open { + display: block; } + +.tether-element.tether-theme-arrows-dark { + max-width: 100%; + max-height: 100%; } + .tether-element.tether-theme-arrows-dark .tether-content { + -webkit-border-radius: 5px; + -moz-border-radius: 5px; + -ms-border-radius: 5px; + -o-border-radius: 5px; + border-radius: 5px; + position: relative; + font-family: inherit; + background: black; + color: white; + padding: 1em; + font-size: 1.1em; + line-height: 1.5em; } + .tether-element.tether-theme-arrows-dark .tether-content:before { + content: ""; + display: block; + position: absolute; + width: 0; + height: 0; + border-color: transparent; + border-width: 16px; + border-style: solid; } + .tether-element.tether-theme-arrows-dark.tether-element-attached-bottom.tether-element-attached-center .tether-content { + margin-bottom: 16px; } + .tether-element.tether-theme-arrows-dark.tether-element-attached-bottom.tether-element-attached-center .tether-content:before { + top: 100%; + left: 50%; + margin-left: -16px; + border-top-color: black; } + .tether-element.tether-theme-arrows-dark.tether-element-attached-top.tether-element-attached-center .tether-content { + margin-top: 16px; } + .tether-element.tether-theme-arrows-dark.tether-element-attached-top.tether-element-attached-center .tether-content:before { + bottom: 100%; + left: 50%; + margin-left: -16px; + border-bottom-color: black; } + .tether-element.tether-theme-arrows-dark.tether-element-attached-right.tether-element-attached-middle .tether-content { + margin-right: 16px; } + .tether-element.tether-theme-arrows-dark.tether-element-attached-right.tether-element-attached-middle .tether-content:before { + left: 100%; + top: 50%; + margin-top: -16px; + border-left-color: black; } + .tether-element.tether-theme-arrows-dark.tether-element-attached-left.tether-element-attached-middle .tether-content { + margin-left: 16px; } + .tether-element.tether-theme-arrows-dark.tether-element-attached-left.tether-element-attached-middle .tether-content:before { + right: 100%; + top: 50%; + margin-top: -16px; + border-right-color: black; } + .tether-element.tether-theme-arrows-dark.tether-element-attached-top.tether-element-attached-left.tether-target-attached-bottom .tether-content { + margin-top: 16px; } + .tether-element.tether-theme-arrows-dark.tether-element-attached-top.tether-element-attached-left.tether-target-attached-bottom .tether-content:before { + bottom: 100%; + left: 16px; + border-bottom-color: black; } + .tether-element.tether-theme-arrows-dark.tether-element-attached-top.tether-element-attached-right.tether-target-attached-bottom .tether-content { + margin-top: 16px; } + .tether-element.tether-theme-arrows-dark.tether-element-attached-top.tether-element-attached-right.tether-target-attached-bottom .tether-content:before { + bottom: 100%; + right: 16px; + border-bottom-color: black; } + .tether-element.tether-theme-arrows-dark.tether-element-attached-bottom.tether-element-attached-left.tether-target-attached-top .tether-content { + margin-bottom: 16px; } + .tether-element.tether-theme-arrows-dark.tether-element-attached-bottom.tether-element-attached-left.tether-target-attached-top .tether-content:before { + top: 100%; + left: 16px; + border-top-color: black; } + .tether-element.tether-theme-arrows-dark.tether-element-attached-bottom.tether-element-attached-right.tether-target-attached-top .tether-content { + margin-bottom: 16px; } + .tether-element.tether-theme-arrows-dark.tether-element-attached-bottom.tether-element-attached-right.tether-target-attached-top .tether-content:before { + top: 100%; + right: 16px; + border-top-color: black; } + .tether-element.tether-theme-arrows-dark.tether-element-attached-top.tether-element-attached-right.tether-target-attached-left .tether-content { + margin-right: 16px; } + .tether-element.tether-theme-arrows-dark.tether-element-attached-top.tether-element-attached-right.tether-target-attached-left .tether-content:before { + top: 16px; + left: 100%; + border-left-color: black; } + .tether-element.tether-theme-arrows-dark.tether-element-attached-top.tether-element-attached-left.tether-target-attached-right .tether-content { + margin-left: 16px; } + .tether-element.tether-theme-arrows-dark.tether-element-attached-top.tether-element-attached-left.tether-target-attached-right .tether-content:before { + top: 16px; + right: 100%; + border-right-color: black; } + .tether-element.tether-theme-arrows-dark.tether-element-attached-bottom.tether-element-attached-right.tether-target-attached-left .tether-content { + margin-right: 16px; } + .tether-element.tether-theme-arrows-dark.tether-element-attached-bottom.tether-element-attached-right.tether-target-attached-left .tether-content:before { + bottom: 16px; + left: 100%; + border-left-color: black; } + .tether-element.tether-theme-arrows-dark.tether-element-attached-bottom.tether-element-attached-left.tether-target-attached-right .tether-content { + margin-left: 16px; } + .tether-element.tether-theme-arrows-dark.tether-element-attached-bottom.tether-element-attached-left.tether-target-attached-right .tether-content:before { + bottom: 16px; + right: 100%; + border-right-color: black; } diff --git a/css/tether-theme-arrows.css b/css/tether-theme-arrows.css index 43b8041b5..a3fb10002 100644 --- a/css/tether-theme-arrows.css +++ b/css/tether-theme-arrows.css @@ -1,18 +1,18 @@ -.tether, .tether:after, .tether:before, .tether *, .tether *:after, .tether *:before { +.tether-element, .tether-element:after, .tether-element:before, .tether-element *, .tether-element *:after, .tether-element *:before { -webkit-box-sizing: border-box; -moz-box-sizing: border-box; box-sizing: border-box; } -.tether { +.tether-element { position: absolute; display: none; } - .tether.tether-open { + .tether-element.tether-open { display: block; } -.tether.tether-theme-arrows { +.tether-element.tether-theme-arrows { max-width: 100%; max-height: 100%; } - .tether.tether-theme-arrows .tether-content { + .tether-element.tether-theme-arrows .tether-content { -webkit-border-radius: 5px; -moz-border-radius: 5px; -ms-border-radius: 5px; @@ -25,8 +25,15 @@ padding: 1em; font-size: 1.1em; line-height: 1.5em; - -webkit-filter: drop-shadow(0 1px 4px rgba(0, 0, 0, 0.2)); } - .tether.tether-theme-arrows .tether-content:before { + -webkit-transform: translateZ(0); + -moz-transform: translateZ(0); + -ms-transform: translateZ(0); + -o-transform: translateZ(0); + transform: translateZ(0); + -webkit-filter: drop-shadow(0 1px 4px rgba(0, 0, 0, 0.2)); + -moz-filter: drop-shadow(0 1px 4px rgba(0, 0, 0, 0.2)); + filter: drop-shadow(0 1px 4px rgba(0, 0, 0, 0.2)); } + .tether-element.tether-theme-arrows .tether-content:before { content: ""; display: block; position: absolute; @@ -35,79 +42,79 @@ border-color: transparent; border-width: 16px; border-style: solid; } - .tether.tether-theme-arrows.tether-element-attached-bottom.tether-element-attached-center .tether-content { + .tether-element.tether-theme-arrows.tether-element-attached-bottom.tether-element-attached-center .tether-content { margin-bottom: 16px; } - .tether.tether-theme-arrows.tether-element-attached-bottom.tether-element-attached-center .tether-content:before { + .tether-element.tether-theme-arrows.tether-element-attached-bottom.tether-element-attached-center .tether-content:before { top: 100%; left: 50%; margin-left: -16px; border-top-color: white; } - .tether.tether-theme-arrows.tether-element-attached-top.tether-element-attached-center .tether-content { + .tether-element.tether-theme-arrows.tether-element-attached-top.tether-element-attached-center .tether-content { margin-top: 16px; } - .tether.tether-theme-arrows.tether-element-attached-top.tether-element-attached-center .tether-content:before { + .tether-element.tether-theme-arrows.tether-element-attached-top.tether-element-attached-center .tether-content:before { bottom: 100%; left: 50%; margin-left: -16px; border-bottom-color: white; } - .tether.tether-theme-arrows.tether-element-attached-right.tether-element-attached-middle .tether-content { + .tether-element.tether-theme-arrows.tether-element-attached-right.tether-element-attached-middle .tether-content { margin-right: 16px; } - .tether.tether-theme-arrows.tether-element-attached-right.tether-element-attached-middle .tether-content:before { + .tether-element.tether-theme-arrows.tether-element-attached-right.tether-element-attached-middle .tether-content:before { left: 100%; top: 50%; margin-top: -16px; border-left-color: white; } - .tether.tether-theme-arrows.tether-element-attached-left.tether-element-attached-middle .tether-content { + .tether-element.tether-theme-arrows.tether-element-attached-left.tether-element-attached-middle .tether-content { margin-left: 16px; } - .tether.tether-theme-arrows.tether-element-attached-left.tether-element-attached-middle .tether-content:before { + .tether-element.tether-theme-arrows.tether-element-attached-left.tether-element-attached-middle .tether-content:before { right: 100%; top: 50%; margin-top: -16px; border-right-color: white; } - .tether.tether-theme-arrows.tether-element-attached-top.tether-element-attached-left.tether-target-attached-bottom .tether-content { + .tether-element.tether-theme-arrows.tether-element-attached-top.tether-element-attached-left.tether-target-attached-bottom .tether-content { margin-top: 16px; } - .tether.tether-theme-arrows.tether-element-attached-top.tether-element-attached-left.tether-target-attached-bottom .tether-content:before { + .tether-element.tether-theme-arrows.tether-element-attached-top.tether-element-attached-left.tether-target-attached-bottom .tether-content:before { bottom: 100%; left: 16px; border-bottom-color: white; } - .tether.tether-theme-arrows.tether-element-attached-top.tether-element-attached-right.tether-target-attached-bottom .tether-content { + .tether-element.tether-theme-arrows.tether-element-attached-top.tether-element-attached-right.tether-target-attached-bottom .tether-content { margin-top: 16px; } - .tether.tether-theme-arrows.tether-element-attached-top.tether-element-attached-right.tether-target-attached-bottom .tether-content:before { + .tether-element.tether-theme-arrows.tether-element-attached-top.tether-element-attached-right.tether-target-attached-bottom .tether-content:before { bottom: 100%; right: 16px; border-bottom-color: white; } - .tether.tether-theme-arrows.tether-element-attached-bottom.tether-element-attached-left.tether-target-attached-top .tether-content { + .tether-element.tether-theme-arrows.tether-element-attached-bottom.tether-element-attached-left.tether-target-attached-top .tether-content { margin-bottom: 16px; } - .tether.tether-theme-arrows.tether-element-attached-bottom.tether-element-attached-left.tether-target-attached-top .tether-content:before { + .tether-element.tether-theme-arrows.tether-element-attached-bottom.tether-element-attached-left.tether-target-attached-top .tether-content:before { top: 100%; left: 16px; border-top-color: white; } - .tether.tether-theme-arrows.tether-element-attached-bottom.tether-element-attached-right.tether-target-attached-top .tether-content { + .tether-element.tether-theme-arrows.tether-element-attached-bottom.tether-element-attached-right.tether-target-attached-top .tether-content { margin-bottom: 16px; } - .tether.tether-theme-arrows.tether-element-attached-bottom.tether-element-attached-right.tether-target-attached-top .tether-content:before { + .tether-element.tether-theme-arrows.tether-element-attached-bottom.tether-element-attached-right.tether-target-attached-top .tether-content:before { top: 100%; right: 16px; border-top-color: white; } - .tether.tether-theme-arrows.tether-element-attached-top.tether-element-attached-right.tether-target-attached-left .tether-content { + .tether-element.tether-theme-arrows.tether-element-attached-top.tether-element-attached-right.tether-target-attached-left .tether-content { margin-right: 16px; } - .tether.tether-theme-arrows.tether-element-attached-top.tether-element-attached-right.tether-target-attached-left .tether-content:before { + .tether-element.tether-theme-arrows.tether-element-attached-top.tether-element-attached-right.tether-target-attached-left .tether-content:before { top: 16px; left: 100%; border-left-color: white; } - .tether.tether-theme-arrows.tether-element-attached-top.tether-element-attached-left.tether-target-attached-right .tether-content { + .tether-element.tether-theme-arrows.tether-element-attached-top.tether-element-attached-left.tether-target-attached-right .tether-content { margin-left: 16px; } - .tether.tether-theme-arrows.tether-element-attached-top.tether-element-attached-left.tether-target-attached-right .tether-content:before { + .tether-element.tether-theme-arrows.tether-element-attached-top.tether-element-attached-left.tether-target-attached-right .tether-content:before { top: 16px; right: 100%; border-right-color: white; } - .tether.tether-theme-arrows.tether-element-attached-bottom.tether-element-attached-right.tether-target-attached-left .tether-content { + .tether-element.tether-theme-arrows.tether-element-attached-bottom.tether-element-attached-right.tether-target-attached-left .tether-content { margin-right: 16px; } - .tether.tether-theme-arrows.tether-element-attached-bottom.tether-element-attached-right.tether-target-attached-left .tether-content:before { + .tether-element.tether-theme-arrows.tether-element-attached-bottom.tether-element-attached-right.tether-target-attached-left .tether-content:before { bottom: 16px; left: 100%; border-left-color: white; } - .tether.tether-theme-arrows.tether-element-attached-bottom.tether-element-attached-left.tether-target-attached-right .tether-content { + .tether-element.tether-theme-arrows.tether-element-attached-bottom.tether-element-attached-left.tether-target-attached-right .tether-content { margin-left: 16px; } - .tether.tether-theme-arrows.tether-element-attached-bottom.tether-element-attached-left.tether-target-attached-right .tether-content:before { + .tether-element.tether-theme-arrows.tether-element-attached-bottom.tether-element-attached-left.tether-target-attached-right .tether-content:before { bottom: 16px; right: 100%; border-right-color: white; } diff --git a/css/tether-theme-basic.css b/css/tether-theme-basic.css index d31233dcb..95bc689f6 100644 --- a/css/tether-theme-basic.css +++ b/css/tether-theme-basic.css @@ -1,18 +1,18 @@ -.tether, .tether:after, .tether:before, .tether *, .tether *:after, .tether *:before { +.tether-element, .tether-element:after, .tether-element:before, .tether-element *, .tether-element *:after, .tether-element *:before { -webkit-box-sizing: border-box; -moz-box-sizing: border-box; box-sizing: border-box; } -.tether { +.tether-element { position: absolute; display: none; } - .tether.tether-open { + .tether-element.tether-open { display: block; } -.tether.tether-theme-basic { +.tether-element.tether-theme-basic { max-width: 100%; max-height: 100%; } - .tether.tether-theme-basic .tether-content { + .tether-element.tether-theme-basic .tether-content { -webkit-border-radius: 5px; -moz-border-radius: 5px; -ms-border-radius: 5px; diff --git a/css/tether.css b/css/tether.css index f75654da8..3372a2b0b 100644 --- a/css/tether.css +++ b/css/tether.css @@ -1,10 +1,10 @@ -.tether, .tether:after, .tether:before, .tether *, .tether *:after, .tether *:before { +.tether-element, .tether-element:after, .tether-element:before, .tether-element *, .tether-element *:after, .tether-element *:before { -webkit-box-sizing: border-box; -moz-box-sizing: border-box; box-sizing: border-box; } -.tether { +.tether-element { position: absolute; display: none; } - .tether.tether-open { + .tether-element.tether-open { display: block; } diff --git a/docs/css/intro.css b/docs/css/intro.css index 9ad0cf482..46a9ce977 100644 --- a/docs/css/intro.css +++ b/docs/css/intro.css @@ -1,5 +1,7 @@ @charset "UTF-8"; -* { +*, *:after, *:before { + -webkit-box-sizing: border-box; + -moz-box-sizing: border-box; box-sizing: border-box; } body { @@ -17,6 +19,8 @@ body { width: 200px; height: 50px; background-color: #44ee99; } + .no-green .green-box { + display: none; } .scroll-box { height: 150px; @@ -30,11 +34,11 @@ body { width: 2000px; padding: 910px 809px; } -pre { +pre.pre-with-output { margin: 0; width: 50%; float: left; } - pre code mark { + pre.pre-with-output code mark { background: #b8daff; color: black; } @@ -47,10 +51,14 @@ output { width: 50%; float: right; margin-bottom: 15px; } + output.scroll-page .scroll-box { + overflow: hidden; } + output.scroll-page:after { + content: "↕ scroll the page ↕"; } output:after { content: "↕ scroll this area ↕"; position: absolute; - bottom: 10px; + bottom: 25px; width: 100%; text-align: center; font-size: 16px; @@ -60,6 +68,29 @@ output { transition: opacity 0.2s; } output.scrolled:after { opacity: 0; } + output[deactivated], output[activated] { + cursor: pointer; } + output[deactivated] .scroll-box, output[activated] .scroll-box { + pointer-events: none; } + output[deactivated]:after, output[activated]:after { + position: absolute; + top: 0; + left: 0; + right: 0; + bottom: 0; + opacity: 1; + content: "Click To Show"; + background-color: #aaaaaa; + border-left: 10px solid #eeeeee; + color: white; + font-size: 24px; + font-variant: normal; + padding-top: 80px; } + output[activated]:after { + content: "Click To Hide"; } + output[activated].visible-enabled:after { + height: 35px; + padding-top: 5px; } .attachment-mark, .tether-marker-dot { position: relative; } @@ -88,28 +119,28 @@ span.attachment-mark:after, span.tether-marker-dot:after { .tether-target-marker { position: absolute; } - .tether-target-attached-left .tether-target-marker { + div.tether-target-attached-left .tether-target-marker { left: 0; } - .tether-target-attached-top .tether-target-marker { + div.tether-target-attached-top .tether-target-marker { top: 0; } - .tether-target-attached-bottom .tether-target-marker { + div.tether-target-attached-bottom .tether-target-marker { bottom: 0; } - .tether-target-attached-right .tether-target-marker { + div.tether-target-attached-right .tether-target-marker { right: 0; } - .tether-target-attached-center .tether-target-marker { + div.tether-target-attached-center .tether-target-marker { left: 50%; } .tether-element-marker { position: absolute; } - .tether-element-attached-left .tether-element-marker { + div.tether-element-attached-left .tether-element-marker { left: 0; } - .tether-element-attached-top .tether-element-marker { + div.tether-element-attached-top .tether-element-marker { top: 0; } - .tether-element-attached-bottom .tether-element-marker { + div.tether-element-attached-bottom .tether-element-marker { bottom: 0; } - .tether-element-attached-right .tether-element-marker { + div.tether-element-attached-right .tether-element-marker { right: 0; } - .tether-element-attached-center .tether-element-marker { + div.tether-element-attached-center .tether-element-marker { left: 50%; } .tether-element-attached-middle .tether-element-marker { @@ -150,7 +181,39 @@ span.attachment-mark:after, span.tether-marker-dot:after { [data-example^="optimizer"] .scroll-box .tether-element:before { content: "I'm in my scroll parent!"; } -output[data-example="window"] .scroll-box { - overflow: hidden; } -output[data-example="window"]:after { - content: "↕ scroll the page ↕"; } +.tether-element[data-example="scroll-visible"] { + height: 30px; } + .tether-element[data-example="scroll-visible"] .tether-marker-dot { + display: none; } + +.hs-doc-content h2.projects-header { + text-align: center; + font-weight: 300; } + +.projects-paragraph { + text-align: center; } + .projects-paragraph a { + display: -moz-inline-stack; + display: inline-block; + vertical-align: middle; + *vertical-align: auto; + zoom: 1; + *display: inline; + text-align: center; + margin-right: 30px; + color: inherit; } + .projects-paragraph a span { + display: -moz-inline-stack; + display: inline-block; + vertical-align: middle; + *vertical-align: auto; + zoom: 1; + *display: inline; + margin-bottom: 20px; + font-size: 20px; + color: inherit; + font-weight: 300; } + .projects-paragraph a img { + display: block; + max-width: 100%; + width: 100px; } diff --git a/docs/intro.html b/docs/intro.html index 7085ac67d..caf4e3d6c 100644 --- a/docs/intro.html +++ b/docs/intro.html @@ -1,4 +1,4 @@ -tether -

    -

    -

    -

    -

    +

    +

    +

    Tether

    @@ -45,7 +43,19 @@

    Tether

    exceedes those constraints it can be pinned to the edge, flip to the other side of it's target, or hide itself.

    Tether optimizes it's location placement to result in the minimum amount of -'jankyness' as the page is scrolled and resized.

    +'jankyness' as the page is scrolled and resized. The page can maintain 60fps +scrolling even with dozens or hundreds of tethers on screen (pop open the +devtools timeline as you scroll this page).

    +

    Tether is 5kb minified and gzipped, and supports IE9+, and all modern +browsers.

    +

    Projects Built With Tether

    +

    +Select +Drop +Tooltip +Shepherd +

    +

    Usage

    The element to be moved is called the 'element'. The element in the page it's to be attached to is called the 'target'.

    @@ -54,7 +64,7 @@

    Usage

    That point is called the attachment (we've marked it in the examples with a red ). For example, if you'd like the element to sit on the left of the target:

    -

    new Tether({
    +

    new Tether({
       element: yellowBox,
       target: greenBox,
       attachment: 'top right',
    @@ -64,7 +74,7 @@ 

    Usage

    Attachment

    You can move the attachment points of both the element and the target.

    For example, lets move the element's attachment:

    -

    new Tether({
    +

    new Tether({
       element: yellowBox,
       target: greenBox,
       attachment: 'bottom left',
    @@ -72,7 +82,7 @@ 

    Attachment

    });

    We can also change the target's attachment point:

    -

    new Tether({
    +

    new Tether({
       element: yellowBox,
       target: greenBox,
       attachment: 'bottom left',
    @@ -80,7 +90,7 @@ 

    Attachment

    });

    There are two more attachment points we haven't seen yet, center and middle:

    -

    new Tether({
    +

    new Tether({
       element: yellowBox,
       target: greenBox,
       attachment: 'middle center',
    @@ -103,7 +113,7 @@ 

    Offset

    The six attachment points we provide are not always enough to place the element exactly where you want it. To correct this, we provide two more properties, offset and targetOffset.

    -

    new Tether({
    +

    new Tether({
       element: yellowBox,
       target: greenBox,
       attachment: 'top right',
    @@ -113,7 +123,7 @@ 

    Offset

    As you can see, we've moved the attachment point of the element 10px to the right. We can also move the attachment point of the target:

    -

    new Tether({
    +

    new Tether({
       element: yellowBox,
       target: greenBox,
       attachment: 'top right',
    @@ -125,7 +135,7 @@ 

    Offset

    The offset properties also accept percentages. Percentages in offset refer to the height and width of the element, targetOffset the height and width of the target.

    -

    new Tether({
    +

    new Tether({
       element: yellowBox,
       target: greenBox,
       attachment: 'top right',
    @@ -134,13 +144,42 @@ 

    Offset

    });

    The syntax of the offset properties is "vertical-offset horizontal-offset"

    +

    Tether offers a couple of special attachments, using the targetModifier +option:

    +

    new Tether({
    +  element: yellowBox,
    +  target: scrollBox,
    +  attachment: 'middle right',
    +  targetAttachment: 'middle left',
    +  targetModifier: 'scroll-handle'
    +});
    +

    +

    Set the target to document.body to have the element follow the page's scroll bar.

    +

    The targetModifier visible can be used to attach an element to the visible part +of an element:

    +

    new Tether({
    +  element: yellowBox,
    +  target: document.body,
    +  attachment: 'middle center',
    +  targetAttachment: 'middle center',
    +  targetModifier: 'visible'
    +});
    +

    +

    new Tether({
    +  element: yellowBox,
    +  target: scrollBox,
    +  attachment: 'middle center',
    +  targetAttachment: 'middle center',
    +  targetModifier: 'visible'
    +});
    +

    Constraints

    If you have tried any of the previous examples, you'll notice that it's pretty easy to scroll the regions in such a way that the element is hanging out on it's own, with no target in sight.

    Constraints allow you to control what happens when the tethered element would have to fall outside of a defined region to maintain the attachment.

    -

    new Tether({
    +

    new Tether({
       element: yellowBox,
       target: greenBox,
       attachment: 'middle left',
    @@ -157,7 +196,7 @@ 

    Constraints

    parent by 'pinning' it to the edges if it tries to escape. For the sake of the example, we're also highlighting the pinned edge in red.

    Specify an array of sides if you'd only like to pin those edges:

    -

    new Tether({
    +

    new Tether({
       element: yellowBox,
       target: greenBox,
       attachment: 'middle left',
    @@ -172,7 +211,7 @@ 

    Constraints

    You might want to allow the element to change it's attachment, if doing so would keep more of it within it's assigned region:

    -

    new Tether({
    +

    new Tether({
       element: yellowBox,
       target: greenBox,
       attachment: 'top left',
    @@ -187,7 +226,7 @@ 

    Constraints

    If you scroll the example a bit, you'll see it flip the attachment when necessary. You can combine pin and attachment as well:

    -

    new Tether({
    +

    new Tether({
       element: yellowBox,
       target: greenBox,
       attachment: 'top left',
    @@ -211,7 +250,7 @@ 

    Constraints

  • none: Don't allow changes to attachment (the default)
  • Together is the option you will use most commonly:

    -

    new Tether({
    +

    new Tether({
       element: yellowBox,
       target: greenBox,
       attachment: 'top right',
    @@ -226,7 +265,7 @@ 

    Constraints

    You can also provide different settings for the horizontal and vertical attachments:

    -

    new Tether({
    +

    new Tether({
       element: yellowBox,
       target: greenBox,
       attachment: 'top left',
    @@ -242,7 +281,7 @@ 

    Constraints

    Whenever the element is out of the constrained area, we add the tether-out-of-bounds class to it. If you add some CSS to make items with that class display: none, the tether will hide.

    -

    new Tether({
    +

    new Tether({
       element: yellowBox,
       target: greenBox,
       attachment: 'middle center',
    @@ -255,9 +294,8 @@ 

    Constraints

    });

    You can also constrain the element to the viewport, you'll have to scroll the -page to see this one. You can, of course, use pin with the window as well to -make it always visible no matter where the user scrolls.

    -

    new Tether({
    +page to see this one.

    +

    new Tether({
       element: yellowBox,
       target: greenBox,
       attachment: 'top left',
    @@ -269,7 +307,23 @@ 

    Constraints

    } ] }); -

    +

    +

    You can, of course, use pin with the window as well to +make it always visible no matter where the user scrolls:

    +

    new Tether({
    +  element: yellowBox,
    +  target: greenBox,
    +  attachment: 'top left',
    +  targetAttachment: 'bottom left',
    +  constraints: [
    +    {
    +      to: 'window',
    +      attachment: 'together',
    +      pin: true
    +    }
    +  ]
    +});
    +

    to can be any of:

    • 'scrollParent'
    • @@ -279,7 +333,7 @@

      Constraints

    You can also provide multiple constraints, keeping in mind that they are processed in the order supplied (the last one always has the final word).

    -

    new Tether({
    +

    new Tether({
       element: yellowBox,
       target: greenBox,
       attachment: 'top left',
    @@ -297,6 +351,7 @@ 

    Constraints

    });

    Optimization

    +

    Element Moving

    The goal of Tether's optimizer is to not have to change the positioning CSS as the page is scrolled or resized. To accomplish this it looks at the last few positions, finds commonalities, and uses them to decide whether to @@ -304,7 +359,7 @@

    Optimization

    If the element is fully contained within it's scroll parent, its DOM node can also be moved inside the scroll parent, to avoid repaints as the container is scrolled.

    -

    new Tether({
    +

    new Tether({
       element: yellowBox,
       target: greenBox,
       attachment: 'top left',
    @@ -319,7 +374,7 @@ 

    Optimization

    If you do see stylistic changes occur when the element is moved, you might want to disable this optimization. You can do that by setting optimizations.moveElement to false.

    -

    new Tether({
    +

    new Tether({
       element: yellowBox,
       target: greenBox,
       attachment: 'top left',
    @@ -329,6 +384,22 @@ 

    Optimization

    } });

    +

    GPU

    +

    By default tether positions elements using CSS transforms. These transforms allow the +tethered element to be moved as it's own layer to not force a repaint of the underlying +page.

    +

    This method of positioning can cause some issues however, including color shifts and artifacts.

    +

    If you experience these issues, you can disable this optimization by setting optimizations.gpu +to false:

    +

    new Tether({
    +  element: yellowBox,
    +  target: greenBox,
    +  attachment: 'top left',
    +  optimizations: {
    +    gpu: false
    +  }
    +});
    +

    Methods

    The Tether constructor we've been using in these examples returns us a Tether object.

    @@ -344,8 +415,8 @@

    Options

    The full list of options which can be passed to the Tether constructor and setOptions:

      -
    • element: A DOM or jQuery element
    • -
    • target: A DOM or jQuery element
    • +
    • element: The DOM element, jQuery element, or a selector string of an element which will be moved
    • +
    • target: The DOM element, jQuery element, or a selector string of an element which the element will be attached to
    • attachment: A string of the form 'vert-attachment horiz-attachment'
      • vert-attachment can be any of 'top', 'middle', 'bottom'
      • horiz-attachment can be any of 'left', 'center', 'right'
      • @@ -358,8 +429,12 @@

        Options

      • vert-offset and horiz-offset can be of the form "20px" or "55%"
    • -
    • targetOffset: A string similar to offset
    • +
    • targetOffset: A string similar to offset, but refering to the offset of the target
    • +
    • targetModifier: Can be set to 'visible' or 'scroll-handle'
    • enabled: Should the tether be enabled initially? Defaults to true.
    • +
    • classes: A hash of classes which should be changed or disabled
    • +
    • classPrefix: The prefix placed at the beginning of the default classes, defaults to 'tether'
    • +
    • optimizations: A hash of optimizations, used to disable them
    • constraints: An array of constraint definition objects. Each definition is of the form:
      • to: A DOM element, bounding box, the string 'window', or the string 'scrollParent'
      • pin: true or an array of strings representing the sides of the constraint
      • @@ -375,9 +450,25 @@

        Options

      Classes

      -

      // Make classes mutable

      Tether adds a variety of classes to the element and target to allow you to style them based on their tethering.

      +

      You can change the prefix of the classes with the classPrefix option. It is 'tether' by +default, but you could, for example, change it to be 'bill' if you were building the bill +library and all the classes would be 'bill-*'.

      +
      new Tether
      +  classPrefix: 'bill'
      +

      The sass/css is similarily configurable, see +tooltip for +an example of how to make your own prefixed css file.

      +

      All classes can be changed or disabled with the classes option. For example, to change the +tether-element class to be my-box:

      +
      new Tether
      +  classes:
      +    element: 'my-box'
      +

      You can also disable classes you're not going to use:

      +
      new Tether
      +  classes:
      +    out-of-bounds: false
      • tether-element is added to the element
      • tether-target is added to the target
      • @@ -398,6 +489,38 @@
      • tether-pinned, tether-pinned-[side] are added to both the element and target when a constraint has pinned the element to the [side] of the container.
      +

      Browser Support

      +

      Tether supports IE9+, and all modern browsers.

      +

      Google doesn't support IE8, Microsoft is dropping support in a few months, and not supporting it saves +us a whole lot of trouble. If you are interested in adding support, get in touch, we're happy to accept +a PR.

      +

      Contributing

      +

      Please contribute! Tether is developed in Coffeescript, but if that's problematic for you, feel free +to submit pull requests which just change the javascript files, we can adapt them as needed.

      +

      To build Tether, you need:

      +
        +
      • Node.js
      • +
      • Ruby (for compass)
      • +
      +

      Instructions

      +
        +
      • Install compass (if you don't have it already)
      • +
      +
      gem update --system
      +gem install compass
      +
        +
      • Install the build tool
      • +
      +
      npm install -g gulp
      +
        +
      • Install the project
      • +
      +
      # In the project directory
      +npm install
      +
        +
      • Build / Watch
      • +
      +
      gulp
    \ No newline at end of file diff --git a/docs/js/intro.js b/docs/js/intro.js index 3c27236ac..47ed6e5b3 100644 --- a/docs/js/intro.js +++ b/docs/js/intro.js @@ -1,12 +1,16 @@ (function() { - var OUTPUT_HTML, SETUP_JS, getOutput, init, run, setupBlock; + var OUTPUT_HTML, SETUP_JS, activate, deactivate, getOutput, init, run, setupBlock, tethers, uniqueId; - SETUP_JS = "yellowBox = $('.yellow-box', $output);\ngreenBox = $('.green-box', $output);"; + uniqueId = Tether.Utils.uniqueId; + + SETUP_JS = "yellowBox = $('.yellow-box', $output);\ngreenBox = $('.green-box', $output);\nscrollBox = $('.scroll-box', $output);"; OUTPUT_HTML = function(key) { return "
    \n
    \n
    \n
    \n
    \n
    "; }; + tethers = {}; + getOutput = function($block) { var key; key = $block.data('example'); @@ -24,19 +28,24 @@ } else { $block = key; } + key = $block.attr('data-example'); $output = getOutput($block); code = $block.text(); - if (code.indexOf(SETUP_JS) === -1) { - code = SETUP_JS + code; - } + code = SETUP_JS + code; window.$output = $output; - return eval(code); + return tethers[key] = eval(code); }; setupBlock = function($block) { var $output, $scrollBox, $scrollContent, key; key = $block.data('example'); $output = getOutput($block); + if (!key) { + key = uniqueId(); + $block.attr('data-example', key); + $output.attr('data-example', key); + $output.find('.tether-element').attr('data-example', key); + } $output.html(OUTPUT_HTML(key)); $scrollBox = $output.find('.scroll-box'); $scrollContent = $scrollBox.find('.scroll-content'); @@ -48,7 +57,44 @@ }); }); $scrollBox.css('height', "" + ($block.parent().outerHeight()) + "px"); - return run($block); + if ($output.attr('deactivated') == null) { + return run($block); + } + }; + + $(document.body).on('click', function(e) { + if ($(e.target).is('output[deactivated]')) { + activate($(e.target)); + return false; + } else if ($(e.target).is('output[activated]')) { + deactivate($(e.target)); + return false; + } + }); + + activate = function($output) { + var $block, key; + $block = $output.prev().find('code'); + run($block); + $output.find('.tether-element').show(); + key = $output.data('example'); + $(tethers[key].element).show(); + tethers[key].enable(); + $output.removeAttr('deactivated'); + return $output.attr('activated', true); + }; + + deactivate = function($output) { + var $block, $el, key; + $block = $output.prev().find('code'); + key = $output.data('example'); + tethers[key].disable(); + $el = $(tethers[key].element); + $el.detach(); + $output.find('.scroll-content').append($el); + $el.hide(); + $output.removeAttr('activated'); + return $output.attr('deactivated', true); }; init = function() { diff --git a/docs/welcome/browser-demo.html b/docs/welcome/browser-demo.html index 79280ebd3..4915b7783 100644 --- a/docs/welcome/browser-demo.html +++ b/docs/welcome/browser-demo.html @@ -6,12 +6,11 @@ - + - - + @@ -66,15 +65,12 @@
    - - - - - - - + + - + + + - \ No newline at end of file + diff --git a/docs/welcome/coffee/welcome.coffee b/docs/welcome/coffee/welcome.coffee index cfc596771..a43160214 100644 --- a/docs/welcome/coffee/welcome.coffee +++ b/docs/welcome/coffee/welcome.coffee @@ -1,29 +1,15 @@ -isMobile = $(window).width() < 567 - -MIRROR_ATTACH = - left: 'right' - right: 'left' - top: 'bottom' - bottom: 'top' - middle: 'middle' - center: 'center' - -sortAttach = (str) -> - [first, second] = str.split(' ') +_Drop = Drop.createContext classPrefix: 'tether' - if first in ['left', 'right'] - [first, second] = [second, first] - - [first, second].join(' ') +isMobile = $(window).width() < 567 init = -> - # setupHero() + setupHero() setupBrowserDemo() setupHero = -> $target = $('.tether-target-demo') - targetAttachments = [ + positions = [ 'top left' 'left top' 'left middle' @@ -39,7 +25,7 @@ setupHero = -> ] if isMobile - targetAttachments = [ + positions = [ 'top left' 'bottom left' 'bottom right' @@ -48,46 +34,31 @@ setupHero = -> window.drops = {} - for targetAttachment in targetAttachments - dropAttach = targetAttachment.split(' ') - dropAttach[0] = MIRROR_ATTACH[dropAttach[0]] - dropAttach = dropAttach.join(' ') - - drops[targetAttachment] = new Tether + for position in positions + drops[position] = new _Drop target: $target[0] - element: $ '
    ' - className: 'tooltip-theme-arrows' - classPrefix: 'tooltip' - enabled: false - offset: '0 0' - targetOffset: '0 0' - attachment: sortAttach(dropAttach) - targetAttachment: sortAttach(targetAttachment) - constraints: [ - to: 'window' - pin: true - attachment: 'together' - ] - - # TODO - remove once zackbloom fixes - $(drops[targetAttachment].drop).addClass "drop-attached-#{ targetAttachment.replace(' ', '-')}" + classes: 'tether-theme-arrows-dark' + position: position + constrainToWindow: false + openOn: '' + content: '
    ' openIndex = 0 frames = 0 frameLengthMS = 10 openAllDrops = -> - for targetAttachment, drop of drops + for position, drop of drops drop.open() openNextDrop = -> - for targetAttachment, drop of drops + for position, drop of drops drop.close() - drops[targetAttachments[openIndex]].open() - drops[targetAttachments[(openIndex + 6) % targetAttachments.length]].open() + drops[positions[openIndex]].open() + drops[positions[(openIndex + 6) % positions.length]].open() - openIndex = (openIndex + 1) % targetAttachments.length + openIndex = (openIndex + 1) % positions.length if frames > 5 finalDropState() @@ -98,14 +69,17 @@ setupHero = -> setTimeout openNextDrop, frameLengthMS * frames finalDropState = -> - drops['top left'].$dropContent.html('Marrying DOM elements for life.') - drops['bottom right'].$dropContent.html('★ On Github') + $(drops['top left'].dropContent).html('Marrying DOM elements for life.') + $(drops['bottom right'].dropContent).html('★ On Github') drops['top left'].open() drops['bottom right'].open() - if isMobile + if true or isMobile drops['top left'].open() + drops['top left'].tether.position() drops['bottom right'].open() + drops['bottom right'].tether.position() + finalDropState() else openNextDrop() @@ -161,17 +135,15 @@ setupBrowserDemo = -> $items.each (i) -> $item = $(@) - drop = new iframeWindow.Tether + _iframeWindowDrop = iframeWindow.Drop.createContext classPrefix: 'tether' + + drop = new _iframeWindowDrop target: $item[0] - className: 'drop-theme-arrows' - targetAttach: 'right top' - attach: 'left top' - constraints: [ - to: 'window' - pin: true - attachment: 'together' - ] - element: $ ''' + classes: 'tether-theme-arrows-dark' + position: 'right top' + constrainToWindow: true + openOn: 'click' + content: '''
    • Action 1
    • Action 2
    • @@ -181,9 +153,6 @@ setupBrowserDemo = -> $item.data('drop', drop) - # TODO - remove once zackbloom fixes - drop.$drop.addClass "drop-attached-right-top" - scrollInterval = undefined scrollTop = 0 scrollTopDirection = 1 @@ -240,4 +209,4 @@ setupBrowserDemo = -> openExampleItem() stopScrollingLeftSection() -init() +init() \ No newline at end of file diff --git a/docs/welcome/css/browser-demo.css b/docs/welcome/css/browser-demo.css index 52278ce53..c41b02012 100644 --- a/docs/welcome/css/browser-demo.css +++ b/docs/welcome/css/browser-demo.css @@ -3,16 +3,18 @@ html, body { overflow: hidden; font-family: "proxima-nova", sans-serif; } -.drop.drop-theme-arrows .drop-content { - background: black; - -webkit-filter: none; } - .drop.drop-theme-arrows .drop-content ul { +.tether.tether-theme-arrows-dark .tether-content { + -webkit-filter: none; + -moz-filter: none; + filter: none; + background: black; } + .tether.tether-theme-arrows-dark .tether-content ul { color: white; list-style: none; padding: 0; margin: 0; } -.drop.drop-theme-arrows.tether-element-attached-top.tether-element-attached-left.tether-target-attached-right .drop-content:before { +.tether.tether-theme-arrows-dark.tether-element-attached-top.tether-element-attached-left.tether-target-attached-right .tether-content:before { border-right-color: black; } .browser-demo { @@ -47,7 +49,7 @@ html, body { height: 64px; border-bottom: 1px solid rgba(0, 0, 0, 0.1); cursor: pointer; } - .browser-demo .bottom .left .item:hover, .browser-demo .bottom .left .item.drop-open { + .browser-demo .bottom .left .item:hover, .browser-demo .bottom .left .item.tether-open { background: rgba(0, 0, 0, 0.1); border-bottom: 1px solid rgba(0, 0, 0, 0); } .browser-demo .bottom .left .item:last-child { diff --git a/docs/welcome/css/welcome.css b/docs/welcome/css/welcome.css index edf018c9f..7db9b3b5d 100644 --- a/docs/welcome/css/welcome.css +++ b/docs/welcome/css/welcome.css @@ -17,12 +17,13 @@ body { cursor: pointer; width: 140px; font-size: 0.8em; - line-height: 1.3em; } + line-height: 1.3em; + text-align: center; } -.drop.drop-tooltip-theme-arrows .drop-content { +.tether-element.tether-theme-arrows-dark .tether-content { padding: 1em; font-size: 1.1em; } - .drop.drop-tooltip-theme-arrows .drop-content .button { + .tether-element.tether-theme-arrows-dark .tether-content .button { border-color: white; color: white; width: 170px; diff --git a/docs/welcome/index.html b/docs/welcome/index.html index 35da77147..ee71a1035 100644 --- a/docs/welcome/index.html +++ b/docs/welcome/index.html @@ -7,15 +7,13 @@ - + - - + - @@ -169,7 +167,7 @@

      Help us spread the word.

    -

    -

    -

    -

    -

    +

    Tether

    A client-side library to make absolutely positioned elements attach to elements in the page efficiently.

    0.5.2

    +

    +

    Tether

    @@ -45,7 +43,19 @@

    Tether

    exceedes those constraints it can be pinned to the edge, flip to the other side of it's target, or hide itself.

    Tether optimizes it's location placement to result in the minimum amount of -'jankyness' as the page is scrolled and resized.

    +'jankyness' as the page is scrolled and resized. The page can maintain 60fps +scrolling even with dozens or hundreds of tethers on screen (pop open the +devtools timeline as you scroll this page).

    +

    Tether is 5kb minified and gzipped, and supports IE9+, and all modern +browsers.

    +

    Projects Built With Tether

    +

    +Select +Drop +Tooltip +Shepherd +

    +

    Usage

    The element to be moved is called the 'element'. The element in the page it's to be attached to is called the 'target'.

    @@ -54,7 +64,7 @@

    Usage

    That point is called the attachment (we've marked it in the examples with a red ). For example, if you'd like the element to sit on the left of the target:

    -

    new Tether({
    +

    new Tether({
       element: yellowBox,
       target: greenBox,
       attachment: 'top right',
    @@ -64,7 +74,7 @@ 

    Usage

    Attachment

    You can move the attachment points of both the element and the target.

    For example, lets move the element's attachment:

    -

    new Tether({
    +

    new Tether({
       element: yellowBox,
       target: greenBox,
       attachment: 'bottom left',
    @@ -72,7 +82,7 @@ 

    Attachment

    });

    We can also change the target's attachment point:

    -

    new Tether({
    +

    new Tether({
       element: yellowBox,
       target: greenBox,
       attachment: 'bottom left',
    @@ -80,7 +90,7 @@ 

    Attachment

    });

    There are two more attachment points we haven't seen yet, center and middle:

    -

    new Tether({
    +

    new Tether({
       element: yellowBox,
       target: greenBox,
       attachment: 'middle center',
    @@ -103,7 +113,7 @@ 

    Offset

    The six attachment points we provide are not always enough to place the element exactly where you want it. To correct this, we provide two more properties, offset and targetOffset.

    -

    new Tether({
    +

    new Tether({
       element: yellowBox,
       target: greenBox,
       attachment: 'top right',
    @@ -113,7 +123,7 @@ 

    Offset

    As you can see, we've moved the attachment point of the element 10px to the right. We can also move the attachment point of the target:

    -

    new Tether({
    +

    new Tether({
       element: yellowBox,
       target: greenBox,
       attachment: 'top right',
    @@ -125,7 +135,7 @@ 

    Offset

    The offset properties also accept percentages. Percentages in offset refer to the height and width of the element, targetOffset the height and width of the target.

    -

    new Tether({
    +

    new Tether({
       element: yellowBox,
       target: greenBox,
       attachment: 'top right',
    @@ -134,13 +144,42 @@ 

    Offset

    });

    The syntax of the offset properties is "vertical-offset horizontal-offset"

    +

    Tether offers a couple of special attachments, using the targetModifier +option:

    +

    new Tether({
    +  element: yellowBox,
    +  target: scrollBox,
    +  attachment: 'middle right',
    +  targetAttachment: 'middle left',
    +  targetModifier: 'scroll-handle'
    +});
    +

    +

    Set the target to document.body to have the element follow the page's scroll bar.

    +

    The targetModifier visible can be used to attach an element to the visible part +of an element:

    +

    new Tether({
    +  element: yellowBox,
    +  target: document.body,
    +  attachment: 'middle center',
    +  targetAttachment: 'middle center',
    +  targetModifier: 'visible'
    +});
    +

    +

    new Tether({
    +  element: yellowBox,
    +  target: scrollBox,
    +  attachment: 'middle center',
    +  targetAttachment: 'middle center',
    +  targetModifier: 'visible'
    +});
    +

    Constraints

    If you have tried any of the previous examples, you'll notice that it's pretty easy to scroll the regions in such a way that the element is hanging out on it's own, with no target in sight.

    Constraints allow you to control what happens when the tethered element would have to fall outside of a defined region to maintain the attachment.

    -

    new Tether({
    +

    new Tether({
       element: yellowBox,
       target: greenBox,
       attachment: 'middle left',
    @@ -157,7 +196,7 @@ 

    Constraints

    parent by 'pinning' it to the edges if it tries to escape. For the sake of the example, we're also highlighting the pinned edge in red.

    Specify an array of sides if you'd only like to pin those edges:

    -

    new Tether({
    +

    new Tether({
       element: yellowBox,
       target: greenBox,
       attachment: 'middle left',
    @@ -172,7 +211,7 @@ 

    Constraints

    You might want to allow the element to change it's attachment, if doing so would keep more of it within it's assigned region:

    -

    new Tether({
    +

    new Tether({
       element: yellowBox,
       target: greenBox,
       attachment: 'top left',
    @@ -187,7 +226,7 @@ 

    Constraints

    If you scroll the example a bit, you'll see it flip the attachment when necessary. You can combine pin and attachment as well:

    -

    new Tether({
    +

    new Tether({
       element: yellowBox,
       target: greenBox,
       attachment: 'top left',
    @@ -211,7 +250,7 @@ 

    Constraints

  • none: Don't allow changes to attachment (the default)
  • Together is the option you will use most commonly:

    -

    new Tether({
    +

    new Tether({
       element: yellowBox,
       target: greenBox,
       attachment: 'top right',
    @@ -226,7 +265,7 @@ 

    Constraints

    You can also provide different settings for the horizontal and vertical attachments:

    -

    new Tether({
    +

    new Tether({
       element: yellowBox,
       target: greenBox,
       attachment: 'top left',
    @@ -242,7 +281,7 @@ 

    Constraints

    Whenever the element is out of the constrained area, we add the tether-out-of-bounds class to it. If you add some CSS to make items with that class display: none, the tether will hide.

    -

    new Tether({
    +

    new Tether({
       element: yellowBox,
       target: greenBox,
       attachment: 'middle center',
    @@ -255,9 +294,8 @@ 

    Constraints

    });

    You can also constrain the element to the viewport, you'll have to scroll the -page to see this one. You can, of course, use pin with the window as well to -make it always visible no matter where the user scrolls.

    -

    new Tether({
    +page to see this one.

    +

    new Tether({
       element: yellowBox,
       target: greenBox,
       attachment: 'top left',
    @@ -269,7 +307,23 @@ 

    Constraints

    } ] }); -

    +

    +

    You can, of course, use pin with the window as well to +make it always visible no matter where the user scrolls:

    +

    new Tether({
    +  element: yellowBox,
    +  target: greenBox,
    +  attachment: 'top left',
    +  targetAttachment: 'bottom left',
    +  constraints: [
    +    {
    +      to: 'window',
    +      attachment: 'together',
    +      pin: true
    +    }
    +  ]
    +});
    +

    to can be any of:

    • 'scrollParent'
    • @@ -279,7 +333,7 @@

      Constraints

    You can also provide multiple constraints, keeping in mind that they are processed in the order supplied (the last one always has the final word).

    -

    new Tether({
    +

    new Tether({
       element: yellowBox,
       target: greenBox,
       attachment: 'top left',
    @@ -297,6 +351,7 @@ 

    Constraints

    });

    Optimization

    +

    Element Moving

    The goal of Tether's optimizer is to not have to change the positioning CSS as the page is scrolled or resized. To accomplish this it looks at the last few positions, finds commonalities, and uses them to decide whether to @@ -304,7 +359,7 @@

    Optimization

    If the element is fully contained within it's scroll parent, its DOM node can also be moved inside the scroll parent, to avoid repaints as the container is scrolled.

    -

    new Tether({
    +

    new Tether({
       element: yellowBox,
       target: greenBox,
       attachment: 'top left',
    @@ -319,7 +374,7 @@ 

    Optimization

    If you do see stylistic changes occur when the element is moved, you might want to disable this optimization. You can do that by setting optimizations.moveElement to false.

    -

    new Tether({
    +

    new Tether({
       element: yellowBox,
       target: greenBox,
       attachment: 'top left',
    @@ -329,6 +384,22 @@ 

    Optimization

    } });

    +

    GPU

    +

    By default tether positions elements using CSS transforms. These transforms allow the +tethered element to be moved as it's own layer to not force a repaint of the underlying +page.

    +

    This method of positioning can cause some issues however, including color shifts and artifacts.

    +

    If you experience these issues, you can disable this optimization by setting optimizations.gpu +to false:

    +

    new Tether({
    +  element: yellowBox,
    +  target: greenBox,
    +  attachment: 'top left',
    +  optimizations: {
    +    gpu: false
    +  }
    +});
    +

    Methods

    The Tether constructor we've been using in these examples returns us a Tether object.

    @@ -344,8 +415,8 @@

    Options

    The full list of options which can be passed to the Tether constructor and setOptions:

      -
    • element: A DOM or jQuery element
    • -
    • target: A DOM or jQuery element
    • +
    • element: The DOM element, jQuery element, or a selector string of an element which will be moved
    • +
    • target: The DOM element, jQuery element, or a selector string of an element which the element will be attached to
    • attachment: A string of the form 'vert-attachment horiz-attachment'
      • vert-attachment can be any of 'top', 'middle', 'bottom'
      • horiz-attachment can be any of 'left', 'center', 'right'
      • @@ -358,8 +429,12 @@

        Options

      • vert-offset and horiz-offset can be of the form "20px" or "55%"
    • -
    • targetOffset: A string similar to offset
    • +
    • targetOffset: A string similar to offset, but refering to the offset of the target
    • +
    • targetModifier: Can be set to 'visible' or 'scroll-handle'
    • enabled: Should the tether be enabled initially? Defaults to true.
    • +
    • classes: A hash of classes which should be changed or disabled
    • +
    • classPrefix: The prefix placed at the beginning of the default classes, defaults to 'tether'
    • +
    • optimizations: A hash of optimizations, used to disable them
    • constraints: An array of constraint definition objects. Each definition is of the form:
      • to: A DOM element, bounding box, the string 'window', or the string 'scrollParent'
      • pin: true or an array of strings representing the sides of the constraint
      • @@ -375,9 +450,25 @@

        Options

      Classes

      -

      // Make classes mutable

      Tether adds a variety of classes to the element and target to allow you to style them based on their tethering.

      +

      You can change the prefix of the classes with the classPrefix option. It is 'tether' by +default, but you could, for example, change it to be 'bill' if you were building the bill +library and all the classes would be 'bill-*'.

      +
      new Tether
      +  classPrefix: 'bill'
      +

      The sass/css is similarily configurable, see +tooltip for +an example of how to make your own prefixed css file.

      +

      All classes can be changed or disabled with the classes option. For example, to change the +tether-element class to be my-box:

      +
      new Tether
      +  classes:
      +    element: 'my-box'
      +

      You can also disable classes you're not going to use:

      +
      new Tether
      +  classes:
      +    out-of-bounds: false
      • tether-element is added to the element
      • tether-target is added to the target
      • @@ -398,6 +489,38 @@
      • tether-pinned, tether-pinned-[side] are added to both the element and target when a constraint has pinned the element to the [side] of the container.
      +

      Browser Support

      +

      Tether supports IE9+, and all modern browsers.

      +

      Google doesn't support IE8, Microsoft is dropping support in a few months, and not supporting it saves +us a whole lot of trouble. If you are interested in adding support, get in touch, we're happy to accept +a PR.

      +

      Contributing

      +

      Please contribute! Tether is developed in Coffeescript, but if that's problematic for you, feel free +to submit pull requests which just change the javascript files, we can adapt them as needed.

      +

      To build Tether, you need:

      +
        +
      • Node.js
      • +
      • Ruby (for compass)
      • +
      +

      Instructions

      +
        +
      • Install compass (if you don't have it already)
      • +
      +
      gem update --system
      +gem install compass
      +
        +
      • Install the build tool
      • +
      +
      npm install -g gulp
      +
        +
      • Install the project
      • +
      +
      # In the project directory
      +npm install
      +
        +
      • Build / Watch
      • +
      +
      gulp
    \ No newline at end of file diff --git a/js/abutment.js b/js/abutment.js new file mode 100644 index 000000000..476b88e9d --- /dev/null +++ b/js/abutment.js @@ -0,0 +1,59 @@ +(function() { + var defer, getBounds, updateClasses, _ref; + + _ref = Tether.Utils, getBounds = _ref.getBounds, updateClasses = _ref.updateClasses, defer = _ref.defer; + + Tether.modules.push({ + position: function(_arg) { + var abutted, addClasses, allClasses, bottom, height, left, right, side, sides, targetPos, top, width, _i, _j, _k, _l, _len, _len1, _len2, _len3, _ref1, _ref2, _ref3, _ref4, _ref5, + _this = this; + top = _arg.top, left = _arg.left; + _ref1 = this.cache('element-bounds', function() { + return getBounds(_this.element); + }), height = _ref1.height, width = _ref1.width; + targetPos = this.getTargetBounds(); + bottom = top + height; + right = left + width; + abutted = []; + if (top <= targetPos.bottom && bottom >= targetPos.top) { + _ref2 = ['left', 'right']; + for (_i = 0, _len = _ref2.length; _i < _len; _i++) { + side = _ref2[_i]; + if ((_ref3 = targetPos[side]) === left || _ref3 === right) { + abutted.push(side); + } + } + } + if (left <= targetPos.right && right >= targetPos.left) { + _ref4 = ['top', 'bottom']; + for (_j = 0, _len1 = _ref4.length; _j < _len1; _j++) { + side = _ref4[_j]; + if ((_ref5 = targetPos[side]) === top || _ref5 === bottom) { + abutted.push(side); + } + } + } + allClasses = []; + addClasses = []; + sides = ['left', 'top', 'right', 'bottom']; + allClasses.push(this.getClass('abutted')); + for (_k = 0, _len2 = sides.length; _k < _len2; _k++) { + side = sides[_k]; + allClasses.push("" + (this.getClass('abutted')) + "-" + side); + } + if (abutted.length) { + addClasses.push(this.getClass('abutted')); + } + for (_l = 0, _len3 = abutted.length; _l < _len3; _l++) { + side = abutted[_l]; + addClasses.push("" + (this.getClass('abutted')) + "-" + side); + } + defer(function() { + updateClasses(_this.target, addClasses, allClasses); + return updateClasses(_this.element, addClasses, allClasses); + }); + return true; + } + }); + +}).call(this); diff --git a/constraint.js b/js/constraint.js similarity index 74% rename from constraint.js rename to js/constraint.js index d003598d3..5feff43e1 100644 --- a/constraint.js +++ b/js/constraint.js @@ -1,8 +1,8 @@ (function() { - var BOUNDS_FORMAT, MIRROR_ATTACH, extend, getBoundingRect, getBounds, getOuterSize, getSize, _ref, + var BOUNDS_FORMAT, MIRROR_ATTACH, defer, extend, getBoundingRect, getBounds, getOuterSize, getSize, updateClasses, _ref, __indexOf = [].indexOf || function(item) { for (var i = 0, l = this.length; i < l; i++) { if (i in this && this[i] === item) return i; } return -1; }; - _ref = Tether.Utils, getOuterSize = _ref.getOuterSize, getBounds = _ref.getBounds, getSize = _ref.getSize, extend = _ref.extend; + _ref = Tether.Utils, getOuterSize = _ref.getOuterSize, getBounds = _ref.getBounds, getSize = _ref.getSize, extend = _ref.extend, updateClasses = _ref.updateClasses, defer = _ref.defer; MIRROR_ATTACH = { left: 'right', @@ -21,16 +21,20 @@ } else if (to === 'window') { to = [pageXOffset, pageYOffset, innerWidth + pageXOffset, innerHeight + pageYOffset]; } + if (to === document) { + to = to.documentElement; + } if (to.nodeType != null) { pos = size = getBounds(to); style = getComputedStyle(to); to = [pos.left, pos.top, size.width + pos.left, size.height + pos.top]; for (i = _i = 0, _len = BOUNDS_FORMAT.length; _i < _len; i = ++_i) { side = BOUNDS_FORMAT[i]; - if (side === 'top' || side === 'left') { - to[i] += parseFloat(style["border-" + side + "-width"]); + side = side[0].toUpperCase() + side.substr(1); + if (side === 'Top' || side === 'Left') { + to[i] += parseFloat(style["border" + side + "Width"]); } else { - to[i] -= parseFloat(style["border-" + side + "-width"]); + to[i] -= parseFloat(style["border" + side + "Width"]); } } } @@ -39,7 +43,7 @@ Tether.modules.push({ position: function(_arg) { - var attachment, bounds, changeAttachX, changeAttachY, cls, constraint, eAttachment, height, left, oob, oobClass, p, pin, pinned, pinnedClass, removeClass, removeClasses, side, tAttachment, targetAttachment, targetHeight, targetSize, targetWidth, to, top, width, _i, _j, _k, _l, _len, _len1, _len2, _len3, _len4, _m, _ref1, _ref2, _ref3, _ref4, _ref5, _ref6, + var addClasses, allClasses, attachment, bounds, changeAttachX, changeAttachY, cls, constraint, eAttachment, height, left, oob, oobClass, p, pin, pinned, pinnedClass, removeClass, side, tAttachment, targetAttachment, targetHeight, targetSize, targetWidth, to, top, width, _i, _j, _k, _l, _len, _len1, _len2, _len3, _len4, _len5, _m, _n, _ref1, _ref2, _ref3, _ref4, _ref5, _ref6, _ref7, _ref8, _this = this; top = _arg.top, left = _arg.left, targetAttachment = _arg.targetAttachment; if (!this.options.constraints) { @@ -58,6 +62,9 @@ _ref1 = this.cache('element-bounds', function() { return getBounds(_this.element); }), height = _ref1.height, width = _ref1.width; + if (width === 0 && height === 0 && (this.lastSize != null)) { + _ref2 = this.lastSize, width = _ref2.width, height = _ref2.height; + } targetSize = this.cache('target-bounds', function() { return _this.getTargetBounds(); }); @@ -65,32 +72,37 @@ targetWidth = targetSize.width; tAttachment = {}; eAttachment = {}; - removeClasses = [this.getClass('pinned'), this.getClass('out-of-bounds')]; - _ref2 = this.options.constraints; - for (_i = 0, _len = _ref2.length; _i < _len; _i++) { - constraint = _ref2[_i]; + allClasses = [this.getClass('pinned'), this.getClass('out-of-bounds')]; + _ref3 = this.options.constraints; + for (_i = 0, _len = _ref3.length; _i < _len; _i++) { + constraint = _ref3[_i]; if (constraint.outOfBoundsClass) { - removeClasses.push(constraint.outOfBoundsClass); + allClasses.push(constraint.outOfBoundsClass); } if (constraint.pinnedClass) { - removeClasses.push(constraint.pinnedClass); + allClasses.push(constraint.pinnedClass); } } - for (_j = 0, _len1 = removeClasses.length; _j < _len1; _j++) { - cls = removeClasses[_j]; - removeClass(cls); + for (_j = 0, _len1 = allClasses.length; _j < _len1; _j++) { + cls = allClasses[_j]; + _ref4 = ['left', 'top', 'right', 'bottom']; + for (_k = 0, _len2 = _ref4.length; _k < _len2; _k++) { + side = _ref4[_k]; + allClasses.push("" + cls + "-" + side); + } } + addClasses = []; tAttachment = extend({}, targetAttachment); eAttachment = extend({}, this.attachment); - _ref3 = this.options.constraints; - for (_k = 0, _len2 = _ref3.length; _k < _len2; _k++) { - constraint = _ref3[_k]; + _ref5 = this.options.constraints; + for (_l = 0, _len3 = _ref5.length; _l < _len3; _l++) { + constraint = _ref5[_l]; to = constraint.to, attachment = constraint.attachment, pin = constraint.pin; if (attachment == null) { attachment = ''; } if (__indexOf.call(attachment, ' ') >= 0) { - _ref4 = attachment.split(' '), changeAttachY = _ref4[0], changeAttachX = _ref4[1]; + _ref6 = attachment.split(' '), changeAttachY = _ref6[0], changeAttachX = _ref6[1]; } else { changeAttachX = changeAttachY = attachment; } @@ -192,11 +204,11 @@ } if (typeof pin === 'string') { pin = (function() { - var _l, _len3, _ref5, _results; - _ref5 = pin.split(','); + var _len4, _m, _ref7, _results; + _ref7 = pin.split(','); _results = []; - for (_l = 0, _len3 = _ref5.length; _l < _len3; _l++) { - p = _ref5[_l]; + for (_m = 0, _len4 = _ref7.length; _m < _len4; _m++) { + p = _ref7[_m]; _results.push(p.trim()); } return _results; @@ -240,19 +252,19 @@ } } if (pinned.length) { - pinnedClass = (_ref5 = this.options.pinnedClass) != null ? _ref5 : this.getClass('pinned'); - this.addClass(pinnedClass); - for (_l = 0, _len3 = pinned.length; _l < _len3; _l++) { - side = pinned[_l]; - this.addClass("" + pinnedClass + "-" + side); + pinnedClass = (_ref7 = this.options.pinnedClass) != null ? _ref7 : this.getClass('pinned'); + addClasses.push(pinnedClass); + for (_m = 0, _len4 = pinned.length; _m < _len4; _m++) { + side = pinned[_m]; + addClasses.push("" + pinnedClass + "-" + side); } } if (oob.length) { - oobClass = (_ref6 = this.options.outOfBoundsClass) != null ? _ref6 : this.getClass('out-of-bounds'); - this.addClass(oobClass); - for (_m = 0, _len4 = oob.length; _m < _len4; _m++) { - side = oob[_m]; - this.addClass("" + oobClass + "-" + side); + oobClass = (_ref8 = this.options.outOfBoundsClass) != null ? _ref8 : this.getClass('out-of-bounds'); + addClasses.push(oobClass); + for (_n = 0, _len5 = oob.length; _n < _len5; _n++) { + side = oob[_n]; + addClasses.push("" + oobClass + "-" + side); } } if (__indexOf.call(pinned, 'left') >= 0 || __indexOf.call(pinned, 'right') >= 0) { @@ -265,6 +277,10 @@ this.updateAttachClasses(eAttachment, tAttachment); } } + defer(function() { + updateClasses(_this.target, addClasses, allClasses); + return updateClasses(_this.element, addClasses, allClasses); + }); return { top: top, left: left diff --git a/markAttachment.js b/js/markAttachment.js similarity index 98% rename from markAttachment.js rename to js/markAttachment.js index c4246800c..69524fe32 100644 --- a/markAttachment.js +++ b/js/markAttachment.js @@ -1,8 +1,4 @@ (function() { - var $; - - $ = jQuery; - Tether.modules.push({ initialize: function() { var dot, el, type, _i, _len, _ref, _results; diff --git a/shift.js b/js/shift.js similarity index 100% rename from shift.js rename to js/shift.js diff --git a/js/tether.js b/js/tether.js new file mode 100644 index 000000000..e4fc3e5c5 --- /dev/null +++ b/js/tether.js @@ -0,0 +1,673 @@ +(function() { + var MIRROR_LR, MIRROR_TB, OFFSET_MAP, addClass, addOffset, attachmentToOffset, autoToFixedAttachment, defer, extend, flush, getBounds, getOffsetParent, getOuterSize, getScrollParent, getSize, now, offsetToPx, parseAttachment, parseOffset, position, removeClass, tethers, transformKey, updateClasses, within, _Tether, _ref, + __slice = [].slice, + __bind = function(fn, me){ return function(){ return fn.apply(me, arguments); }; }; + + if (typeof Tether === "undefined" || Tether === null) { + throw new Error("You must include the utils.js file before tether.js"); + } + + _ref = Tether.Utils, getScrollParent = _ref.getScrollParent, getSize = _ref.getSize, getOuterSize = _ref.getOuterSize, getBounds = _ref.getBounds, getOffsetParent = _ref.getOffsetParent, extend = _ref.extend, addClass = _ref.addClass, removeClass = _ref.removeClass, updateClasses = _ref.updateClasses, defer = _ref.defer, flush = _ref.flush; + + within = function(a, b, diff) { + if (diff == null) { + diff = 1; + } + return (a + diff >= b && b >= a - diff); + }; + + transformKey = (function() { + var el, key, _i, _len, _ref1; + el = document.createElement('div'); + _ref1 = ['transform', 'webkitTransform', 'OTransform', 'MozTransform', 'msTransform']; + for (_i = 0, _len = _ref1.length; _i < _len; _i++) { + key = _ref1[_i]; + if (el.style[key] !== void 0) { + return key; + } + } + })(); + + tethers = []; + + position = function() { + var tether, _i, _len; + for (_i = 0, _len = tethers.length; _i < _len; _i++) { + tether = tethers[_i]; + tether.position(false); + } + return flush(); + }; + + now = function() { + var _ref1; + return (_ref1 = typeof performance !== "undefined" && performance !== null ? typeof performance.now === "function" ? performance.now() : void 0 : void 0) != null ? _ref1 : +(new Date); + }; + + (function() { + var event, lastCall, lastDuration, pendingTimeout, tick, _i, _len, _ref1, _results; + lastCall = null; + lastDuration = null; + pendingTimeout = null; + tick = function() { + if ((lastDuration != null) && lastDuration > 16) { + lastDuration = Math.min(lastDuration - 16, 250); + pendingTimeout = setTimeout(tick, 250); + return; + } + if ((lastCall != null) && (now() - lastCall) < 10) { + return; + } + if (pendingTimeout != null) { + clearTimeout(pendingTimeout); + pendingTimeout = null; + } + lastCall = now(); + position(); + return lastDuration = now() - lastCall; + }; + _ref1 = ['resize', 'scroll', 'touchmove']; + _results = []; + for (_i = 0, _len = _ref1.length; _i < _len; _i++) { + event = _ref1[_i]; + _results.push(window.addEventListener(event, tick)); + } + return _results; + })(); + + MIRROR_LR = { + center: 'center', + left: 'right', + right: 'left' + }; + + MIRROR_TB = { + middle: 'middle', + top: 'bottom', + bottom: 'top' + }; + + OFFSET_MAP = { + top: 0, + left: 0, + middle: '50%', + center: '50%', + bottom: '100%', + right: '100%' + }; + + autoToFixedAttachment = function(attachment, relativeToAttachment) { + var left, top; + left = attachment.left, top = attachment.top; + if (left === 'auto') { + left = MIRROR_LR[relativeToAttachment.left]; + } + if (top === 'auto') { + top = MIRROR_TB[relativeToAttachment.top]; + } + return { + left: left, + top: top + }; + }; + + attachmentToOffset = function(attachment) { + var _ref1, _ref2; + return { + left: (_ref1 = OFFSET_MAP[attachment.left]) != null ? _ref1 : attachment.left, + top: (_ref2 = OFFSET_MAP[attachment.top]) != null ? _ref2 : attachment.top + }; + }; + + addOffset = function() { + var left, offsets, out, top, _i, _len, _ref1; + offsets = 1 <= arguments.length ? __slice.call(arguments, 0) : []; + out = { + top: 0, + left: 0 + }; + for (_i = 0, _len = offsets.length; _i < _len; _i++) { + _ref1 = offsets[_i], top = _ref1.top, left = _ref1.left; + if (typeof top === 'string') { + top = parseFloat(top, 10); + } + if (typeof left === 'string') { + left = parseFloat(left, 10); + } + out.top += top; + out.left += left; + } + return out; + }; + + offsetToPx = function(offset, size) { + if (typeof offset.left === 'string' && offset.left.indexOf('%') !== -1) { + offset.left = parseFloat(offset.left, 10) / 100 * size.width; + } + if (typeof offset.top === 'string' && offset.top.indexOf('%') !== -1) { + offset.top = parseFloat(offset.top, 10) / 100 * size.height; + } + return offset; + }; + + parseAttachment = parseOffset = function(value) { + var left, top, _ref1; + _ref1 = value.split(' '), top = _ref1[0], left = _ref1[1]; + return { + top: top, + left: left + }; + }; + + _Tether = (function() { + _Tether.modules = []; + + function _Tether(options) { + this.position = __bind(this.position, this); + var module, _i, _len, _ref1, _ref2; + tethers.push(this); + this.history = []; + this.setOptions(options, false); + _ref1 = Tether.modules; + for (_i = 0, _len = _ref1.length; _i < _len; _i++) { + module = _ref1[_i]; + if ((_ref2 = module.initialize) != null) { + _ref2.call(this); + } + } + this.position(); + } + + _Tether.prototype.getClass = function(key) { + var _ref1, _ref2; + if ((_ref1 = this.options.classes) != null ? _ref1[key] : void 0) { + return this.options.classes[key]; + } else if (((_ref2 = this.options.classes) != null ? _ref2[key] : void 0) !== false) { + if (this.options.classPrefix) { + return "" + this.options.classPrefix + "-" + key; + } else { + return key; + } + } else { + return ''; + } + }; + + _Tether.prototype.setOptions = function(options, position) { + var defaults, key, _i, _len, _ref1, _ref2; + this.options = options; + if (position == null) { + position = true; + } + defaults = { + offset: '0 0', + targetOffset: '0 0', + targetAttachment: 'auto auto', + classPrefix: 'tether' + }; + this.options = extend(defaults, this.options); + _ref1 = this.options, this.element = _ref1.element, this.target = _ref1.target, this.targetModifier = _ref1.targetModifier; + if (this.target === 'viewport') { + this.target = document.body; + this.targetModifier = 'visible'; + } else if (this.target === 'scroll-handle') { + this.target = document.body; + this.targetModifier = 'scroll-handle'; + } + _ref2 = ['element', 'target']; + for (_i = 0, _len = _ref2.length; _i < _len; _i++) { + key = _ref2[_i]; + if (this[key] == null) { + throw new Error("Tether Error: Both element and target must be defined"); + } + if (this[key].jquery != null) { + this[key] = this[key][0]; + } else if (typeof this[key] === 'string') { + this[key] = document.querySelector(this[key]); + } + } + addClass(this.element, this.getClass('element')); + addClass(this.target, this.getClass('target')); + if (!this.options.attachment) { + throw new Error("Tether Error: You must provide an attachment"); + } + this.targetAttachment = parseAttachment(this.options.targetAttachment); + this.attachment = parseAttachment(this.options.attachment); + this.offset = parseOffset(this.options.offset); + this.targetOffset = parseOffset(this.options.targetOffset); + if (this.scrollParent != null) { + this.disable(); + } + if (this.targetModifier === 'scroll-handle') { + this.scrollParent = this.target; + } else { + this.scrollParent = getScrollParent(this.target); + } + if (this.options.enabled !== false) { + return this.enable(position); + } + }; + + _Tether.prototype.getTargetBounds = function() { + var bounds, fitAdj, hasBottomScroll, height, out, scrollBottom, scrollPercentage, style, target; + if (this.targetModifier != null) { + switch (this.targetModifier) { + case 'visible': + if (this.target === document.body) { + return { + top: pageYOffset, + left: pageXOffset, + height: innerHeight, + width: innerWidth + }; + } else { + bounds = getBounds(this.target); + out = { + height: bounds.height, + width: bounds.width, + top: bounds.top, + left: bounds.left + }; + out.height = Math.min(out.height, bounds.height - (pageYOffset - bounds.top)); + out.height = Math.min(out.height, bounds.height - ((bounds.top + bounds.height) - (pageYOffset + innerHeight))); + out.height = Math.min(innerHeight, out.height); + out.height -= 2; + out.width = Math.min(out.width, bounds.width - (pageXOffset - bounds.left)); + out.width = Math.min(out.width, bounds.width - ((bounds.left + bounds.width) - (pageXOffset + innerWidth))); + out.width = Math.min(innerWidth, out.width); + out.width -= 2; + if (out.top < pageYOffset) { + out.top = pageYOffset; + } + if (out.left < pageXOffset) { + out.left = pageXOffset; + } + return out; + } + break; + case 'scroll-handle': + target = this.target; + if (target === document.body) { + target = document.documentElement; + bounds = { + left: pageXOffset, + top: pageYOffset, + height: innerHeight, + width: innerWidth + }; + } else { + bounds = getBounds(target); + } + style = getComputedStyle(target); + hasBottomScroll = target.scrollWidth > target.clientWidth || 'scroll' === [style.overflow, style.overflowX] || this.target !== document.body; + scrollBottom = 0; + if (hasBottomScroll) { + scrollBottom = 15; + } + height = bounds.height - parseFloat(style.borderTopWidth) - parseFloat(style.borderBottomWidth) - scrollBottom; + out = { + width: 15, + height: height * 0.975 * (height / target.scrollHeight), + left: bounds.left + bounds.width - parseFloat(style.borderLeftWidth) - 15 + }; + fitAdj = 0; + if (height < 408 && this.target === document.body) { + fitAdj = -0.00011 * Math.pow(height, 2) - 0.00727 * height + 22.58; + } + if (this.target !== document.body) { + out.height = Math.max(out.height, 24); + } + scrollPercentage = this.target.scrollTop / (target.scrollHeight - height); + out.top = scrollPercentage * (height - out.height - fitAdj) + bounds.top + parseFloat(style.borderTopWidth); + if (this.target === document.body) { + out.height = Math.max(out.height, 24); + } + return out; + } + } else { + return getBounds(this.target); + } + }; + + _Tether.prototype.clearCache = function() { + return this._cache = {}; + }; + + _Tether.prototype.cache = function(k, getter) { + if (this._cache == null) { + this._cache = {}; + } + if (this._cache[k] == null) { + this._cache[k] = getter.call(this); + } + return this._cache[k]; + }; + + _Tether.prototype.enable = function(position) { + if (position == null) { + position = true; + } + addClass(this.target, this.getClass('enabled')); + addClass(this.element, this.getClass('enabled')); + this.enabled = true; + if (this.scrollParent !== document) { + this.scrollParent.addEventListener('scroll', this.position); + } + if (position) { + return this.position(); + } + }; + + _Tether.prototype.disable = function() { + removeClass(this.target, this.getClass('enabled')); + removeClass(this.element, this.getClass('enabled')); + this.enabled = false; + if (this.scrollParent != null) { + return this.scrollParent.removeEventListener('scroll', this.position); + } + }; + + _Tether.prototype.destroy = function() { + var i, tether, _i, _len, _results; + this.disable(); + _results = []; + for (i = _i = 0, _len = tethers.length; _i < _len; i = ++_i) { + tether = tethers[i]; + if (tether === this) { + tethers.splice(i, 1); + break; + } else { + _results.push(void 0); + } + } + return _results; + }; + + _Tether.prototype.updateAttachClasses = function(elementAttach, targetAttach) { + var add, all, side, sides, _i, _j, _len, _len1, _ref1, + _this = this; + if (elementAttach == null) { + elementAttach = this.attachment; + } + if (targetAttach == null) { + targetAttach = this.targetAttachment; + } + sides = ['left', 'top', 'bottom', 'right', 'middle', 'center']; + if ((_ref1 = this._addAttachClasses) != null ? _ref1.length : void 0) { + this._addAttachClasses.splice(0, this._addAttachClasses.length); + } + add = this._addAttachClasses != null ? this._addAttachClasses : this._addAttachClasses = []; + if (elementAttach.top) { + add.push("" + (this.getClass('element-attached')) + "-" + elementAttach.top); + } + if (elementAttach.left) { + add.push("" + (this.getClass('element-attached')) + "-" + elementAttach.left); + } + if (targetAttach.top) { + add.push("" + (this.getClass('target-attached')) + "-" + targetAttach.top); + } + if (targetAttach.left) { + add.push("" + (this.getClass('target-attached')) + "-" + targetAttach.left); + } + all = []; + for (_i = 0, _len = sides.length; _i < _len; _i++) { + side = sides[_i]; + all.push("" + (this.getClass('element-attached')) + "-" + side); + } + for (_j = 0, _len1 = sides.length; _j < _len1; _j++) { + side = sides[_j]; + all.push("" + (this.getClass('target-attached')) + "-" + side); + } + return defer(function() { + if (_this._addAttachClasses == null) { + return; + } + updateClasses(_this.element, _this._addAttachClasses, all); + updateClasses(_this.target, _this._addAttachClasses, all); + return _this._addAttachClasses = void 0; + }); + }; + + _Tether.prototype.position = function(flushChanges) { + var elementPos, elementStyle, height, left, manualOffset, manualTargetOffset, module, next, offset, offsetBorder, offsetParent, offsetParentSize, offsetParentStyle, offsetPosition, ret, scrollLeft, scrollTop, side, targetAttachment, targetOffset, targetPos, targetSize, top, width, _i, _j, _len, _len1, _ref1, _ref2, _ref3, _ref4, + _this = this; + if (flushChanges == null) { + flushChanges = true; + } + if (!this.enabled) { + return; + } + this.clearCache(); + targetAttachment = autoToFixedAttachment(this.targetAttachment, this.attachment); + this.updateAttachClasses(this.attachment, targetAttachment); + elementPos = this.cache('element-bounds', function() { + return getBounds(_this.element); + }); + width = elementPos.width, height = elementPos.height; + if (width === 0 && height === 0 && (this.lastSize != null)) { + _ref1 = this.lastSize, width = _ref1.width, height = _ref1.height; + } else { + this.lastSize = { + width: width, + height: height + }; + } + targetSize = targetPos = this.cache('target-bounds', function() { + return _this.getTargetBounds(); + }); + offset = offsetToPx(attachmentToOffset(this.attachment), { + width: width, + height: height + }); + targetOffset = offsetToPx(attachmentToOffset(targetAttachment), targetSize); + manualOffset = offsetToPx(this.offset, { + width: width, + height: height + }); + manualTargetOffset = offsetToPx(this.targetOffset, targetSize); + offset = addOffset(offset, manualOffset); + targetOffset = addOffset(targetOffset, manualTargetOffset); + left = targetPos.left + targetOffset.left - offset.left; + top = targetPos.top + targetOffset.top - offset.top; + _ref2 = Tether.modules; + for (_i = 0, _len = _ref2.length; _i < _len; _i++) { + module = _ref2[_i]; + ret = module.position.call(this, { + left: left, + top: top, + targetAttachment: targetAttachment, + targetPos: targetPos, + attachment: this.attachment, + elementPos: elementPos, + offset: offset, + targetOffset: targetOffset, + manualOffset: manualOffset, + manualTargetOffset: manualTargetOffset + }); + if ((ret == null) || typeof ret !== 'object') { + continue; + } else if (ret === false) { + return false; + } else { + top = ret.top, left = ret.left; + } + } + next = { + page: { + top: top, + bottom: document.body.scrollHeight - top - height, + left: left, + right: document.body.scrollWidth - left - width + }, + viewport: { + top: top - pageYOffset, + bottom: pageYOffset - top - height + innerHeight, + left: left - pageXOffset, + right: pageXOffset - left - width + innerWidth + } + }; + if (((_ref3 = this.options.optimizations) != null ? _ref3.moveElement : void 0) !== false && (this.targetModifier == null)) { + offsetParent = this.cache('target-offsetparent', function() { + return getOffsetParent(_this.target); + }); + offsetPosition = this.cache('target-offsetparent-bounds', function() { + return getBounds(offsetParent); + }); + offsetParentStyle = getComputedStyle(offsetParent); + elementStyle = getComputedStyle(this.element); + offsetParentSize = offsetPosition; + offsetBorder = {}; + _ref4 = ['Top', 'Left', 'Bottom', 'Right']; + for (_j = 0, _len1 = _ref4.length; _j < _len1; _j++) { + side = _ref4[_j]; + offsetBorder[side.toLowerCase()] = parseFloat(offsetParentStyle["border" + side + "Width"]); + } + offsetPosition.right = document.body.scrollWidth - offsetPosition.left - offsetParentSize.width + offsetBorder.right; + offsetPosition.bottom = document.body.scrollHeight - offsetPosition.top - offsetParentSize.height + offsetBorder.bottom; + if (next.page.top >= (offsetPosition.top + offsetBorder.top) && next.page.bottom >= offsetPosition.bottom) { + if (next.page.left >= (offsetPosition.left + offsetBorder.left) && next.page.right >= offsetPosition.right) { + scrollTop = offsetParent.scrollTop; + scrollLeft = offsetParent.scrollLeft; + next.offset = { + top: next.page.top - offsetPosition.top + scrollTop - offsetBorder.top, + left: next.page.left - offsetPosition.left + scrollLeft - offsetBorder.left + }; + } + } + } + this.move(next); + this.history.unshift(next); + if (this.history.length > 3) { + this.history.pop(); + } + if (flushChanges) { + flush(); + } + return true; + }; + + _Tether.prototype.move = function(position) { + var css, elVal, found, key, moved, offsetParent, point, same, transcribe, type, val, write, writeCSS, _i, _len, _ref1, _ref2, + _this = this; + if (this.element.parentNode == null) { + return; + } + same = {}; + for (type in position) { + same[type] = {}; + for (key in position[type]) { + found = false; + _ref1 = this.history; + for (_i = 0, _len = _ref1.length; _i < _len; _i++) { + point = _ref1[_i]; + if (!within((_ref2 = point[type]) != null ? _ref2[key] : void 0, position[type][key])) { + found = true; + break; + } + } + if (!found) { + same[type][key] = true; + } + } + } + css = { + top: '', + left: '', + right: '', + bottom: '' + }; + transcribe = function(same, pos) { + var xPos, yPos, _ref3; + if (((_ref3 = _this.options.optimizations) != null ? _ref3.gpu : void 0) !== false) { + if (same.top) { + css.top = 0; + yPos = pos.top; + } else { + css.bottom = 0; + yPos = -pos.bottom; + } + if (same.left) { + css.left = 0; + xPos = pos.left; + } else { + css.right = 0; + xPos = -pos.right; + } + css[transformKey] = "translateX(" + (Math.round(xPos)) + "px) translateY(" + (Math.round(yPos)) + "px)"; + if (transformKey !== 'msTransform') { + return css[transformKey] += " translateZ(0)"; + } + } else { + if (same.top) { + css.top = "" + pos.top + "px"; + } else { + css.bottom = "" + pos.bottom + "px"; + } + if (same.left) { + return css.left = "" + pos.left + "px"; + } else { + return css.right = "" + pos.right + "px"; + } + } + }; + moved = false; + if ((same.page.top || same.page.bottom) && (same.page.left || same.page.right)) { + css.position = 'absolute'; + transcribe(same.page, position.page); + } else if ((same.viewport.top || same.viewport.bottom) && (same.viewport.left || same.viewport.right)) { + css.position = 'fixed'; + transcribe(same.viewport, position.viewport); + } else if ((same.offset != null) && same.offset.top && same.offset.left) { + css.position = 'absolute'; + offsetParent = this.cache('target-offsetparent', function() { + return getOffsetParent(_this.target); + }); + if (getOffsetParent(this.element) !== offsetParent) { + defer(function() { + _this.element.parentNode.removeChild(_this.element); + return offsetParent.appendChild(_this.element); + }); + } + transcribe(same.offset, position.offset); + moved = true; + } else { + css.position = 'absolute'; + transcribe({ + top: true, + left: true + }, position.page); + } + if (!moved && this.element.parentNode.tagName !== 'BODY') { + this.element.parentNode.removeChild(this.element); + document.body.appendChild(this.element); + } + writeCSS = {}; + write = false; + for (key in css) { + val = css[key]; + elVal = this.element.style[key]; + if (elVal !== '' && val !== '' && (key === 'top' || key === 'left' || key === 'bottom' || key === 'right')) { + elVal = parseFloat(elVal); + val = parseFloat(val); + } + if (elVal !== val) { + write = true; + writeCSS[key] = css[key]; + } + } + if (write) { + return defer(function() { + return extend(_this.element.style, writeCSS); + }); + } + }; + + return _Tether; + + })(); + + Tether.position = position; + + window.Tether = extend(_Tether, Tether); + +}).call(this); diff --git a/js/tether.min.js b/js/tether.min.js new file mode 100644 index 000000000..e8993a1a7 --- /dev/null +++ b/js/tether.min.js @@ -0,0 +1,2 @@ +/*! tether.js 0.2.9 */ +(function(){var a,b,c,d,e,f,g,h,i={}.hasOwnProperty,j=[].slice;null==window.Tether&&(window.Tether={}),f=function(a){var b,c,d,e,f;if(c=getComputedStyle(a).position,"fixed"===c)return a;for(d=void 0,b=a;b=b.parentNode;){if(!(e=getComputedStyle(b)))return b;if(/(auto|scroll)/.test(e.overflow+e["overflow-y"]+e["overflow-x"])&&("absolute"!==c||"relative"===(f=e.position)||"absolute"===f||"fixed"===f))return b}return document.body},d=function(a){var b,d,e,f;return d=a.ownerDocument,e=d.documentElement,b=c({},a.getBoundingClientRect()),b.top=b.top+window.pageYOffset-e.clientTop,b.left=b.left+window.pageXOffset-e.clientLeft,b.right=d.body.clientWidth-b.width-b.left,b.bottom=d.body.clientHeight-b.height-b.top,b.height&&b.width||(f=getComputedStyle(a),b.height||(b.height=parseFloat(f.height)),b.width||(b.width=parseFloat(f.width))),b},e=function(a){return a.offsetParent||document.documentElement},c=function(a){var b,c,d,e,f,g,h;for(null==a&&(a={}),b=[],Array.prototype.push.apply(b,arguments),h=b.slice(1),f=0,g=h.length;g>f;f++)if(d=h[f])for(c in d)i.call(d,c)&&(e=d[c],a[c]=e);return a},h=function(a,b){var c,d,e,f,g;if(null!=a.classList){for(f=b.split(" "),g=[],d=0,e=f.length;e>d;d++)c=f[d],g.push(a.classList.remove(c));return g}return a.className=a.className.replace(new RegExp("(^| )"+b.split(" ").join("|")+"( |$)","gi")," ")},b=function(a,b){var c,d,e,f,g;if(null!=a.classList){for(f=b.split(" "),g=[],d=0,e=f.length;e>d;d++)c=f[d],g.push(a.classList.add(c));return g}return h(a,b),a.className+=" "+b},g=function(a,b){return null!=a.classList?a.classList.contains(b):new RegExp("(^| )"+b+"( |$)","gi").test(a.className)},a=function(){function a(){}return a.prototype.on=function(a,b,c,d){var e;return null==d&&(d=!1),null==this.bindings&&(this.bindings={}),null==(e=this.bindings)[a]&&(e[a]=[]),this.bindings[a].push({handler:b,ctx:c,once:d})},a.prototype.once=function(a,b,c){return this.on(a,b,c,!0)},a.prototype.off=function(a,b){var c,d,e;if(null!=(null!=(d=this.bindings)?d[a]:void 0)){if(null==b)return delete this.bindings[a];for(c=0,e=[];cb;b++)a=v[b],d.push(a.position());return d},p=null,A=["resize","scroll"],x=0,y=A.length;y>x;x++)i=A[x],window.addEventListener(i,function(){return null==p||new Date-p>16?(p=+new Date,t()):void 0});a={center:"center",left:"right",right:"left"},b={middle:"middle",top:"bottom",bottom:"top"},c={top:0,left:0,middle:"50%",center:"50%",bottom:"100%",right:"100%"},g=function(c,d){var e,f;return e=c.left,f=c.top,"auto"===e&&(e=a[d.left]),"auto"===f&&(f=b[d.top]),{left:e,top:f}},f=function(a){var b,d;return{left:null!=(b=c[a.left])?b:a.left,top:null!=(d=c[a.top])?d:a.top}},e=function(){var a,b,c,d,e,f,g;for(b=1<=arguments.length?B.call(arguments,0):[],c={top:0,left:0},e=0,f=b.length;f>e;e++)g=b[e],d=g.top,a=g.left,"string"==typeof d&&(d=parseFloat(d,10)),"string"==typeof a&&(a=parseFloat(a,10)),c.top+=d,c.left+=a;return c},q=function(a,b){return"string"==typeof a.left&&-1!==a.left.indexOf("%")&&(a.left=parseFloat(a.left,10)/100*b.width),"string"==typeof a.top&&-1!==a.top.indexOf("%")&&(a.top=parseFloat(a.top,10)/100*b.height),a},r=s=function(a){var b,c,d;return d=a.split(" "),c=d[0],b=d[1],{top:c,left:b}},w=function(){function a(a){this.position=C(this.position,this);var b,c,d,e,f;for(v.push(this),this.history=[],this.setOptions(a,!1),e=Tether.modules,c=0,d=e.length;d>c;c++)b=e[c],null!=(f=b.initialize)&&f.call(this);this.position()}return a.modules=[],a.prototype.getClass=function(a){var b,c;return(null!=(b=this.options.classes)?b[a]:void 0)?this.options.classes[a]:(null!=(c=this.options.classes)?c[a]:void 0)!==!1?this.options.classPrefix?""+this.options.classPrefix+"-"+a:a:""},a.prototype.setOptions=function(a,b){var c,e,f,g,h,i;for(this.options=a,null==b&&(b=!0),c={offset:"0 0",targetOffset:"0 0",targetAttachment:"auto auto",classPrefix:"tether"},this.options=j(c,this.options),h=this.options,this.element=h.element,this.target=h.target,this.targetModifier=h.targetModifier,"viewport"===this.target?(this.target=document.body,this.targetModifier="visible"):"scroll-handle"===this.target&&(this.target=document.body,this.targetModifier="scroll-handle"),i=["element","target"],f=0,g=i.length;g>f;f++)if(e=i[f],null!=this[e].jquery?this[e]=this[e][0]:"string"==typeof this[e]&&(this[e]=document.querySelector(this[e])),null==this[e])throw new Error("Tether Error: Both element and target must be defined");if(d(this.element,this.getClass("element")),d(this.target,this.getClass("target")),!this.options.attachment)throw new Error("Tether Error: You must provide an attachment");return this.targetAttachment=r(this.options.targetAttachment),this.attachment=r(this.options.attachment),this.offset=s(this.options.offset),this.targetOffset=s(this.options.targetOffset),null!=this.scrollParent&&this.disable(),this.scrollParent=n(this.target),this.options.enabled!==!1?this.enable(b):void 0},a.prototype.getTargetBounds=function(){if(null==this.targetModifier)return k(this.target);switch(this.targetModifier){case"visible":return{top:pageYOffset,left:pageXOffset,height:innerHeight,width:innerWidth};case"scroll-handle":return{top:pageYOffset+innerHeight*(pageYOffset/document.body.scrollHeight),left:innerWidth-15,height:.98*innerHeight*(innerHeight/document.body.scrollHeight),width:15}}},a.prototype.clearCache=function(){return this._cache={}},a.prototype.cache=function(a,b){return null==this._cache&&(this._cache={}),null==this._cache[a]&&(this._cache[a]=b.call(this)),this._cache[a]},a.prototype.enable=function(a){var b=this;return null==a&&(a=!0),this.addClass(this.getClass("enabled")),this.enabled=!0,this.scrollParent.addEventListener("scroll",this.position),a?setTimeout(function(){return b.position()}):void 0},a.prototype.disable=function(){return this.removeClass(this.getClass("enabled")),this.enabled=!1,null!=this.scrollParent?this.scrollParent.removeEventListener("scroll",this.position):void 0},a.prototype.destroy=function(){var a,b,c,d,e;for(this.disable(),e=[],a=c=0,d=v.length;d>c;a=++c){if(b=v[a],b===this){v.splice(a,1);break}e.push(void 0)}return e},a.prototype.updateAttachClasses=function(a,b){var c,d,e,f,g,h;for(null==a&&(a=this.attachment),null==b&&(b=this.targetAttachment),d=["left","top","bottom","right","middle","center"],e=0,g=d.length;g>e;e++)c=d[e],this.removeClass(""+this.getClass("element-attached")+"-"+c);for(a.top&&this.addClass(""+this.getClass("element-attached")+"-"+a.top),a.left&&this.addClass(""+this.getClass("element-attached")+"-"+a.left),f=0,h=d.length;h>f;f++)c=d[f],this.removeClass(""+this.getClass("target-attached")+"-"+c);return b.top&&this.addClass(""+this.getClass("target-attached")+"-"+b.top),b.left?this.addClass(""+this.getClass("target-attached")+"-"+b.left):void 0},a.prototype.addClass=function(a){return d(this.element,a),d(this.target,a)},a.prototype.removeClass=function(a){return u(this.element,a),u(this.target,a)},a.prototype.position=function(){var a,b,c,d,h,i,j,m,n,o,p,r,s,t,u,v,w,x,y,z,A,B,C,D,E,F,G,H,I,J,K=this;if(this.enabled){for(this.clearCache(),x=g(this.targetAttachment,this.attachment),this.updateAttachClasses(this.attachment,x),a=this.cache("element-bounds",function(){return k(K.element)}),C=a.width,b=a.height,A=z=this.cache("target-bounds",function(){return K.getTargetBounds()}),m=q(f(this.attachment),{width:C,height:b}),y=q(f(x),A),d=q(this.offset,{width:C,height:b}),h=q(this.targetOffset,A),m=e(m,d),c=z.left+y.left-m.left,B=z.top+y.top-m.top,H=Tether.modules,D=0,F=H.length;F>D;D++)if(i=H[D],t=i.position.call(this,{left:c,top:B,targetAttachment:x,targetPos:z,elementPos:a,offset:m,targetOffset:y,manualOffset:d,manualTargetOffset:h}),null!=t&&"object"==typeof t){if(t===!1)return!1;B=t.top,c=t.left}if(j={page:{top:B,bottom:document.body.scrollHeight-B-b,left:c,right:document.body.scrollWidth-c-C},viewport:{top:B-pageYOffset,bottom:pageYOffset-B-b+innerHeight,left:c-pageXOffset,right:pageXOffset-c-C+innerWidth}},(null!=(I=this.options.optimizations)?I.moveElement:void 0)!==!1&&null==this.targetModifier){for(o=this.cache("target-offsetparent",function(){return l(K.target)}),s=this.cache("target-offsetparent-bounds",function(){return k(o)}),r=getComputedStyle(o),p=s,n={},J=["top","left","bottom","right"],E=0,G=J.length;G>E;E++)w=J[E],n[w]=parseFloat(r["border-"+w+"-width"]);s.left+=n.left,s.top+=n.top,s.right=document.body.scrollWidth-s.left-p.width,s.bottom=document.body.scrollHeight-s.top-p.height,j.page.top>=s.top&&j.page.bottom>=s.bottom&&j.page.left>=s.left&&j.page.right>=s.right&&(v=o.scrollTop,u=o.scrollLeft,j.offset={top:j.page.top-s.top+v+n.top,left:j.page.left-s.left+u+n.left,right:j.page.right-s.right+o.scrollWidth-u+n.right,bottom:j.page.bottom-s.bottom+o.scrollHeight-v+n.bottom})}return this.move(j),this.history.unshift(j),this.history.length>3&&this.history.pop(),!0}},a.prototype.move=function(a){var b,c,d,e,f,g,h,i,k,m,n,o,p,q,r,s,t,u,v,w,x,y=this;if(null!=this.element.parentNode){k={};for(o in a){k[o]={};for(d in a[o]){for(c=!1,v=this.history,r=0,t=v.length;t>r;r++)if(i=v[r],(null!=(w=i[o])?w[d]:void 0)!==a[o][d]){c=!0;break}c||(k[o][d]=!0)}}if(b={top:"",left:"",right:"",bottom:""},n=function(a,c){return a.top?b.top=""+c.top+"px":b.bottom=""+c.bottom+"px",a.left?b.left=""+c.left+"px":b.right=""+c.right+"px"},e=!1,(k.page.top||k.page.bottom)&&(k.page.left||k.page.right))b.position="absolute",n(k.page,a.page);else if((k.viewport.top||k.viewport.bottom)&&(k.viewport.left||k.viewport.right))b.position="fixed",n(k.viewport,a.viewport);else if(null!=k.offset&&(k.offset.top||k.offset.bottom)&&(k.offset.left||k.offset.right)){for(b.position="absolute",g=this.cache("target-offsetparent",function(){return l(y.target)}),l(this.element)!==g&&(this.element.parentNode.removeChild(this.element),g.appendChild(this.element)),h=getComputedStyle(g),f=j({},a.offset),x=["top","left","bottom","right"],s=0,u=x.length;u>s;s++)m=x[s],f[m]-=parseFloat(h["border-"+m+"-width"]);n(k.offset,f),e=!0}else b.position="absolute",b.top=""+a.page.top+"px",b.left=""+a.page.left+"px";e||"BODY"===this.element.parentNode.tagName||(this.element.parentNode.removeChild(this.element),document.body.appendChild(this.element)),q=!1;for(d in b)if(p=b[d],this.element.style[d]!==p){q=!0;break}return q?j(this.element.style,b):void 0}},a}(),window.Tether=j(w,Tether)}.call(this),function(){var a,b,c,d,e,f,g,h,i=[].indexOf||function(a){for(var b=0,c=this.length;c>b;b++)if(b in this&&this[b]===a)return b;return-1};h=Tether.Utils,f=h.getOuterSize,e=h.getBounds,g=h.getSize,c=h.extend,b={left:"right",right:"left",top:"bottom",bottom:"top",middle:"middle"},a=["left","top","right","bottom"],d=function(b,c){var d,f,g,h,i,j,k;if("scrollParent"===c?c=b.scrollParent:"window"===c&&(c=[pageXOffset,pageYOffset,innerWidth+pageXOffset,innerHeight+pageYOffset]),null!=c.nodeType)for(f=h=e(c),i=getComputedStyle(c),c=[f.left,f.top,h.width+f.left,h.height+f.top],d=j=0,k=a.length;k>j;d=++j)g=a[d],"top"===g||"left"===g?c[d]+=parseFloat(i["border-"+g+"-width"]):c[d]-=parseFloat(i["border-"+g+"-width"]);return c},Tether.modules.push({position:function(b){var f,g,h,j,k,l,m,n,o,p,q,r,s,t,u,v,w,x,y,z,A,B,C,D,E,F,G,H,I,J,K,L,M,N,O,P,Q,R,S,T,U,V,W=this;if(E=b.top,o=b.left,z=b.targetAttachment,!this.options.constraints)return!0;for(v=function(b){var c,d,e,f;for(W.removeClass(b),f=[],d=0,e=a.length;e>d;d++)c=a[d],f.push(W.removeClass(""+b+"-"+c));return f},Q=this.cache("element-bounds",function(){return e(W.element)}),n=Q.height,F=Q.width,B=this.cache("target-bounds",function(){return W.getTargetBounds()}),A=B.height,C=B.width,y={},m={},w=[this.getClass("pinned"),this.getClass("out-of-bounds")],R=this.options.constraints,G=0,K=R.length;K>G;G++)l=R[G],l.outOfBoundsClass&&w.push(l.outOfBoundsClass),l.pinnedClass&&w.push(l.pinnedClass);for(H=0,L=w.length;L>H;H++)k=w[H],v(k);for(y=c({},z),m=c({},this.attachment),S=this.options.constraints,I=0,M=S.length;M>I;I++){if(l=S[I],D=l.to,f=l.attachment,s=l.pin,null==f&&(f=""),i.call(f," ")>=0?(T=f.split(" "),j=T[0],h=T[1]):h=j=f,g=d(this,D),("target"===j||"both"===j)&&(Eg[3]&&"bottom"===y.top&&(E-=A,y.top="top")),"together"===j&&(Eg[3]&&"bottom"===y.top&&("top"===m.top?(E-=A,y.top="top",E-=n,m.top="bottom"):"bottom"===m.top&&(E-=A,y.top="top",E+=n,m.top="top"))),("target"===h||"both"===h)&&(og[2]&&"right"===y.left&&(o-=C,y.left="left")),"together"===h&&(og[2]&&"right"===y.left&&("left"===m.left?(o-=C,y.left="left",o-=F,m.left="right"):"right"===m.left&&(o-=C,y.left="left",o+=F,m.left="left"))),("element"===j||"both"===j)&&(Eg[3]&&"top"===m.top&&(E-=n,m.top="bottom")),("element"===h||"both"===h)&&(og[2]&&"left"===m.left&&(o-=F,m.left="right")),"string"==typeof s?s=function(){var a,b,c,d;for(c=s.split(","),d=[],a=0,b=c.length;b>a;a++)r=c[a],d.push(r.trim());return d}():s===!0&&(s=["top","left","right","bottom"]),s||(s=[]),t=[],p=[],E=0?(E=g[1],t.push("top")):p.push("top")),E+n>g[3]&&(i.call(s,"bottom")>=0?(E=g[3]-n,t.push("bottom")):p.push("bottom")),o=0?(o=g[0],t.push("left")):p.push("left")),o+F>g[2]&&(i.call(s,"right")>=0?(o=g[2]-F,t.push("right")):p.push("right")),t.length)for(u=null!=(U=this.options.pinnedClass)?U:this.getClass("pinned"),this.addClass(u),J=0,N=t.length;N>J;J++)x=t[J],this.addClass(""+u+"-"+x);if(p.length)for(q=null!=(V=this.options.outOfBoundsClass)?V:this.getClass("out-of-bounds"),this.addClass(q),P=0,O=p.length;O>P;P++)x=p[P],this.addClass(""+q+"-"+x);(i.call(t,"left")>=0||i.call(t,"right")>=0)&&(m.left=y.left=!1),(i.call(t,"top")>=0||i.call(t,"bottom")>=0)&&(m.top=y.top=!1),(y.top!==z.top||y.left!==z.left||m.top!==this.attachment.top||m.left!==this.attachment.left)&&this.updateAttachClasses(m,y)}return{top:E,left:o}}})}.call(this),function(){var a;a=Tether.Utils.getBounds,Tether.modules.push({position:function(b){var c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u,v,w,x,y,z=this;if(k=b.top,f=b.left,u=this.cache("element-bounds",function(){return a(z.element)}),e=u.height,l=u.width,j=this.getTargetBounds(),d=k+e,g=f+l,c=[],k<=j.bottom&&d>=j.top)for(v=["left","right"],m=0,q=v.length;q>m;m++)h=v[m],((w=j[h])===f||w===g)&&c.push(h);if(f<=j.right&&g>=j.left)for(x=["top","bottom"],n=0,r=x.length;r>n;n++)h=x[n],((y=j[h])===k||y===d)&&c.push(h);for(i=["left","top","right","bottom"],this.removeClass(this.getClass("abutted")),o=0,s=i.length;s>o;o++)h=i[o],this.removeClass(""+this.getClass("abutted")+"-"+h);for(c.length&&this.addClass(this.getClass("abutted")),p=0,t=c.length;t>p;p++)h=c[p],this.addClass(""+this.getClass("abutted")+"-"+h);return!0}})}.call(this),function(){Tether.modules.push({position:function(a){var b,c,d,e,f,g,h;return g=a.top,b=a.left,this.options.shift?(c=function(a){return"function"==typeof a?a.call(this,{top:g,left:b}):a},d=c(this.options.shift),"string"==typeof d?(d=d.split(" "),d[1]||(d[1]=d[0]),f=d[0],e=d[1],f=parseFloat(f,10),e=parseFloat(e,10)):(h=[d.top,d.left],f=h[0],e=h[1]),g+=f,b+=e,{top:g,left:b}):void 0}})}.call(this); \ No newline at end of file diff --git a/utils.js b/js/utils.js similarity index 62% rename from utils.js rename to js/utils.js index 5d4388cd2..0e245973c 100644 --- a/utils.js +++ b/js/utils.js @@ -1,6 +1,7 @@ (function() { - var Evented, addClass, extend, getBounds, getOffsetParent, getScrollParent, hasClass, removeClass, + var Evented, addClass, defer, deferred, extend, flush, getBounds, getOffsetParent, getOrigin, getScrollParent, hasClass, node, removeClass, uniqueId, updateClasses, zeroPosCache, __hasProp = {}.hasOwnProperty, + __indexOf = [].indexOf || function(item) { for (var i = 0, l = this.length; i < l; i++) { if (i in this && this[i] === item) return i; } return -1; }, __slice = [].slice; if (window.Tether == null) { @@ -16,7 +17,10 @@ scrollParent = void 0; parent = el; while (parent = parent.parentNode) { - if (!(style = getComputedStyle(parent))) { + try { + style = getComputedStyle(parent); + } catch (_error) {} + if (style == null) { return parent; } if (/(auto|scroll)/.test(style['overflow'] + style['overflow-y'] + style['overflow-x'])) { @@ -28,20 +32,75 @@ return document.body; }; + uniqueId = (function() { + var id; + id = 0; + return function() { + return id++; + }; + })(); + + zeroPosCache = {}; + + getOrigin = function(doc) { + var id, k, node, v, _ref; + node = doc._tetherZeroElement; + if (node == null) { + node = doc.createElement('div'); + node.setAttribute('data-tether-id', uniqueId()); + extend(node.style, { + top: 0, + left: 0, + position: 'absolute' + }); + doc.body.appendChild(node); + doc._tetherZeroElement = node; + } + id = node.getAttribute('data-tether-id'); + if (zeroPosCache[id] == null) { + zeroPosCache[id] = {}; + _ref = node.getBoundingClientRect(); + for (k in _ref) { + v = _ref[k]; + zeroPosCache[id][k] = v; + } + defer(function() { + return zeroPosCache[id] = void 0; + }); + } + return zeroPosCache[id]; + }; + + node = null; + getBounds = function(el) { - var box, doc, docEl, style; - doc = el.ownerDocument; + var box, doc, docEl, k, origin, v, _ref; + if (el === document) { + doc = document; + el = document.documentElement; + } else { + doc = el.ownerDocument; + } docEl = doc.documentElement; - box = extend({}, el.getBoundingClientRect()); - box.top = box.top + window.pageYOffset - docEl.clientTop; - box.left = box.left + window.pageXOffset - docEl.clientLeft; + box = {}; + _ref = el.getBoundingClientRect(); + for (k in _ref) { + v = _ref[k]; + box[k] = v; + } + origin = getOrigin(doc); + box.top -= origin.top; + box.left -= origin.left; + if (box.width == null) { + box.width = document.body.scrollWidth - box.left - box.right; + } + if (box.height == null) { + box.height = document.body.scrollHeight - box.top - box.bottom; + } + box.top = box.top - docEl.clientTop; + box.left = box.left - docEl.clientLeft; box.right = doc.body.clientWidth - box.width - box.left; box.bottom = doc.body.clientHeight - box.height - box.top; - if (!box.height || !box.width) { - style = getComputedStyle(el); - box.height || (box.height = parseFloat(style.height)); - box.width || (box.width = parseFloat(style.width)); - } return box; }; @@ -109,6 +168,43 @@ } }; + updateClasses = function(el, add, all) { + var cls, _i, _j, _len, _len1, _results; + for (_i = 0, _len = all.length; _i < _len; _i++) { + cls = all[_i]; + if (__indexOf.call(add, cls) < 0) { + if (hasClass(el, cls)) { + removeClass(el, cls); + } + } + } + _results = []; + for (_j = 0, _len1 = add.length; _j < _len1; _j++) { + cls = add[_j]; + if (!hasClass(el, cls)) { + _results.push(addClass(el, cls)); + } else { + _results.push(void 0); + } + } + return _results; + }; + + deferred = []; + + defer = function(fn) { + return deferred.push(fn); + }; + + flush = function() { + var fn, _results; + _results = []; + while (fn = deferred.pop()) { + _results.push(fn()); + } + return _results; + }; + Evented = (function() { function Evented() {} @@ -186,6 +282,10 @@ addClass: addClass, removeClass: removeClass, hasClass: hasClass, + updateClasses: updateClasses, + defer: defer, + flush: flush, + uniqueId: uniqueId, Evented: Evented }; diff --git a/markAttachment.coffee b/markAttachment.coffee deleted file mode 100644 index 9406d230d..000000000 --- a/markAttachment.coffee +++ /dev/null @@ -1,32 +0,0 @@ -$ = jQuery - -Tether.modules.push - initialize: -> - @markers = {} - - for type in ['target', 'element'] - el = document.createElement 'div' - el.className = @getClass("#{ type }-marker") - - dot = document.createElement 'div' - dot.className = @getClass('marker-dot') - el.appendChild dot - - @[type].appendChild el - - @markers[type] = {dot, el} - - position: ({manualOffset, manualTargetOffset}) -> - offsets = - element: manualOffset - target: manualTargetOffset - - for type, offset of offsets - for side, val of offset - if typeof val isnt 'string' or (val.indexOf('%') is -1 and val.indexOf('px') is -1) - val += 'px' - - if @markers[type].dot.style[side] isnt val - @markers[type].dot.style[side] = val - - true diff --git a/overview/repositioning/index.html b/overview/repositioning/index.html new file mode 100644 index 000000000..7cd344372 --- /dev/null +++ b/overview/repositioning/index.html @@ -0,0 +1,79 @@ +Tether +

    Repositioning

    +

    Tethers will be automatically repositioned when the page is resized, and when any element containing the Tether is scrolled. +If the element moves for some other reason (e.g. with javascript), Tether won't know to reposition the element.

    +

    Manually Repositioning

    +

    The simplest way to reposition every Tether on the page is to call Tether.position(). It will efficiently reposition every +Tether in a single repaint, making it more efficient than manually repositioning many Tethers individually.

    +
    Tether.position()
    +

    Repositioning a Single Tether

    +

    If you have many Tethers on screen, it may be more efficient to just reposition the tether that needs it. You can do this +by calling the .position method on the Tether instance:

    +
    tether = new Tether({ ... })
    +
    +// Later:
    +tether.position()
    +

    Tethering Hidden Elements

    +

    If you are creating a tether involving elements which are display: none, or not actually in the DOM, +your Tether may not be able to position itself properly. One way around this is to +ensure that a position call happens after all layouts have finished:

    +
    myElement.style.display = 'block'
    +
    +tether = new Tether({ ... })
    +
    +setTimeout(function(){
    +  tether.position();
    +})
    +

    In general however, you shouldn't have any trouble if both the element and the target are visible and in the DOM when you +create the Tether. If that is not the case, create the Tether disabled (option enabled: false), and enable it when +the elements are ready.

    +
    + + + + + \ No newline at end of file diff --git a/overview/why_we_dont_support_ie_8/index.html b/overview/why_we_dont_support_ie_8/index.html new file mode 100644 index 000000000..844128fdd --- /dev/null +++ b/overview/why_we_dont_support_ie_8/index.html @@ -0,0 +1,89 @@ +Tether +

    Why we don't support IE 8

    +

    We've been living in 2007 for a while now, pretending that new browser features don't +exist because they aren't in IE8. You might not even know about some of these features, +or think they are only enabled by jQuery or underscore, simply because it hasen't +been an option to rely upon them.

    +

    Here is the list of features you don't have if you choose to support IE 8:

    +
      +
    • HTML5 audio and video
    • +
    • SVG
    • +
    • Canvas
    • +
    • TrueType fonts
    • +
    • Media Queries
    • +
    • CSS Transforms
    • +
    • Multiple Backgrounds
    • +
    • CSS3 Units (vh, vw, rem)
    • +
    • Custom DOM events
    • +
    • Hardware accelerated graphics
    • +
    • The DOMContentLoaded event
    • +
    • addEventListener
    • +
    • Object.create, .seal, .freeze, .defineProperty
    • +
    • Array.isArray, .indexOf, .every, .some, .forEach, .map, .filter, .reduce
    • +
    • A modern javascript engine
    • +
    • A real developer tools
    • +
    • A consistent box model
    • +
    • jQuery 2
    • +
    • Google Apps
    • +
    • Tether
    • +
    +

    It's true that IE 8 still holds a big chunk of the browsing population, but the reasons +why they can't update are dwindling. There are two big reasons for continuing IE 8 support.

    +

    Enterprises

    +

    Microsoft is dropping support for XP in April, organizations who want security updates will have to upgrade.

    +

    China uses XP

    +

    Chrome, Firefox and Opera all support XP. Nothing prevents users from upgrading, except the inertia of + organizations who still support IE 8.

    +

    The Future

    +

    We are skating towards where the puck will be, and we hope that as you decide to drop IE 8 support, +you choose to add Tether to the list of awesome things you can do.

    +
    + + + + + \ No newline at end of file diff --git a/overview/why_you_should_use_tether/index.html b/overview/why_you_should_use_tether/index.html new file mode 100644 index 000000000..0bd0ae89b --- /dev/null +++ b/overview/why_you_should_use_tether/index.html @@ -0,0 +1,86 @@ +Tether +

    Why You Should Use Tether

    +

    Virtually every app includes some sort of overlay attached to an element on the page. +Things like tooltips, +dropdowns, hover-activiated info boxes, etc.

    +

    Those elements need to be attached to something on the page. Actually placing them next to +the element in the DOM causes problems though, if any parent element is anything +but overflow: visible, the element gets cut off. So you need absolute positioning +in the body.

    +

    Some of the time absolute positioning is right, but what about if the thing we're +attached to is fixed to the center of the screen? We'll have to move it every +time the user scrolls. What about if the element is in a scrollable container, +if the overlay is inside of it (so no clipping), it would be cool if the code +were smart enough to move it inside when that area is scrolled. That way we +need to reposition it even less.

    +

    It would also be nice if the code could somehow figure out whether positioning it +from the top, bottom, left, or right would result in the fewest repositionings +as the user scrolls or resizes.

    +

    Most of the time you're building these elements it would be nice for the element to +flip to the other side of the element if it hits the edge of the screen, or a scrollable +container it might be in. It would be nice if we could confine the element +to within some area, or even hide it when it leaves.

    +

    It would be nice for the element to be repositioned with CSS transforms +rather than top and left when possible, to allow the positioning to be done entirely +in the GPU.

    +

    Now that the positioning is so fancy, you're going to use it for more and more +elements. It would be cool if the library could optimize all of their repositioning +into a single repaint.

    +

    All of that is baked into Tether.

    +

    tl;dr

    +
      +
    • Optimized GPU-accelerated repositioning for 60fps scrolling
    • +
    • Reliable positioning on any possible corner, edge or point in between.
    • +
    • Support for repositioning or pinning the element when it would be offscreen
    • +
    • Designed to be embeddable in other libraries
    • +
    +
    + + + + + \ No newline at end of file diff --git a/resources/templates/base.jade b/resources/templates/base.jade index 9a5bbc260..4d17a68f6 100644 --- a/resources/templates/base.jade +++ b/resources/templates/base.jade @@ -15,25 +15,25 @@ html link(rel="stylesheet", href="https://static2cdn.hubspot.com/hubspot_public_assets/static-1.112/shared/sass/hubspot_public_assets.css") link(rel="stylesheet", href="https://static.hubspot.com/bundles/navigation.css") - link(rel="stylesheet", href="/static-resources/css/print.css") - link(rel="stylesheet", href="/static-resources/css/highlight-theme-github.css") - link(rel="stylesheet", href="/static-resources/css/navigation-tweaks.css") - link(rel="stylesheet", href="/static-resources/css/documentation.css") + link(rel="stylesheet", href="//github.hubspot.com/static-resources/css/print.css") + link(rel="stylesheet", href="//github.hubspot.com/static-resources/css/highlight-theme-github.css") + link(rel="stylesheet", href="//github.hubspot.com/static-resources/css/navigation-tweaks.css") + link(rel="stylesheet", href="//github.hubspot.com/static-resources/css/documentation.css") script(src="//ajax.googleapis.com/ajax/libs/jquery/1.10.2/jquery.min.js") - link(rel='stylesheet', href='/#{ repo.name }/#{ root }/resources/executr/lib/CodeMirror/codemirror.css') - link(rel='stylesheet', href='/#{ repo.name }/#{ root }/resources/executr/build/css/executr.css') - script(src='/#{ repo.name }/#{ root }/resources/executr/lib/CodeMirror/codemirror.js') - script(src='/#{ repo.name }/#{ root }/resources/executr/lib/CodeMirror/mode/coffeescript/coffeescript.js') - script(src='/#{ repo.name }/#{ root }/resources/executr/lib/CodeMirror/mode/javascript/javascript.js') - script(src='/#{ repo.name }/#{ root }/resources/executr/lib/coffee-script.js') - script(src='/#{ repo.name }/#{ root }/resources/executr/lib/underscore.min.js') - script(src='/#{ repo.name }/#{ root }/resources/executr/lib/js2coffee.min.js') - script(src='/#{ repo.name }/#{ root }/resources/executr/build/js/executr.js') - script(src='/#{ repo.name }/#{ root }/resources/executr/build/js/executr-run.js') - - script(src="//use.typekit.net/jbn8qxr.js") + link(rel='stylesheet', href='//github.hubspot.com/#{ repo.name }/#{ root }/resources/executr/lib/CodeMirror/codemirror.css') + link(rel='stylesheet', href='//github.hubspot.com/#{ repo.name }/#{ root }/resources/executr/build/css/executr.css') + script(src='//github.hubspot.com/#{ repo.name }/#{ root }/resources/executr/lib/CodeMirror/codemirror.js') + script(src='//github.hubspot.com/#{ repo.name }/#{ root }/resources/executr/lib/CodeMirror/mode/coffeescript/coffeescript.js') + script(src='//github.hubspot.com/#{ repo.name }/#{ root }/resources/executr/lib/CodeMirror/mode/javascript/javascript.js') + script(src='//github.hubspot.com/#{ repo.name }/#{ root }/resources/executr/lib/coffee-script.js') + script(src='//github.hubspot.com/#{ repo.name }/#{ root }/resources/executr/lib/underscore.min.js') + script(src='//github.hubspot.com/#{ repo.name }/#{ root }/resources/executr/lib/js2coffee.min.js') + script(src='//github.hubspot.com/#{ repo.name }/#{ root }/resources/executr/build/js/executr.js') + script(src='//github.hubspot.com/#{ repo.name }/#{ root }/resources/executr/build/js/executr-run.js') + + script(src="//use.typekit.net/ghy0wve.js") script try{Typekit.load();}catch(e){} diff --git a/resources/templates/includes/analytics.html b/resources/templates/includes/analytics.html index 90490a74c..a7e3896e9 100644 --- a/resources/templates/includes/analytics.html +++ b/resources/templates/includes/analytics.html @@ -15,6 +15,6 @@ m=s.getElementsByTagName(o)[0];a.async=1;a.src=g;m.parentNode.insertBefore(a,m) })(window,document,'script','//www.google-analytics.com/analytics.js','ga'); - ga('create', 'UA-45159009-1', 'hubspot.com'); + ga('create', 'UA-45159009-1', 'auto'); ga('send', 'pageview'); diff --git a/resources/templates/includes/navigation.jade b/resources/templates/includes/navigation.jade index 8eb9a54d1..a986c1426 100644 --- a/resources/templates/includes/navigation.jade +++ b/resources/templates/includes/navigation.jade @@ -15,11 +15,3 @@ each doc in group li(class=(doc.fullPath == path ? 'current-nav-item' : '')) a(href=linkPrefix + doc.link)= doc.displayPath - - if sources.length - li - b Annotated source - - each file in sources - li - a(target="_blank", href=linkPrefix + file.link)= file.displayPath diff --git a/resources/templates/includes/page-header.jade b/resources/templates/includes/page-header.jade index 2a7d96311..8e74c2993 100644 --- a/resources/templates/includes/page-header.jade +++ b/resources/templates/includes/page-header.jade @@ -12,4 +12,4 @@ .hs-doc-slim-github-link-wrapper - | On GitHub + | ★ On GitHub diff --git a/resources/templates/includes/topbar.html b/resources/templates/includes/topbar.html index fb0b70b88..b107a82a8 100644 --- a/resources/templates/includes/topbar.html +++ b/resources/templates/includes/topbar.html @@ -21,7 +21,7 @@
    diff --git a/shift.coffee b/shift.coffee deleted file mode 100644 index acecfb604..000000000 --- a/shift.coffee +++ /dev/null @@ -1,27 +0,0 @@ -Tether.modules.push - position: ({top, left}) -> - return unless @options.shift - - result = (val) -> - if typeof val is 'function' - val.call @, {top, left} - else - val - - shift = result @options.shift - - if typeof shift is 'string' - shift = shift.split(' ') - shift[1] or= shift[0] - - [shiftTop, shiftLeft] = shift - - shiftTop = parseFloat shiftTop, 10 - shiftLeft = parseFloat shiftLeft, 10 - else - [shiftTop, shiftLeft] = [shift.top, shift.left] - - top += shiftTop - left += shiftLeft - - {top, left} diff --git a/source/Gruntfile.html b/source/Gruntfile.html deleted file mode 100644 index b7b16d8b8..000000000 --- a/source/Gruntfile.html +++ /dev/null @@ -1,148 +0,0 @@ - - - - - Gruntfile.coffee - - - - - -
    -
    - - - -
      - -
    • -
      -

      Gruntfile.coffee

      -
      -
    • - - - -
    • -
      - -
      - -
      - -
      - -
      module.exports = (grunt) ->
      -  grunt.initConfig
      -    pkg: grunt.file.readJSON('package.json')
      -    coffee:
      -      compile:
      -        files:
      -          'utils.js': 'utils.coffee'
      -          'tether.js': 'tether.coffee'
      -          'constraint.js': 'constraint.coffee'
      -          'abutment.js': 'abutment.coffee'
      -          'shift.js': 'shift.coffee'
      -          'markAttachment.js': 'markAttachment.coffee'
      -          'docs/js/intro.js': 'docs/coffee/intro.coffee'
      -          'docs/welcome/js/welcome.js': 'docs/welcome/coffee/welcome.coffee'
      -
      -    watch:
      -      coffee:
      -        files: ['*.coffee', 'sass/*', 'docs/**/*']
      -        tasks: ['coffee', 'uglify', 'compass']
      -
      -    uglify:
      -      tether:
      -        src: ['utils.js', 'tether.js', 'constraint.js', 'abutment.js', 'shift.js']
      -        dest: 'tether.min.js'
      -        options:
      -          banner: '/*! tether.js <%= pkg.version %> */\n'
      -
      -    compass:
      -      dist:
      -        options:
      -          sassDir: 'sass'
      -          cssDir: 'css'
      -      introDocs:
      -        options:
      -          sassDir: 'docs/sass'
      -          cssDir: 'docs/css'
      -      welcomeDocs:
      -        options:
      -          sassDir: 'docs/welcome/sass'
      -          cssDir: 'docs/welcome/css'
      -
      -    bower:
      -      install:
      -        options:
      -          targetDir: 'deps'
      -          cleanup: true
      -          layout: 'byComponent'
      -          bowerOptions:
      -            forceLatest: true
      -            production: true
      -
      -  grunt.loadNpmTasks 'grunt-contrib-watch'
      -  grunt.loadNpmTasks 'grunt-contrib-uglify'
      -  grunt.loadNpmTasks 'grunt-contrib-coffee'
      -  grunt.loadNpmTasks 'grunt-contrib-compass'
      -  grunt.loadNpmTasks 'grunt-bower-task'
      -
      -  grunt.registerTask 'default', ['bower', 'coffee', 'uglify', 'compass']
      - -
    • - -
    -
    - - diff --git a/source/abutment.html b/source/abutment.html deleted file mode 100644 index 2ec7c7356..000000000 --- a/source/abutment.html +++ /dev/null @@ -1,123 +0,0 @@ - - - - - abutment.coffee - - - - - -
    -
    - - - -
      - -
    • -
      -

      abutment.coffee

      -
      -
    • - - - -
    • -
      - -
      - -
      - -
      - -
      {getBounds} = Tether.Utils
      -
      -Tether.modules.push
      -  position: ({top, left}) ->
      -    {height, width} = @cache 'element-bounds', => getBounds @element
      -
      -    targetPos = @getTargetBounds()
      -
      -    bottom = top + height
      -    right = left + width
      -
      -    abutted = []
      -    if top <= targetPos.bottom and bottom >= targetPos.top
      -      for side in ['left', 'right']
      -        if targetPos[side] in [left, right]
      -          abutted.push side
      -
      -    if left <= targetPos.right and right >= targetPos.left
      -      for side in ['top', 'bottom']
      -        if targetPos[side] in [top, bottom]
      -          abutted.push side
      -
      -    sides = ['left', 'top', 'right', 'bottom']
      -    @removeClass @getClass('abutted')
      -    for side in sides
      -      @removeClass "#{ @getClass('abutted') }-#{ side }"
      -
      -    if abutted.length
      -      @addClass @getClass('abutted')
      -    for side in abutted
      -      @addClass "#{ @getClass('abutted') }-#{ side }"
      -
      -    true
      - -
    • - -
    -
    - - diff --git a/source/constraint.html b/source/constraint.html deleted file mode 100644 index ee8bd25fd..000000000 --- a/source/constraint.html +++ /dev/null @@ -1,315 +0,0 @@ - - - - - constraint.coffee - - - - - -
    -
    - - - -
      - -
    • -
      -

      constraint.coffee

      -
      -
    • - - - -
    • -
      - -
      - -
      - -
      - -
      {getOuterSize, getBounds, getSize, extend} = Tether.Utils
      -
      -MIRROR_ATTACH =
      -    left: 'right'
      -    right: 'left'
      -    top: 'bottom'
      -    bottom: 'top'
      -    middle: 'middle'
      -
      -BOUNDS_FORMAT = ['left', 'top', 'right', 'bottom']
      -
      -getBoundingRect = (tether, to) ->
      -  if to is 'scrollParent'
      -    to = tether.scrollParent
      -  else if to is 'window'
      -    to = [pageXOffset, pageYOffset, innerWidth + pageXOffset, innerHeight + pageYOffset]
      -
      -  if to.nodeType?
      -    pos = size = getBounds to
      -    style = getComputedStyle to
      -
      -    to = [pos.left, pos.top, size.width + pos.left, size.height + pos.top]
      -
      -    for side, i in BOUNDS_FORMAT
      -      if side in ['top', 'left']
      -        to[i] += parseFloat style["border-#{ side }-width"]
      -      else
      -        to[i] -= parseFloat style["border-#{ side }-width"]
      -
      -  to
      -
      -Tether.modules.push
      -  position: ({top, left, targetAttachment}) ->
      -    return true unless @options.constraints
      -
      -    removeClass = (prefix) =>
      -      @removeClass prefix
      -      for side in BOUNDS_FORMAT
      -        @removeClass "#{ prefix }-#{ side }"
      -
      -    {height, width} = @cache 'element-bounds', => getBounds @element
      -
      -    targetSize = @cache 'target-bounds', => @getTargetBounds()
      -    targetHeight = targetSize.height
      -    targetWidth = targetSize.width
      -
      -    tAttachment = {}
      -    eAttachment = {}
      -
      -    removeClasses = [@getClass('pinned'), @getClass('out-of-bounds')]
      -    for constraint in @options.constraints
      -      removeClasses.push(constraint.outOfBoundsClass) if constraint.outOfBoundsClass
      -      removeClasses.push(constraint.pinnedClass) if constraint.pinnedClass
      -
      -    removeClass(cls) for cls in removeClasses
      -
      -    tAttachment = extend {}, targetAttachment
      -    eAttachment = extend {}, @attachment
      -
      -    for constraint in @options.constraints
      -      {to, attachment, pin} = constraint
      -
      -      attachment ?= ''
      -
      -      if ' ' in attachment
      -        [changeAttachY, changeAttachX] = attachment.split(' ')
      -      else
      -        changeAttachX = changeAttachY = attachment
      -
      -      bounds = getBoundingRect @, to
      -
      -      if changeAttachY in ['target', 'both']
      -        if (top < bounds[1] and tAttachment.top is 'top')
      -          top += targetHeight
      -          tAttachment.top = 'bottom'
      -
      -        if (top + height > bounds[3] and tAttachment.top is 'bottom')
      -          top -= targetHeight
      -          tAttachment.top = 'top'
      -
      -      if changeAttachY is 'together'
      -        if top < bounds[1] and tAttachment.top is 'top'
      -          if eAttachment.top is 'bottom'
      -            top += targetHeight
      -            tAttachment.top = 'bottom'
      -
      -            top += height
      -            eAttachment.top = 'top'
      -          else if eAttachment.top is 'top'
      -            top += targetHeight
      -            tAttachment.top = 'bottom'
      -
      -            top -= height
      -            eAttachment.top = 'bottom'
      -
      -        if top + height > bounds[3] and tAttachment.top is 'bottom'
      -          if eAttachment.top is 'top'
      -            top -= targetHeight
      -            tAttachment.top = 'top'
      -
      -            top -= height
      -            eAttachment.top = 'bottom'
      -          else if eAttachment.top is 'bottom'
      -            top -= targetHeight
      -            tAttachment.top = 'top'
      -
      -            top += height
      -            eAttachment.top = 'top'
      -
      -      if changeAttachX in ['target', 'both']
      -        if (left < bounds[0] and tAttachment.left is 'left')
      -          left += targetWidth
      -          tAttachment.left = 'right'
      -
      -        if (left + width > bounds[2] and tAttachment.left is 'right')
      -          left -= targetWidth
      -          tAttachment.left = 'left'
      -
      -      if changeAttachX is 'together'
      -        if left < bounds[0] and tAttachment.left is 'left'
      -          if eAttachment.left is 'right'
      -            left += targetWidth
      -            tAttachment.left = 'right'
      -
      -            left += width
      -            eAttachment.left = 'left'
      -
      -          else if eAttachment.left is 'left'
      -            left += targetWidth
      -            tAttachment.left = 'right'
      -
      -            left -= width
      -            eAttachment.left = 'right'
      -
      -        else if left + width > bounds[2] and tAttachment.left is 'right'
      -          if eAttachment.left is 'left'
      -            left -= targetWidth
      -            tAttachment.left = 'left'
      -
      -            left -= width
      -            eAttachment.left = 'right'
      -
      -          else if eAttachment.left is 'right'
      -            left -= targetWidth
      -            tAttachment.left = 'left'
      -
      -            left += width
      -            eAttachment.left = 'left'
      -
      -      if changeAttachY in ['element', 'both']
      -        if (top < bounds[1] and eAttachment.top is 'bottom')
      -          top += height
      -          eAttachment.top = 'top'
      -
      -        if (top + height > bounds[3] and eAttachment.top is 'top')
      -          top -= height
      -          eAttachment.top = 'bottom'
      -
      -      if changeAttachX in ['element', 'both']
      -        if (left < bounds[0] and eAttachment.left is 'right')
      -          left += width
      -          eAttachment.left = 'left'
      -
      -        if (left + width > bounds[2] and eAttachment.left is 'left')
      -          left -= width
      -          eAttachment.left = 'right'
      -
      -      if typeof pin is 'string'
      -        pin = (p.trim() for p in pin.split ',')
      -      else if pin is true
      -        pin = ['top', 'left', 'right', 'bottom']
      -      
      -      pin or= []
      -
      -      pinned = []
      -      oob = []
      -      if top < bounds[1]
      -        if 'top' in pin
      -          top = bounds[1]
      -          pinned.push 'top'
      -        else
      -          oob.push 'top'
      -
      -      if top + height > bounds[3]
      -        if 'bottom' in pin
      -          top = bounds[3] - height
      -          pinned.push 'bottom'
      -        else
      -          oob.push 'bottom'
      -
      -      if left < bounds[0]
      -        if 'left' in pin
      -          left = bounds[0]
      -          pinned.push 'left'
      -        else
      -          oob.push 'left'
      -
      -      if left + width > bounds[2]
      -        if 'right' in pin
      -          left = bounds[2] - width
      -          pinned.push 'right'
      -        else
      -          oob.push 'right'
      -
      -      if pinned.length
      -        pinnedClass = @options.pinnedClass ? @getClass('pinned')
      -        @addClass pinnedClass
      -        for side in pinned
      -          @addClass "#{ pinnedClass }-#{ side }"
      -
      -      if oob.length
      -        oobClass = @options.outOfBoundsClass ? @getClass('out-of-bounds')
      -        @addClass oobClass
      -        for side in oob
      -          @addClass "#{ oobClass }-#{ side }"
      -
      -      if 'left' in pinned or 'right' in pinned
      -        eAttachment.left = tAttachment.left = false
      -      if 'top' in pinned or 'bottom' in pinned
      -        eAttachment.top = tAttachment.top = false
      -
      -      if tAttachment.top isnt targetAttachment.top or tAttachment.left isnt targetAttachment.left or eAttachment.top isnt @attachment.top or eAttachment.left isnt @attachment.left
      -        @updateAttachClasses eAttachment, tAttachment
      -
      -    {top, left}
      - -
    • - -
    -
    - - diff --git a/source/docco.css b/source/docco.css deleted file mode 100644 index f690a0794..000000000 --- a/source/docco.css +++ /dev/null @@ -1,500 +0,0 @@ -/*--------------------- Typography ----------------------------*/ - -@font-face { - font-family: 'aller-light'; - src: url('public/fonts/aller-light.eot'); - src: url('public/fonts/aller-light.eot?#iefix') format('embedded-opentype'), - url('public/fonts/aller-light.woff') format('woff'), - url('public/fonts/aller-light.ttf') format('truetype'); - font-weight: normal; - font-style: normal; -} - -@font-face { - font-family: 'aller-bold'; - src: url('public/fonts/aller-bold.eot'); - src: url('public/fonts/aller-bold.eot?#iefix') format('embedded-opentype'), - url('public/fonts/aller-bold.woff') format('woff'), - url('public/fonts/aller-bold.ttf') format('truetype'); - font-weight: normal; - font-style: normal; -} - -@font-face { - font-family: 'novecento-bold'; - src: url('public/fonts/novecento-bold.eot'); - src: url('public/fonts/novecento-bold.eot?#iefix') format('embedded-opentype'), - url('public/fonts/novecento-bold.woff') format('woff'), - url('public/fonts/novecento-bold.ttf') format('truetype'); - font-weight: normal; - font-style: normal; -} - -/*--------------------- Layout ----------------------------*/ -html { height: 100%; } -body { - font-family: "aller-light"; - font-size: 14px; - line-height: 18px; - color: #30404f; - margin: 0; padding: 0; - height:100%; -} -#container { min-height: 100%; } - -a { - color: #000; -} - -b, strong { - font-weight: normal; - font-family: "aller-bold"; -} - -p, ul, ol { - margin: 15px 0 0px; -} - -h1, h2, h3, h4, h5, h6 { - color: #112233; - line-height: 1em; - font-weight: normal; - font-family: "novecento-bold"; - text-transform: uppercase; - margin: 30px 0 15px 0; -} - -h1 { - margin-top: 40px; -} - -hr { - border: 0; - background: 1px solid #ddd; - height: 1px; - margin: 20px 0; -} - -pre, tt, code { - font-size: 12px; line-height: 16px; - font-family: Menlo, Monaco, Consolas, "Lucida Console", monospace; - margin: 0; padding: 0; -} - .annotation pre { - display: block; - margin: 0; - padding: 7px 10px; - background: #fcfcfc; - -moz-box-shadow: inset 0 0 10px rgba(0,0,0,0.1); - -webkit-box-shadow: inset 0 0 10px rgba(0,0,0,0.1); - box-shadow: inset 0 0 10px rgba(0,0,0,0.1); - overflow-x: auto; - } - .annotation pre code { - border: 0; - padding: 0; - background: transparent; - } - - -blockquote { - border-left: 5px solid #ccc; - margin: 0; - padding: 1px 0 1px 1em; -} - .sections blockquote p { - font-family: Menlo, Consolas, Monaco, monospace; - font-size: 12px; line-height: 16px; - color: #999; - margin: 10px 0 0; - white-space: pre-wrap; - } - -ul.sections { - list-style: none; - padding:0 0 5px 0;; - margin:0; -} - -/* - Force border-box so that % widths fit the parent - container without overlap because of margin/padding. - - More Info : http://www.quirksmode.org/css/box.html -*/ -ul.sections > li > div { - -moz-box-sizing: border-box; /* firefox */ - -ms-box-sizing: border-box; /* ie */ - -webkit-box-sizing: border-box; /* webkit */ - -khtml-box-sizing: border-box; /* konqueror */ - box-sizing: border-box; /* css3 */ -} - - -/*---------------------- Jump Page -----------------------------*/ -#jump_to, #jump_page { - margin: 0; - background: white; - -webkit-box-shadow: 0 0 25px #777; -moz-box-shadow: 0 0 25px #777; - -webkit-border-bottom-left-radius: 5px; -moz-border-radius-bottomleft: 5px; - font: 16px Arial; - cursor: pointer; - text-align: right; - list-style: none; -} - -#jump_to a { - text-decoration: none; -} - -#jump_to a.large { - display: none; -} -#jump_to a.small { - font-size: 22px; - font-weight: bold; - color: #676767; -} - -#jump_to, #jump_wrapper { - position: fixed; - right: 0; top: 0; - padding: 10px 15px; - margin:0; -} - -#jump_wrapper { - display: none; - padding:0; -} - -#jump_to:hover #jump_wrapper { - display: block; -} - -#jump_page { - padding: 5px 0 3px; - margin: 0 0 25px 25px; -} - -#jump_page .source { - display: block; - padding: 15px; - text-decoration: none; - border-top: 1px solid #eee; -} - -#jump_page .source:hover { - background: #f5f5ff; -} - -#jump_page .source:first-child { -} - -/*---------------------- Low resolutions (> 320px) ---------------------*/ -@media only screen and (min-width: 320px) { - .pilwrap { display: none; } - - ul.sections > li > div { - display: block; - padding:5px 10px 0 10px; - } - - ul.sections > li > div.annotation ul, ul.sections > li > div.annotation ol { - padding-left: 30px; - } - - ul.sections > li > div.content { - background: #f5f5ff; - overflow-x:auto; - -webkit-box-shadow: inset 0 0 5px #e5e5ee; - box-shadow: inset 0 0 5px #e5e5ee; - border: 1px solid #dedede; - margin:5px 10px 5px 10px; - padding-bottom: 5px; - } - - ul.sections > li > div.annotation pre { - margin: 7px 0 7px; - padding-left: 15px; - } - - ul.sections > li > div.annotation p tt, .annotation code { - background: #f8f8ff; - border: 1px solid #dedede; - font-size: 12px; - padding: 0 0.2em; - } -} - -/*---------------------- (> 481px) ---------------------*/ -@media only screen and (min-width: 481px) { - #container { - position: relative; - } - body { - background-color: #F5F5FF; - font-size: 15px; - line-height: 21px; - } - pre, tt, code { - line-height: 18px; - } - p, ul, ol { - margin: 0 0 15px; - } - - - #jump_to { - padding: 5px 10px; - } - #jump_wrapper { - padding: 0; - } - #jump_to, #jump_page { - font: 10px Arial; - text-transform: uppercase; - } - #jump_page .source { - padding: 5px 10px; - } - #jump_to a.large { - display: inline-block; - } - #jump_to a.small { - display: none; - } - - - - #background { - position: absolute; - top: 0; bottom: 0; - width: 350px; - background: #fff; - border-right: 1px solid #e5e5ee; - z-index: -1; - } - - ul.sections > li > div.annotation ul, ul.sections > li > div.annotation ol { - padding-left: 40px; - } - - ul.sections > li { - white-space: nowrap; - } - - ul.sections > li > div { - display: inline-block; - } - - ul.sections > li > div.annotation { - max-width: 350px; - min-width: 350px; - min-height: 5px; - padding: 13px; - overflow-x: hidden; - white-space: normal; - vertical-align: top; - text-align: left; - } - ul.sections > li > div.annotation pre { - margin: 15px 0 15px; - padding-left: 15px; - } - - ul.sections > li > div.content { - padding: 13px; - vertical-align: top; - background: #f5f5ff; - border: none; - -webkit-box-shadow: none; - box-shadow: none; - } - - .pilwrap { - position: relative; - display: inline; - } - - .pilcrow { - font: 12px Arial; - text-decoration: none; - color: #454545; - position: absolute; - top: 3px; left: -20px; - padding: 1px 2px; - opacity: 0; - -webkit-transition: opacity 0.2s linear; - } - .for-h1 .pilcrow { - top: 47px; - } - .for-h2 .pilcrow, .for-h3 .pilcrow, .for-h4 .pilcrow { - top: 35px; - } - - ul.sections > li > div.annotation:hover .pilcrow { - opacity: 1; - } -} - -/*---------------------- (> 1025px) ---------------------*/ -@media only screen and (min-width: 1025px) { - - body { - font-size: 16px; - line-height: 24px; - } - - #background { - width: 525px; - } - ul.sections > li > div.annotation { - max-width: 525px; - min-width: 525px; - padding: 10px 25px 1px 50px; - } - ul.sections > li > div.content { - padding: 9px 15px 16px 25px; - } -} - -/*---------------------- Syntax Highlighting -----------------------------*/ - -td.linenos { background-color: #f0f0f0; padding-right: 10px; } -span.lineno { background-color: #f0f0f0; padding: 0 5px 0 5px; } -/* - -github.com style (c) Vasily Polovnyov - -*/ - -pre code { - display: block; padding: 0.5em; - color: #000; - background: #f8f8ff -} - -pre .comment, -pre .template_comment, -pre .diff .header, -pre .javadoc { - color: #408080; - font-style: italic -} - -pre .keyword, -pre .assignment, -pre .literal, -pre .css .rule .keyword, -pre .winutils, -pre .javascript .title, -pre .lisp .title, -pre .subst { - color: #954121; - /*font-weight: bold*/ -} - -pre .number, -pre .hexcolor { - color: #40a070 -} - -pre .string, -pre .tag .value, -pre .phpdoc, -pre .tex .formula { - color: #219161; -} - -pre .title, -pre .id { - color: #19469D; -} -pre .params { - color: #00F; -} - -pre .javascript .title, -pre .lisp .title, -pre .subst { - font-weight: normal -} - -pre .class .title, -pre .haskell .label, -pre .tex .command { - color: #458; - font-weight: bold -} - -pre .tag, -pre .tag .title, -pre .rules .property, -pre .django .tag .keyword { - color: #000080; - font-weight: normal -} - -pre .attribute, -pre .variable, -pre .instancevar, -pre .lisp .body { - color: #008080 -} - -pre .regexp { - color: #B68 -} - -pre .class { - color: #458; - font-weight: bold -} - -pre .symbol, -pre .ruby .symbol .string, -pre .ruby .symbol .keyword, -pre .ruby .symbol .keymethods, -pre .lisp .keyword, -pre .tex .special, -pre .input_number { - color: #990073 -} - -pre .builtin, -pre .constructor, -pre .built_in, -pre .lisp .title { - color: #0086b3 -} - -pre .preprocessor, -pre .pi, -pre .doctype, -pre .shebang, -pre .cdata { - color: #999; - font-weight: bold -} - -pre .deletion { - background: #fdd -} - -pre .addition { - background: #dfd -} - -pre .diff .change { - background: #0086b3 -} - -pre .chunk { - color: #aaa -} - -pre .tex .formula { - opacity: 0.5; -} diff --git a/source/markAttachment.html b/source/markAttachment.html deleted file mode 100644 index 750d85f2f..000000000 --- a/source/markAttachment.html +++ /dev/null @@ -1,122 +0,0 @@ - - - - - markAttachment.coffee - - - - - -
    -
    - - - -
      - -
    • -
      -

      markAttachment.coffee

      -
      -
    • - - - -
    • -
      - -
      - -
      - -
      - -
      $ = jQuery
      -
      -Tether.modules.push
      -  initialize: ->
      -    @markers = {}
      -
      -    for type in ['target', 'element']
      -      el = document.createElement 'div'
      -      el.className = @getClass("#{ type }-marker")
      -
      -      dot = document.createElement 'div'
      -      dot.className = @getClass('marker-dot')
      -      el.appendChild dot
      -
      -      @[type].appendChild el
      -
      -      @markers[type] = {dot, el}
      -
      -  position: ({manualOffset, manualTargetOffset}) ->
      -    offsets =
      -      element: manualOffset
      -      target: manualTargetOffset
      -
      -    for type, offset of offsets
      -      for side, val of offset
      -        if typeof val isnt 'string' or (val.indexOf('%') is -1 and val.indexOf('px') is -1)
      -          val += 'px'
      -
      -        if @markers[type].dot.style[side] isnt val
      -          @markers[type].dot.style[side] = val
      -
      -    true
      - -
    • - -
    -
    - - diff --git a/source/public/fonts/aller-bold.eot b/source/public/fonts/aller-bold.eot deleted file mode 100755 index 1b32532a8e40e483069482c3650c3ef22ef16bdd..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 29804 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 F>VRGqwvGS* diff --git a/source/public/fonts/aller-bold.ttf b/source/public/fonts/aller-bold.ttf deleted file mode 100755 index dc4cc9c27a59ab14fbb7444c6ab35c5b33a034f6..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 66836 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%0AAIIsziQtyhPht7#*LdNqb{-ye3^( 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ⅆA*wV|2E?UgaO-298Xthc^!eoT=hLnT61q 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 diff --git a/source/public/fonts/aller-bold.woff b/source/public/fonts/aller-bold.woff deleted file mode 100755 index fa16fd0aba81582de121d833c7bc50e8f1b1b981..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 33244 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 q6yXA@F-u0Z~1!1poleYR}~W diff --git a/source/public/fonts/aller-light.eot b/source/public/fonts/aller-light.eot deleted file mode 100755 index 40bd654b5fe63501ae64d5673b5aa45051a69e65..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 29509 zcmZ^}V{j#0&^3CJoY>BZZQHhOomdlll8J5GwmF&Dn%J4xHYUm3=Y6a0t-AHq*XzgX zTD_{P|Lh-o_m*-40PI}>0LcFU1pE&}L;WuSApnUGfd4c_)dm2d(0~-6`k(&4kpcja z{!cRJ8*lnQ{QnOefEd8xKUe}>|FbCqYys8)8-V+NCKQ1Bf2uXWmF>+v`kxJnXWaBr!X`7+c#VR9QA4~WS zjkr7owdQTqE9(cV$CK?f?TTq{WVR7X{DQXhE2;qPOL?G0N6(zMUYoLZgukK-+o zzW+IYvFC0HCHT$PyYej!9+$b8=0;LR7V^6~5K|VNOc*K9ws!=`v|dHdimw`~kuyZX z;g;s@?i;j?7g=3FEwo3T^A-e(jU9Zc>XWX+@0db1ACx^gGXBOh(u5Y7bt!wr^=>jA z=>0)5$@ursZM8Q!3yrPgEDu|-wk(zC=YT`3lm0ZWudvM!goERNdM-n6<=ggF@WN&*jn*wHE6sKh26zaoUq5DCn7jb_dB)%Uu#dE9GaO8ia z*)-SuR49M;&0S%8`pS1Wq9bTA0=h=J{rxMPAL&b=yGRI>lqj>!zFb@+Y5x5N-=#LN zbR;Yx(4a`j1(jAejfu^mwa$^rM2*_PN;!oyx7I9*(K9c|PUG5hRSEnuHnZCsbdyNWXqYHu-f<5J6oC}x7U<5}n znRCm@*V)nvizOD(l@Q7D40*w{Gx1=wrIAWD3){dUj^c8(Y3Ha22}WWyo|I_nvol=` zd_K`eQwDowsZMwVmC!pzd5ft~6$L1ADq)$*q=R_`qa-3!b^t@OC}cu4lv}OrR`547 z_6@PsOy0U4J)oEc$tP)x5?sj$`t8=Fn5zth3(Kfu^HO_a*f%m7+bH}~Lga1Q1sc!@ zWdUEL4cvv7cn`{jYEh{vj&LmGXDeJSEl}2;9HXfUXm9LFrcO&U`8}G3$vJNUBA@Xkl`Z5vv0F$8FbK3kZsKLpn zEc~&~zT8Kc3;e53@4fzE2uQXJj;c&0E-qUrZ`7LL?kV)S1ndX5V>qM+UiPvXtw;J1 zvFky#G=_E$qZv#VF<`aQSR;jw@a1DiklXsU+T=d>s(){=Hcjm-lOR&b{KrWK*?8}{ z^V0sTy~x%Dhl7Z3O%KAB=WgetF;LHpLh0OyxdkIll zmxG9q&vr(oS4kCxdL5Rq(Q+dy5Q=Xn5DmKdte^^=ehr@-9sMwQSzhSPI5-1raqH|& zcA%bhde@c|bF5|sQsv7u3%RTy^HwrC3pPP(ZlXjd@YxrZbLKPm?(P2h&LqV1O=jN# z8ja$vT`cGeNdUK_>|4=%-$b>;&BPwn*x@t|x0pt<%djPff##qa5zgbVLNhw^FuBpR zcVa1}(^*Dn9JEM@`~|M`a5sliD~?>V{`cT9xdIk!>zIBv3b6>-d#)&)hZNUd9;U&2 zv$56kAoEX(;zxYk!a>YB(@cm+-R-g8`Sa?+VSLfl?3C8Ws6{y4Cp3msJB?z`r3;@N zJg1A$3~6S|!qWIKay;^^+4me2YNuKV<;e0onWgZkTnqSA$wW`;AX<3_l*FSYetPmu zC(XTWjpfp4GaK@pX1Itb+6ad62nSqF*^_zS2C0Xhgx0H&)piu=HG!Z(i3M)$lh5LV zU>=cwTb;35hu@GuJhzcdg>$7Qb*KOc(>qiyjTs5h$BY~b2hBy~S z(DVc3QT&(;hNcRQ!}2WJ74?CIvvz$b&dQ~Sdk|CWPy89BHfyB^L`o2mcUBrD;OVnX z*3s_s&zR=Ni>TK>U|$6(nsEIxF@PXUU(A)?CX}Bfly7Z%MmkdVJW}5GLc~3rQa3t~ z+i`>6zJT9pUZ6EwV3109(!E(X4+nV~o}%|M^@DMDi*CA~)*fuP{4klA00%UXPM^J~+p8Jry1FvLc{? z|E=y*v1imBbG8#)zNk1d??o`&R2D2E>x;ZQvApx4ZXKv66}|bFb|5z`j5L3)d2)R3 zv@ZdMk9A@-EV=}5G_9oSD0xI8Ewgm&7kPXVmTzRq+~qqz)#_Zu5|YM+6G6Cl#fl^Q zVVH2S>F;_)91D{`WMo;0!dCz%Seo^7ha3QIgfz|-9ck$e-V%Z?3p?+FP<%zO?>9+% zcoSz%cVqb+U%r-}brtYpT+PuV+$=d^vNPChYd~!4wR$eK+g9}`=P+A@hqBA)!1ih# z_1>;e*^~R?#imM4wTX_Qa6_lRbnPqBH4Wyo zbHY~FPn1#Kptb!x^GG*BDayRi8phwjTv@;xeQIT8p}YXySZ)fFKJ%8SpaTLMx~S{y zD*9Oc7IJ2gI{{o1^AuBUGP;3kY3^KU_bh!4ptIn?nixZQ}7K96v1p=^Z6-yOTKFarIU4T`9kP!#>pX#5MLUI{v}Pkt)eos!6Y_lh#fS7?G*qPO!7cOqhjp-RIFI0p14@jH~A; zSOr8sXRv;)$A@}((Zkze+NQq~u@5boN~Op?S2(XN_(MS7zp`JhkCXn1W98CO=Ramt zsYJD=mt5z|s4Oez&%U78 zO)H3eY;&*9S62RbJ;)mmHPR(f;;dJqFV;Qul+)?ruAm;)aG*omslno16X>S2#qzfJ z!m+~nK~Te;*XXp*4G+|8*i;K#qAL>Jz>6!2rWOxX45y$JkPLwbX~Rvf%tVHmlZ6G9 zur%688-A?2yJX5I)61D&+*L7ooXICmICCcUo{w`>7UV&jju>KM+fIv#bL@^cs*(3s z#*ITddQ;i3uTyr)Mvo%QAxyTUhz4_yXS?j#5jAIsuMh@F(DNSpR`OPy7@3JxqJX1_ zd@4A#3E73v<>rktb)&%&dRxHPG$rL=XY0}&JGu7K97SXW&3<0XdUAFsViL0TmyJfo%jnd32y=WL4VnR|7i#hSh@UwShL<^^)zd9Vvzf zOaI<5U`Z4S2$*}6qbG%d1URnf#*HLy=^>BkZuuc5BoL0Pp2PzW4*=sM2z>gg$DU*5d#CuI~00|*BWc)e+9N^xYWNiufwM^q^Argk~$ zapEI;k=()P zP)gnad9?Q`IW14P_9SBaicN0*+=!F@Y6OhGP}=yqM;7j7WBReno>qEgP6CqNGeN(2 z)j4&T9jJO@{8d=gfX&`6R(naR@%LS{x5nACD8-2?lM5VZ4N~-HzPXIKa|6csht3DR zX>70xOeeJR3q?}c2&TGl^w?yoB^=t2G)`Q9{^;v<+E6(kR|C`1Dd<6gG)(X?uFJ7l zli%f7jxgIqpWJJ#2k4#anq#Ryd0PS4yn;3l5J%T+oxf2XK>|f{@DL?Y&l-9^O2S9v zFZID_@|y486I$LcMpdf>EipwEjXBV?NR1A7qf-jyOMwwd+;J-6&-Gz6oNg5OO<)@= zHsxR!4S-mqGClQiG^R! zWptA`GvstUaX1Le)3XDw4{tg;O4Hv``oGc60Y-ZA`kQ7IpW)Manv^=EyW&US9iQ7* zvt(54r+-0D%HYG1!=HU?%eLi2Ye^V6p&QRYbDU(Ag2RB137y|YaBKk)dPQDblmSCB zDRpf#D576WJFrg7MxgMp+eG#4U2Bd`bIDnh`+2b6M$%97UcAdFnlc5t)D(zX_5Ugg zKxy?ghArs*746J3FJVTD#p`aRlw{5Bv$!T*6D@?9@9unMv%qaKw^bd12zQA^G-F|| z2Dm(jMNx&FAx7zdoycy*Q%yNHJwha7bykk}kwL$R$dptNd_}N$E3-4zRMp^Bv03N? z(1kE{{tDawt=4iyS>WjKqY(38I{@^mEfMPnyx8@Zy$*-wb_jMI%g52H~2T zA6oxqFeaR*#L7a#rYI!;QqgJxUxufC^sd2x;Te*apr^60( zy$TXhwb&TRIBZlX!=EmzB>HXQ#Z@7_ZR!S5wJYXE;%6nNXCM&iJz{{1=gTW_x#!U0 zxEea8Yl~nQGNmDe%I&NEt#99C9MM>?pOdvxx3PH>We@Y%_ESifRwew7O-o|9w=H1lB zOpS}noU2MoLm?<7z=8+Cd?_9B-E5j_AQ!8s_R;m{tvRxxzbc zF>RzSDm>Jm{NT&eG)GVkilv7uGQG}608z7#Y4{gg7M+$3F%iy31ptpE{IPU$m83)y1Q2Aunl03>oG6i%_gZ z=0V9j!!ef3m3=1)dI*D2@YHh9dKNTlF*b-r zVDd@G11!oxJIJ&2z#7+;STh!cOsQt&^7P2`dURHp->Fe{g+HV)V*nDr$Ju&1#KM@8P-N-zMd4Hx2GY9!XNHI7zQ|8k7On{W{wHJ4x==(4KJF;oY6mnE$tPvM? zChZ8E!7nhwgO(4lIV-2d!2v5sre6H*6QHC~d*<~(0V+#>K}Am)0Bsq37^X%-A%#7O zO|`N)mXW5E-k+GEiKS?Zu+(%DuRv(*_#{Bj@&`UUCDd+1iL##c&PL>5bLNG&>HOF-Mdm(s5u zVRcUSo>@-*T{Uq~z!b@$JUmkpD<#81Cyx`>kO&|qd|4q8jTy*&=nmW>i-C|&8F-~E?pi)F`DAIL?#O*co-jh-!pxhp7JLu25!}P?ToPp zWX;p&L8)qVj^k0(859JW!h&3Frs1Kt-FXh!c4bTDSkh2|%>hr5g^U)wSoE^2DzGogwWedpv(@E+Mx0^tiN_m6{!ry|2l5_H4X-4Bzx@9uU!d0NkL)ZCKLbO{H=&66fNs77kr!n_R*^OJd+G4fg?r$*5+NDgF@nYm>k|-#SQ&kfKd~Iy>1v2DyS^(V&Aq4o3_j?| zxoMjsH8>d3>unTD|6Z$H{4Z*Q!svt}FTg#iezVn&oE3QGB3D_qvvNKPgYpvp3inj) zFA4zk%t1bU<|CQlvc~6&yL?L3hlKK)>a4${LhsM*Wy|(C1-e}(bd%yh_yC|J!m2Y9 ziBH~s;Na-dznw=m<8wAUb}hi2L*%eWo=)0Z(DRZ(^cUf&f*=Pb7@aen@7W-Zax~>O zOIj8e0I@Im+#z$CyIjNQusz72JpdFpE`1mk*_XPerj<9_QN;~%n%7i0FH2%lTjBce zlhKTbtaFHS3y$=s6krO3V6%^Of!T z14gZ>tWV1|Q2Ix-LmbmI+1-6vj}Rty>j)s+Z-l^}4$j z)2*>lZ`Ka5UW!=_>W}Gp3}{L#f-J6nr4WQpJlJ7oZt|u$3fBux<%l(7pd!KkW^$~T zuN?zH-3-F40Avsa9X@E}`maOiO4|(3w8#Q>w>SjvF22=8J$qO@JTIX*Nftj)Tlr9V zl@gFdQEEgd?PR+0e8?RQ0|AhrH^x=Y7s*6BBG%~nVK@htC^Z)yDJtplK=3xIi8h7% zB^2cT{GGzO2vRbtV_?k(ANMT#l!n6WD6e>flt0e{K1A~1-5U#;_^*1DAb}&;m z{zOphAlrfZujn-ZdD(dWFYvMRP~K6rUOEBoo~HraI%zi^1f={Hu=|N9h4vJ&Cc}m#=*3+j` zR9*`8u_ku;>9F+vrR(~k*3 zzudya>*V3BspY&f?EcS{T{{OI?A>!lXXj+@;~zD-@fsgf@gd`=3UWRG4DOq49gm>i zbz{PO8%o>#TIFCnbJBO*Mj`bvd116B&*}g~E{!9lR4RE?d%8w`+HQEqIxnl6Qgs{X zQ$0isq=A`ZugY6pv>S6#oQKhMUMPKjtR1+|yRTJ!Tj?+w+HUsq84gjCyh&_*p(ZrW zLKaak`jP=v9Ok&qij#?}-c?Gek452#ON)nMoS4}tMK~u;+v=BSt@U025r0$TYq;i? znFOZ#wGjLoZDJ|hn`cfNkl>U7lP8qJ+J2ST;O}?B;^m3VD zoBdU5&!{GWswx~xlXN7<_+zd#8~I)s{-?V7<^y-sQW&4Pm)ACXKLu8R}z#Qt2VlFNsi8pC!B9D zcT69XXXb6uYhgwLsMSeErHK0OPMx1Ib4%?s9zqWPJ-iYN^&~%56YMkAq}9iHaLjta z8k-^2vm2KxK4K>{vN4tp;fSu3hpTdvhW6kVcD>qFD za+MQgJ$8%FJfMcfC4h&y-jVYRU+EwE4z&&2`n;)~t-}v|^F>t}))8`I3~Li4?FfS4 zDIyxHL@U?U&ktMDlk&O1yoNgW$UZj!7WYR5rH}L)Uo%<}M-F4rro^L3nMk9aGN4y( zS@1i58eTMlDG3`blKF(=fj3ZTZG8$fK;x3pR9g@95 zwT*P>LgXUnyp^(YxpBs=Uugpx)*tP>?i~elq%!^E(F_@6vAz^4-3W1p)ll=G?MqPi zmF~zf(?Yht>aR91%PpdoZIhE3uT$4JGL`PU?juRjBWlE=z_Z&JmMIv=CdyuZN+3|1 z$4}aBEL;dnmmeA}UJHLM0?C^y4Q32(cjoP z$|OSXeKGJ6Csl@F572+Q$F@lfu$eflIEEu%(c$1l-e&_m;ilAyi8^l+3(P16e`h4g zu=+=xHa2l70(Zp3(NEuypxD;qni^*islKciyUfnb^M$B&s?ULc4{x)Qc$GzW(O+^7 z+VUV63GHf9YsfKJYz~Ujz@{O#_%wf{bITtdsmNi@ZamNSP>gNw{5BryBqZuN{}9Tn znXYWY(ddhjpbrjo)9YR4*Z)SHQ?ohm39OIkBt)uCTfj|$MvwlPg#k{0*iDlHZ55VSq+8BQuhX% z7FMWoZi}Mk+_*D`H{Z^-D!IZi(F8VG7mYX%>hc4Qpm+;MJLE82U3SKs$EFZBK+p@O ztnA@~ep>(-XPFfuRZtU?%fa0>uW6iaA(SyoDXD47#+llUocQ-F`fV+$)k|R~sMx$B zO=iz-2KpEwp2GeWlECaJN6aNx;H$($LA zM@fk}wGshO7`%uh(xQql?yI?#nAHpkbv8`AN)~dQC-65$nK)-2Cwe0Wo~R8gy{^9I zDVo?;v6y*;VMeKNrrGSZ(sm!z1Trxa>JZnuV(&YMfEkHmU^>+5&3Cs*({R2T4hmBW zpC)FiW=+EI8}B1dVfMw_&K(6Z9xosvGDrU0xP)V(99Z`v8-GjkQcrU6;Z&*y;lFHj zZ1vrxyN?L_O$vs306Ai*<5kQUOTn{n^Bp*4tji`(p=$#HD#jYBq`kpw^iuf~BQ;nk zZ8X;AwG#cTc{}-O2brcWA?E+^MbSB?SU`f3nT&9KZo%2IshbitKV?J1VM0e|EhxAp^Q3H?7E1)_X+JoLfLB6M#8%G_!09*)oi`kklOxdQ2<`#)j}i zJ={uJE(=dIEKB}7cjpN6ny*?i#lMau1A`O}$iMWMvgt_bhHFfo^U|SG!MFor0=r{x zvX(6tg;|x_!9xh;mzoXomvqb{{fE3s+%mia7tylWr*4N@_*_4$#3(N+H18pXUB2S6 zSfgA~0e890i(jo+DYHe#mLt2~NSJpcdK76nz*!bdvmprfLF0BpeBpxVbVdYR{&m}G z(lE->$Leg+6$;fxkHj-5xHtq-2sW47Ea(ez0gb$LTd65n%e%;Wy%2~*0Nh5Q9N=io z8<5!NE)0_0L}s-l1Xv6t#^HT%6)FbvMH?whpQ3>m(2{lZafO+LQ*lp}6v07;Xw$)E z`O)PA`|uxNECZyIo;IbUWQayyyM?!+^<8^Pt7c^2`pB~KEGMtBQiOGarZ)LTX!UQ; z31ASg-Xz#M*JqB8esXV*cx#rXDsPBYsS}c@dbcTwmE_xA*XkXb8`-}x#Qs1tx&=l~ z2VD;5#WrcdQE1MEvjXdVKEb7AncXZ;kN>Q z(1`uvZXqGlH{~WDu-Ghlc(zTn^`r?!n)q&oaH=VIOQ2d&S%t3uk?+Tu-R(fWr?jhs z@O6>(Hqnk=Oc8kWzs1#^KOTr61FS|He52Gq1iL$ft$!AE%V^i=^i!>YUF$T9)lD_l zp@t&DU^t{wi{K;Md`j>aFLrq5T~u~}H`a33Hn~`xMJI(~M;k6c>e)Q`ixM0Nprye^ zyko6%B4ea3IZ6E*Ec9jn^?NjC2);f}4ZPhsUfct-8&wfKIsG<+Uh-pJQlbho1BrJ5 z^gO#;!Vc@8Be|j(_Wry^<}tx7R>fPQel(U;?t*h2nZ_@l$}s2gW*yN0~7U9FwmVp4Ej%B+7x3P5++26Z_%a zVG`0J*&Y@vg#2JUU$M{^!VAEvak*2JWl|-VO(_52fn6S!jirlX7LUeXQcvpW`&|f~ zTlbnz<{qxWXoK%U^o=%X{7XdE)nKEqLWApvR?HLjC8e#UJZBx9CiM;Fi@K?_%-JxU z3d`oV`r`L4o)HQB=a}63jdqNCYkh`Mo1OtwR}$Z$`=0jgzch+8ymsXUarkVLJVwVn z26fFhEpdElU$QHyvKZw1JcMytylfKg^@T~EPJ!7!mwvK9dD61EP1{T6}aG;%9Y<*_G%she2$)zk*)s1 zS||&UdKr(lnb`VqQ6ib(|K{dTdJEBuw#DBe86Ds>HWOThTo{ zw-gV@1NJckI8Zp|8^-rm#`5teR^cOgPSKS|BuQv4w96&z-NSZe`=&5@;zHL@-B)dor|LbG5|A~{elgj8+Y^@Oy<+hze)<} zZ>wfOxh*ZvllNw;kMwesnhu4KVs#BSdm0chA1p0~=mNYO`cl1JVdjvb4kdE^=5-N> z2PLx8)_6x@P#cx-Z67$!^NLAJN=n*+N_;R}I@@7a?+t_5Rbox*226nJ$qs9(wtK}hRGCNXY(KIA8-hJZ zJtHaIGEwC5Z*vuj#>agyi8C>w3L4XLT}wFQ(8+gJ#F9>V{Lbz6bfBZs4k~&|T#YP) z2Wc{PdxunThPu@n-fbMHYO!0ETJ(*2X z3kQ^0x40(0kYV(dCmY>wWmSVowI2hqtR7Aw3L}+YG~+Y)rzk|}$|H}8a^SoAa9mP= zgO=MxpC~u0us75|BqrK6^e$UYMCuIQxmEKkr63!)&GjfJ_9?cV@cw@g+&?)Sp2#BSZv!TY&PDI|9ZLkKo?JmSz zot_MwIBANT{9cz|jH#G=B_7R787HEW%!e7!tMoKBD(IS7_(H=!fZgRaHR2ZGJk(1;pixbn;5B z>ZUt%YwgBPqV%LAMYE9maZ`bl!|MZZWDtm{!2j-c7m05O?Yuo*_XGM^m@k|2j4Vha zTA|id6I!fSbq~@2=%lNFUn_d9Kfy0tA(TL~)?zY=d8Rq=N~EvYaws!7+>HFZDMzB) z5}^f;Y2y&uh{+h{fTauv+a5$V-SmSX)b$5+TFsX9a|&Kj&m!q1@_k}W6mbi0d-Rh@ zej2>3WGqHSjUmE{T*kGH?dOVib0d7CL2G3}E(!}lO_hEA2eg1xas;}mlP4+1FERsH zao9}!eF;REVkjQ3c3p++@zhw5f|(@EBJA|it2{0M{nI2$`&wOuP)Ql0B}Df_+2xIh z-dwxLW{!h2*0xFhZNJn^ZdY)0@22>QQ485-60!kGnyNT&)-!qaxQ@zKP`B))ul9vO z4_~LB;f$WSR+m`XNC%*UEmiWqfrIUO%6P19m-X8<>_k>tYW8`6UStiaA~LuknpnMa z0u&Ez^H4WP`6qp3H{Hg-5r1r;8(#-)%Nx5vXAvKcl90JWAt}B+xuY5bHl{S7-P!nxBj0uPDVQKEFlv(IIZ|NaNU zq{4@f=_+BJ4s;VE|oiToI=qrT_JWWwa=nFa)FGCT{!++^(iMVEOhHwpxl}=1UZuiy?$uOYF zuXI$qVS>5modVZ@phELh;iB-oL8$fW%@PWPK4LtTuyPvwuq@G_IpbDQWXj#&`7>yC zPapLE?g(<04kJNy{G=aos z+OGGMR5&aYlzu*Q`BU{LdA;{{YJ{K4$-l@Ssx1=^Z5cGK0=?VKez^Kd!u=?Qlqrv? zA0!5+JL9NAiCRK8A-F=A6I+$uadhf4!C}Fx%LjjFIF&$A>neFtNcH$Mz7 zRv2ccpnjU&ym5? zHsmcCy3zCFayrEF%mlRw>!UTQXLfvBS5TA4_PYDo^4e z50`6cu>JyOZI7l2XvQ<0V`#DFNk9(XDJFKgVy~CbhlO znz-Brmp8AOAaqZQguS^?Or}3m?)!&g_UD10lSeVzZGyY=_wlh!c}Bcu55F*?%XPUB z`oCpsx+rGy^R>B^FUB1a0M3ada4TaWLl>SYgoR0s(rq`z&~HqG>JWc{3q;~v71?eP z&oUu02}lWbyBl7;QX2#l_$~1thVj!?`g-3{2S5kjZ#f)qPv;suD3rm6T9FD-6^q|C zL$nUaOjfL}#r7&7{tRP^v)L5sk!jizB{gMZ)cy2h1cDqt^x^U>4Dzu%)ADb5)HccY zugN^6$OBzV5N}Dolv4hvRY;NK4^tIG>LVP;Vvg58M90YL&xc!=Lcx(94;~uU5>mCkvNPDHHXku@^JW%_^e#yoK^Y@Vqmh39 zegcC)jQT{{$$O|SjgDP3LnNWlxO>bZvHgALDUhEknPTnGmIUc9=q`gQ>L`be2aPPMFS@z zSguvc@uJpSL@zzS4>e+<`n&qSp_p5OC$fVJL&4#msANn3cBB(kZT{uy4RMccHw=PvyN3)Jd2S-Np~ z(Sa^ce^CY(*H?8v?c%R#9oSjXwq>YbYv5ybZE}lV@3b1%<)bdiJOjp>D5MT#||H5#*LNogU zXzY)ESU@)gxIWxy*xn}Uq7a?CCRQuYYAKml*-i%7EFg?u@2)pnsrNez{wQG=hzHflM4=4qzKiB z<(2d+ta?1oxW?!X)`P*bC{rA?EaAn^tIt8-uUt}71>iPII4C4OV?6+kT`dG1DXB2kK&zeknb-1sCr4OZK zmnw_K<#8zwt6=V1(Kp>qOxk#iFhB}1l;U0$8LAPXKwJ0jar(V-iw})OY~Y(k&3w>w z=(Ul`!+!=GWQI+a2H&6E8*3K zoa6ojss57!g`-joSu?OoKOSZ=sF4b#w~sW0c_PachA6e&1_Up6RCWMIofkM40K$RR zk`?c#Du_WKQD{xa_L+6paSv`OP}D*dv4#5it9{o3BvX)GCBHDL?qeth^uki7%`HoNAJYfDk)dux_XW zZo+*^tna416OhAohA(AFFf?B>Dp`H&)<~vhD5%6en&`K+5grDeWD}Ncllj}Iw48Bj zBdBCGKRQss3;TLdA(Xv#z79ikB-~z#3WBu|3e_oTac~e=_(+vf;3S(Ynhz)3PnR0s z^I@vCN0qbEJU z++vw7Fy$o__Ghh81nBDJw-yg%*N)2ls}%B~d(L^H5Oy)lBD*v$6BQniVr7?{S+W4h z+LY+EEe~K}6JV)DOIKEu*PA>#=t$w7Lv=wARw~38ZOp4Ap4eRfha#JM>Ge#OQHJ1D zo4Z|Cs5RO9wk~=MPW#Z!?vEa?r9Bb2!g6bk;ljvdmJElZpvqE5Z#~{QphUkwz;|4Q zd$e)38w~UA$!HsFzBtn*SEbT<8pC~s{1SsiJ~??krUfK3S05f0DK$>8gLWOib9*&c zEv2jO21v7y%dkTdVtTs3OZ^5H=#jdtA9g}5S=pIx?;?WsOXAlsaM5}b>vm_9LLD-N813XhpbH5m{9#)0zXzZ+y@_Q|HA;Gbmv5`eMk4O3Ngo;3v|nd7os zX$OhRCKF!;8~Ay5K3Ga=Xk$k}L(_Tp75YpS^iCN=@B6V#kCBq&Z4r&}@ zE=<(eUo*V?)$*ynDYNr(3?=52y{&~3XEQ5i1LTD#@1G%L*ibsOvDHa$8G(vbDuzU|zg~zL z2#^+h>55*b{nB;kC;Nig)Fxt4Wo~8dn4p3ENaJ&ZS1yt{sKcRgrl~i{7Cljn^y1qq zYm8K+m5r3r5|6J7Y06=yzj1FL1SmiB0`p@(dp6SOu3PM%li?joF`&K){`EA{B5@rs zmantL5=oF~iel~6CnJJ*+PkB`0vgn+H~I<^L+T=Z zu~F~{#S$j;1(n(tMq4%Gd>{?v&FvemXatpJL+x*zPqzyZ zIK#(lvxG%LTf%*;&$Dw2Bi}Y?(w(-bDQb}GDm&>6*CSd8gYxM||KPom$YT*9WJBUc z{v(mAV*b~eI_=F_@VGD%)k95PW;`2+^#Lf3 z-{FVS9RI9kVhh~g%A^!b1x^rC3r3#Q;0QsW8Xj{_p!qg+1t$gS33h%GlN=DLpA%Vt z%Nv`Lm6$BgYcyFoQ#bVeBE3lYze(=2N{jsy@s<~bGfE#gO8??qXiu<(00<-xYJAI8 zgcDDp>i_ieSp3x)DbEiD(B3aP)-rNRJ|y4 zG(5hmIfPl$S*qjrO=#5x^0LmR&P?Lu1>G=_b-a|ki0X(b>*+rnMd+$SE87vcY2l4)X0g-y)>VAB95PL~aZpkXKL>|FZ|t7%A+=%CgG+?bTok2jJ{j5d*CE~OpinBK6|8p0f`Esl4n!2@O}zZE zn62$U7}S={P7W>FpkxN^{CMM9OtOzY6Dhc`KpmC?W>dPtLeIO&KMp}OvBAs#iZcJP zS=t{LZo}KK^cpQ*Ij2FkKH`^Pz0x~}PCr3f(?K)Qfu)u>>HnS+be1ax)H9@7fjuRp zI;yawvA?~iFVizW!ql3B{iQVTPu7;D*SO5r;zltmi&bPH@`cXn(Zq1@`zmX)mj+g} zA!lV-4SW2+LCRka9?#^)PNw?k0T_D&1d?0&uoL~laq_46RYt#P*$vo~U##CT5kCm* zqc8!k<4yt0)Zy%0{)gS0N{wC)w>y8|^pn{L=cZ(Hxfe|z|4j9*9zqkbRmNmYwM&e8 zBc$3kE_%VCU)J;o zW)_NZ0|vDi$!(7BU?(}sMiTTE<86wWi_WE8 z2jrQw@|22)zt}owsakKC2tQSiK869iwYVuEo1U1q@qWY1A�y6>nTFX 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 diff --git a/source/public/fonts/novecento-bold.eot b/source/public/fonts/novecento-bold.eot deleted file mode 100755 index 98a9a7fbabb1083aca5143bc306e228886ff2eeb..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 18190 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 F001ed(;ol; diff --git a/source/public/stylesheets/normalize.css b/source/public/stylesheets/normalize.css deleted file mode 100644 index 73abb76fa..000000000 --- a/source/public/stylesheets/normalize.css +++ /dev/null @@ -1,375 +0,0 @@ -/*! normalize.css v2.0.1 | MIT License | git.io/normalize */ - -/* ========================================================================== - HTML5 display definitions - ========================================================================== */ - -/* - * Corrects `block` display not defined in IE 8/9. - */ - -article, -aside, -details, -figcaption, -figure, -footer, -header, -hgroup, -nav, -section, -summary { - display: block; -} - -/* - * Corrects `inline-block` display not defined in IE 8/9. - */ - -audio, -canvas, -video { - display: inline-block; -} - -/* - * Prevents modern browsers from displaying `audio` without controls. - * Remove excess height in iOS 5 devices. - */ - -audio:not([controls]) { - display: none; - height: 0; -} - -/* - * Addresses styling for `hidden` attribute not present in IE 8/9. - */ - -[hidden] { - display: none; -} - -/* ========================================================================== - Base - ========================================================================== */ - -/* - * 1. Sets default font family to sans-serif. - * 2. Prevents iOS text size adjust after orientation change, without disabling - * user zoom. - */ - -html { - font-family: sans-serif; /* 1 */ - -webkit-text-size-adjust: 100%; /* 2 */ - -ms-text-size-adjust: 100%; /* 2 */ -} - -/* - * Removes default margin. - */ - -body { - margin: 0; -} - -/* ========================================================================== - Links - ========================================================================== */ - -/* - * Addresses `outline` inconsistency between Chrome and other browsers. - */ - -a:focus { - outline: thin dotted; -} - -/* - * Improves readability when focused and also mouse hovered in all browsers. - */ - -a:active, -a:hover { - outline: 0; -} - -/* ========================================================================== - Typography - ========================================================================== */ - -/* - * Addresses `h1` font sizes within `section` and `article` in Firefox 4+, - * Safari 5, and Chrome. - */ - -h1 { - font-size: 2em; -} - -/* - * Addresses styling not present in IE 8/9, Safari 5, and Chrome. - */ - -abbr[title] { - border-bottom: 1px dotted; -} - -/* - * Addresses style set to `bolder` in Firefox 4+, Safari 5, and Chrome. - */ - -b, -strong { - font-weight: bold; -} - -/* - * Addresses styling not present in Safari 5 and Chrome. - */ - -dfn { - font-style: italic; -} - -/* - * Addresses styling not present in IE 8/9. - */ - -mark { - background: #ff0; - color: #000; -} - - -/* - * Corrects font family set oddly in Safari 5 and Chrome. - */ - -code, -kbd, -pre, -samp { - font-family: monospace, serif; - font-size: 1em; -} - -/* - * Improves readability of pre-formatted text in all browsers. - */ - -pre { - white-space: pre; - white-space: pre-wrap; - word-wrap: break-word; -} - -/* - * Sets consistent quote types. - */ - -q { - quotes: "\201C" "\201D" "\2018" "\2019"; -} - -/* - * Addresses inconsistent and variable font size in all browsers. - */ - -small { - font-size: 80%; -} - -/* - * Prevents `sub` and `sup` affecting `line-height` in all browsers. - */ - -sub, -sup { - font-size: 75%; - line-height: 0; - position: relative; - vertical-align: baseline; -} - -sup { - top: -0.5em; -} - -sub { - bottom: -0.25em; -} - -/* ========================================================================== - Embedded content - ========================================================================== */ - -/* - * Removes border when inside `a` element in IE 8/9. - */ - -img { - border: 0; -} - -/* - * Corrects overflow displayed oddly in IE 9. - */ - -svg:not(:root) { - overflow: hidden; -} - -/* ========================================================================== - Figures - ========================================================================== */ - -/* - * Addresses margin not present in IE 8/9 and Safari 5. - */ - -figure { - margin: 0; -} - -/* ========================================================================== - Forms - ========================================================================== */ - -/* - * Define consistent border, margin, and padding. - */ - -fieldset { - border: 1px solid #c0c0c0; - margin: 0 2px; - padding: 0.35em 0.625em 0.75em; -} - -/* - * 1. Corrects color not being inherited in IE 8/9. - * 2. Remove padding so people aren't caught out if they zero out fieldsets. - */ - -legend { - border: 0; /* 1 */ - padding: 0; /* 2 */ -} - -/* - * 1. Corrects font family not being inherited in all browsers. - * 2. Corrects font size not being inherited in all browsers. - * 3. Addresses margins set differently in Firefox 4+, Safari 5, and Chrome - */ - -button, -input, -select, -textarea { - font-family: inherit; /* 1 */ - font-size: 100%; /* 2 */ - margin: 0; /* 3 */ -} - -/* - * Addresses Firefox 4+ setting `line-height` on `input` using `!important` in - * the UA stylesheet. - */ - -button, -input { - line-height: normal; -} - -/* - * 1. Avoid the WebKit bug in Android 4.0.* where (2) destroys native `audio` - * and `video` controls. - * 2. Corrects inability to style clickable `input` types in iOS. - * 3. Improves usability and consistency of cursor style between image-type - * `input` and others. - */ - -button, -html input[type="button"], /* 1 */ -input[type="reset"], -input[type="submit"] { - -webkit-appearance: button; /* 2 */ - cursor: pointer; /* 3 */ -} - -/* - * Re-set default cursor for disabled elements. - */ - -button[disabled], -input[disabled] { - cursor: default; -} - -/* - * 1. Addresses box sizing set to `content-box` in IE 8/9. - * 2. Removes excess padding in IE 8/9. - */ - -input[type="checkbox"], -input[type="radio"] { - box-sizing: border-box; /* 1 */ - padding: 0; /* 2 */ -} - -/* - * 1. Addresses `appearance` set to `searchfield` in Safari 5 and Chrome. - * 2. Addresses `box-sizing` set to `border-box` in Safari 5 and Chrome - * (include `-moz` to future-proof). - */ - -input[type="search"] { - -webkit-appearance: textfield; /* 1 */ - -moz-box-sizing: content-box; - -webkit-box-sizing: content-box; /* 2 */ - box-sizing: content-box; -} - -/* - * Removes inner padding and search cancel button in Safari 5 and Chrome - * on OS X. - */ - -input[type="search"]::-webkit-search-cancel-button, -input[type="search"]::-webkit-search-decoration { - -webkit-appearance: none; -} - -/* - * Removes inner padding and border in Firefox 4+. - */ - -button::-moz-focus-inner, -input::-moz-focus-inner { - border: 0; - padding: 0; -} - -/* - * 1. Removes default vertical scrollbar in IE 8/9. - * 2. Improves readability and alignment in all browsers. - */ - -textarea { - overflow: auto; /* 1 */ - vertical-align: top; /* 2 */ -} - -/* ========================================================================== - Tables - ========================================================================== */ - -/* - * Remove most spacing between table cells. - */ - -table { - border-collapse: collapse; - border-spacing: 0; -} \ No newline at end of file diff --git a/source/shift.html b/source/shift.html deleted file mode 100644 index 0a6d5321b..000000000 --- a/source/shift.html +++ /dev/null @@ -1,117 +0,0 @@ - - - - - shift.coffee - - - - - -

    - - diff --git a/source/tether.html b/source/tether.html deleted file mode 100644 index 4c51f83e0..000000000 --- a/source/tether.html +++ /dev/null @@ -1,676 +0,0 @@ - - - - - tether.coffee - - - - - -
    -
    - - - -
      - -
    • -
      -

      tether.coffee

      -
      -
    • - - - -
    • -
      - -
      - -
      - -
      - -
      {getScrollParent, getSize, getOuterSize, getBounds, getOffsetParent, extend, addClass, removeClass} = Tether.Utils
      -
      -debounce = (fn, time=16) ->
      -  pending = false
      -
      -  return ->
      -    return if pending
      -
      -    args = arguments
      -
      -    pending = true
      -    setTimeout =>
      -      pending = false
      -      fn.apply @, args
      -    , time
      -
      -tethers = []
      -
      -position = ->
      -  for tether in tethers
      -    tether.position()
      -
      -lastCall = null
      -for event in ['resize', 'scroll']
      -  window.addEventListener event, ->
      -    if not lastCall? or (new Date - lastCall) > 16
      - -
    • - - -
    • -
      - -
      - -
      -

      IE likes to call events a little too frequently

      - -
      - -
            lastCall = +new Date
      -      
      -      position()
      -
      -MIRROR_LR =
      -  center: 'center'
      -  left: 'right'
      -  right: 'left'
      -
      -MIRROR_TB =
      -  middle: 'middle'
      -  top: 'bottom'
      -  bottom: 'top'
      -
      -OFFSET_MAP =
      -  top: '0'
      -  left: '0'
      -  middle: '50%'
      -  center: '50%'
      -  bottom: '100%'
      -  right: '100%'
      -
      -autoToFixedAttachment = (attachment, relativeToAttachment) ->
      -  {left, top} = attachment
      -
      -  if left is 'auto'
      -    left = MIRROR_LR[relativeToAttachment.left]
      -
      -  if top is 'auto'
      -    top = MIRROR_TB[relativeToAttachment.top]
      -
      -  {left, top}
      -
      -attachmentToOffset = (attachment) ->
      -  return {
      -    left: OFFSET_MAP[attachment.left] ? attachment.left
      -    top: OFFSET_MAP[attachment.top] ? attachment.top
      -  }
      -
      -addOffset = (offsets...) ->
      -  out = {top: 0, left: 0}
      -
      -  for {top, left} in offsets
      -    if typeof top is 'string'
      -      top = parseFloat(top, 10)
      -    if typeof left is 'string'
      -      left = parseFloat(left, 10)
      -
      -    out.top += top
      -    out.left += left
      -
      -  out
      -
      -offsetToPx = (offset, size) ->
      -  if typeof offset.left is 'string' and offset.left.indexOf('%') isnt -1
      -    offset.left = parseFloat(offset.left, 10) / 100 * size.width
      -  if typeof offset.top is 'string' and offset.top.indexOf('%') isnt -1
      -    offset.top = parseFloat(offset.top, 10) / 100 * size.height
      -
      -  offset
      -
      -parseAttachment = parseOffset = (value) ->
      -  [top, left] = value.split(' ')
      -
      -  {top, left}
      -
      -class _Tether
      -  @modules: []
      -
      -  constructor: (options) ->
      -    tethers.push @
      -
      -    @history = []
      -
      -    @setOptions options, false
      -
      -    for module in Tether.modules
      -      module.initialize?.call(@)
      -
      -    @position()
      -
      -  getClass: (key) ->
      -    if @options.classes?[key]
      -      @options.classes[key]
      -    else if @options.classes?[key] isnt false
      -      if @options.classPrefix
      -        "#{ @options.classPrefix }-#{ key }"
      -      else
      -        key
      -    else
      -      ''
      -
      -  setOptions: (@options, position=true) ->
      -    defaults =
      -      offset: '0 0'
      -      targetOffset: '0 0'
      -      targetAttachment: 'auto auto'
      -      classPrefix: 'tether'
      -
      -    @options = extend defaults, @options
      -      
      -    {@element, @target, @targetModifier} = @options
      -
      -    if @target is 'viewport'
      -      @target = document.body
      -      @targetModifier = 'visible'
      -    else if @target is 'scroll-handle'
      -      @target = document.body
      -      @targetModifier = 'scroll-handle'
      -
      -    for key in ['element', 'target']
      -      if @[key].jquery?
      -        @[key] = @[key][0]
      -      else if typeof @[key] is 'string'
      - -
    • - - -
    • -
      - -
      - -
      -

      This breaks viewport and scroll-handle attachment for the moment

      - -
      - -
              @[key] = document.querySelector @[key]
      -
      -      if not @[key]?
      -        throw new Error "Tether Error: Both element and target must be defined"
      -
      -    addClass @element, @getClass 'element'
      -    addClass @target, @getClass 'target'
      -
      -    @targetAttachment = parseAttachment @options.targetAttachment
      -    @attachment = parseAttachment @options.attachment
      -    @offset = parseOffset @options.offset
      -    @targetOffset = parseOffset @options.targetOffset
      -
      -    if @scrollParent?
      -      @disable()
      -
      -    @scrollParent = getScrollParent @target
      -
      -    unless @options.enabled is false
      -      @enable(position)
      -
      -  getTargetBounds: ->
      -    if @targetModifier?
      -      switch @targetModifier
      -        when 'visible'
      -          {top: pageYOffset, left: pageXOffset, height: innerHeight, width: innerWidth}
      -        when 'scroll-handle'
      -          {
      -            top: pageYOffset + innerHeight * (pageYOffset / document.body.scrollHeight)
      -            left: innerWidth - 15
      -            height: innerHeight * 0.98 * (innerHeight / document.body.scrollHeight)
      -            width: 15
      -          }
      -    else
      -      getBounds @target
      -
      -  clearCache: ->
      -    @_cache = {}
      -
      -  cache: (k, getter) ->
      - -
    • - - -
    • -
      - -
      - -
      -

      More than one module will often need the same DOM info, so -we keep a cache which is cleared on each position call

      - -
      - -
          @_cache ?= {}
      -
      -    if not @_cache[k]?
      -      @_cache[k] = getter.call(@)
      -
      -    @_cache[k]
      -
      -  enable: (position=true) ->
      -    @addClass @getClass 'enabled'
      -    @enabled = true
      -
      -    @scrollParent.addEventListener 'scroll', @position
      -
      -    if position
      -      setTimeout => @position()
      -
      -  disable: ->
      -    @removeClass @getClass 'enabled'
      -    @enabled = false
      -
      -    if @scrollParent?
      -      @scrollParent.removeEventListener 'scroll', @position
      -
      -  destroy: ->
      -    @disable()
      -
      -    for tether, i in tethers
      -      if tether is @
      -        tethers.splice i, 1
      -        break
      -
      -  updateAttachClasses: (elementAttach=@attachment, targetAttach=@targetAttachment) ->
      -    sides = ['left', 'top', 'bottom', 'right', 'middle', 'center']
      -  
      -    @removeClass "#{ @getClass('element-attached') }-#{ side }" for side in sides
      -    @addClass "#{ @getClass('element-attached') }-#{ elementAttach.top }" if elementAttach.top
      -    @addClass "#{ @getClass('element-attached') }-#{ elementAttach.left }" if elementAttach.left
      -
      -    @removeClass "#{ @getClass('target-attached') }-#{ side }" for side in sides
      -    @addClass "#{ @getClass('target-attached') }-#{ targetAttach.top }" if targetAttach.top
      -    @addClass "#{ @getClass('target-attached') }-#{ targetAttach.left }" if targetAttach.left
      -
      -  addClass: (classes) ->
      -    addClass @element, classes
      -    addClass @target, classes
      -
      -  removeClass: (classes) ->
      -    removeClass @element, classes
      -    removeClass @target, classes
      -
      -  position: =>
      -    return unless @enabled
      -
      -    @clearCache()
      - -
    • - - -
    • -
      - -
      - -
      -

      Turn 'auto' attachments into the appropriate corner or edge

      - -
      - -
          targetAttachment = autoToFixedAttachment(@targetAttachment, @attachment)
      -
      -    @updateAttachClasses @attachment, targetAttachment
      -
      -    elementPos = @cache 'element-bounds', => getBounds @element
      -    {width, height} = elementPos
      -
      -    targetSize = targetPos = @cache 'target-bounds', => @getTargetBounds()
      - -
    • - - -
    • -
      - -
      - -
      -

      Get an actual px offset from the attachment

      - -
      - -
          offset = offsetToPx attachmentToOffset(@attachment), {width, height}
      -    targetOffset = offsetToPx attachmentToOffset(targetAttachment), targetSize
      -
      -    manualOffset = offsetToPx(@offset, {width, height})
      -    manualTargetOffset = offsetToPx(@targetOffset, targetSize)
      - -
    • - - -
    • -
      - -
      - -
      -

      Add the manually provided offset

      - -
      - -
          offset = addOffset offset, manualOffset
      -    targetOffset = addOffset targetOffset, manualTargetOffset
      - -
    • - - -
    • -
      - -
      - -
      -

      It's now our goal to make (element position + offset) == (target position + target offset)

      - -
      - -
          left = targetPos.left + targetOffset.left - offset.left
      -    top = targetPos.top + targetOffset.top - offset.top
      -
      -    for module in Tether.modules
      -      ret = module.position.call(@, {left, top, targetAttachment, targetPos, elementPos, offset, targetOffset, manualOffset, manualTargetOffset})
      -
      -      if not ret? or typeof ret isnt 'object'
      -        continue
      -      else if ret is false
      -        return false
      -      else
      -        {top, left} = ret
      - -
    • - - -
    • -
      - -
      - -
      -

      We describe the position three different ways to give the optimizer -a chance to decide the best possible way to position the element -with the fewest repaints.

      - -
      - -
          next = {
      - -
    • - - -
    • -
      - -
      - -
      -

      It's position relative to the page (absolute positioning when -the element is a child of the body)

      - -
      - -
            page:
      -        top: top
      -        bottom: document.body.scrollHeight - top - height
      -        left: left
      -        right: document.body.scrollWidth - left - width
      - -
    • - - -
    • -
      - -
      - -
      -

      It's position relative to the viewport (fixed positioning)

      - -
      - -
            viewport:
      -        top: top - pageYOffset
      -        bottom: pageYOffset - top - height + innerHeight
      -        left: left - pageXOffset
      -        right: pageXOffset - left - width + innerWidth
      -    }
      -
      -    if @options.optimizations?.moveElement isnt false and not @targetModifier?
      -      offsetParent = @cache 'target-offsetparent', => getOffsetParent @target
      -      offsetPosition = @cache 'target-offsetparent-bounds', -> getBounds offsetParent
      -      offsetParentStyle = getComputedStyle offsetParent
      -      offsetParentSize = offsetPosition
      -
      -      offsetBorder = {}
      -      for side in ['top', 'left', 'bottom', 'right']
      -        offsetBorder[side] = parseFloat offsetParentStyle["border-#{ side }-width"]
      -
      -      offsetPosition.left += offsetBorder.left
      -      offsetPosition.top += offsetBorder.top
      -
      -      offsetPosition.right = document.body.scrollWidth - offsetPosition.left - offsetParentSize.width
      -      offsetPosition.bottom = document.body.scrollHeight - offsetPosition.top - offsetParentSize.height
      -
      -      if next.page.top >= offsetPosition.top and next.page.bottom >= offsetPosition.bottom
      -        if next.page.left >= offsetPosition.left and next.page.right >= offsetPosition.right
      - -
    • - - -
    • -
      - -
      - -
      -

      We're within the visible part of the target's scroll parent

      - -
      - -
                scrollTop = offsetParent.scrollTop
      -          scrollLeft = offsetParent.scrollLeft
      - -
    • - - -
    • -
      - -
      - -
      -

      It's position relative to the target's offset parent (absolute positioning when -the element is moved to be a child of the target's offset parent).

      - -
      - -
                next.offset =
      -            top: next.page.top - offsetPosition.top + scrollTop + offsetBorder.top
      -            left: next.page.left - offsetPosition.left + scrollLeft + offsetBorder.left
      -            right: next.page.right - offsetPosition.right + offsetParent.scrollWidth - scrollLeft + offsetBorder.right
      -            bottom: next.page.bottom - offsetPosition.bottom + offsetParent.scrollHeight - scrollTop + offsetBorder.bottom
      - -
    • - - -
    • -
      - -
      - -
      -

      We could also travel up the DOM and try each containing context, rather than only -looking at the body, but we're gonna get diminishing returns.

      - -
      - -
          @move next
      -
      -    @history.unshift next
      -
      -    if @history.length > 3
      -      @history.pop()
      -
      -    true
      -
      -  move: (position) ->
      -    same = {}
      -
      -    for type of position
      -      same[type] = {}
      -
      -      for key of position[type]
      -        found = false
      -
      -        for point in @history
      -          unless point[type]?[key] is position[type][key]
      -            found = true
      -            break
      -
      -        if not found
      -          same[type][key] = true
      -     
      -    css = {top: '', left: '', right: '', bottom: ''}
      -
      -    transcribe = (same, pos) ->
      -      if same.top
      -        css.top = "#{ pos.top }px"
      -      else
      -        css.bottom = "#{ pos.bottom }px"
      -
      -      if same.left
      -        css.left = "#{ pos.left }px"
      -      else
      -        css.right = "#{ pos.right }px"
      -
      -    moved = false
      -    if (same.page.top or same.page.bottom) and (same.page.left or same.page.right)
      -      css.position = 'absolute'
      -      transcribe same.page, position.page
      -
      -    else if (same.viewport.top or same.viewport.bottom) and (same.viewport.left or same.viewport.right)
      -      css.position = 'fixed'
      -      transcribe same.viewport, position.viewport
      -
      -    else if same.offset? and (same.offset.top or same.offset.bottom) and (same.offset.left or same.offset.right)
      -      css.position = 'absolute'
      -
      -      offsetParent = @cache 'target-offsetparent', => getOffsetParent @target
      -
      -      if getOffsetParent(@element) isnt offsetParent
      -        @element.parentNode.removeChild @element
      -        offsetParent.appendChild @element
      -
      -      offsetParentStyle = getComputedStyle offsetParent
      -
      -      offset = extend {}, position.offset
      -      for side in ['top', 'left', 'bottom', 'right']
      -        offset[side] -= parseFloat offsetParentStyle["border-#{ side }-width"]
      -
      -      transcribe same.offset, offset
      -
      -      moved = true
      -      
      -    else
      -      css.position = 'absolute'
      -      css.top = "#{ position.page.top }px"
      -      css.left = "#{ position.page.left }px"
      -
      -    if not moved and @element.parentNode.tagName isnt 'BODY'
      -      @element.parentNode.removeChild @element
      -      document.body.appendChild @element
      - -
    • - - -
    • -
      - -
      - -
      -

      Any css change will trigger a repaint, so let's avoid one if nothing changed

      - -
      - -
          write = false
      -    for key, val of css
      -      if @element.style[key] isnt val
      -        write = true
      -        break
      -
      -    if write
      -      extend @element.style, css
      -
      -window.Tether = extend _Tether, Tether
      - -
    • - -
    -
    - - diff --git a/source/tooltip.html b/source/tooltip.html deleted file mode 100644 index 436aece77..000000000 --- a/source/tooltip.html +++ /dev/null @@ -1,115 +0,0 @@ - - - - - tooltip.coffee - - - - - -
    -
    - - - -
      - -
    • -
      -

      tooltip.coffee

      -
      -
    • - - - -
    • -
      - -
      - -
      - -
      - -
      DropTooltip = Drop.createContext()
      -
      -defaults =
      -    attach: 'top center'
      -
      -class Tooltip
      -
      -    constructor: (@options) ->
      -        @$target = $ @options.el
      -
      -        @createDrop()
      -
      -    createDrop: ->
      -        @options.attach = defaults.attach if not @options.attach?
      -
      -        @dropTooltip = new DropTooltip
      -            target: @$target[0]
      -            className: 'drop-tooltip-theme-arrows'
      -            attach: @options.attach
      -            constrainToWindow: true
      -            constrainToScrollParent: false
      -            openOn: 'hover'
      -            content: @options.content ? @$target.attr('data-tooltip-content')
      -
      -window.Tooltip = Tooltip
      - -
    • - -
    -
    - - diff --git a/source/utils.html b/source/utils.html deleted file mode 100644 index 54948b1c3..000000000 --- a/source/utils.html +++ /dev/null @@ -1,214 +0,0 @@ - - - - - utils.coffee - - - - - -
    -
    - - - -
      - -
    • -
      -

      utils.coffee

      -
      -
    • - - - -
    • -
      - -
      - -
      - -
      - -
      window.Tether ?= {}
      -
      -getScrollParent = (el) ->
      -  position = getComputedStyle(el).position
      -
      -  if position is 'fixed'
      -    return el
      -
      -  scrollParent = undefined
      -
      -  parent = el
      -  while parent = parent.parentNode
      -    unless style = getComputedStyle parent
      -      return parent
      -
      -    if /(auto|scroll)/.test(style['overflow'] + style['overflow-y'] + style['overflow-x'])
      -      if position isnt 'absolute' or style['position'] in ['relative', 'absolute', 'fixed']
      -        return parent
      -
      -  return document.body
      -
      -getBounds = (el) ->
      -  doc = el.ownerDocument
      -  docEl = doc.documentElement
      -
      -  box = extend {}, el.getBoundingClientRect()
      -
      -  box.top = box.top + window.pageYOffset - docEl.clientTop
      -  box.left = box.left + window.pageXOffset - docEl.clientLeft
      -  box.right = doc.body.clientWidth - box.width - box.left
      -  box.bottom = doc.body.clientHeight - box.height - box.top
      -
      -  if not box.height or not box.width
      - -
    • - - -
    • -
      - -
      - -
      -

      When the element is hidden it doesn't have a bounding -rect, but we still need it's size to know if it should still -be invisible in the next frame.

      - -
      - -
          style = getComputedStyle el
      -
      -    box.height or= parseFloat style.height
      -    box.width or= parseFloat style.width
      -
      -  box
      -
      -getOffsetParent = (el) ->
      -  el.offsetParent or document.documentElement
      -
      -extend = (out={}) ->
      -  args = []
      -  Array::push.apply(args, arguments)
      -
      -  for obj in args[1..] when obj
      -    for own key, val of obj
      -      out[key] = val
      -
      -  out
      -
      -removeClass = (el, name) ->
      -  if el.classList?
      -    el.classList.remove(cls) for cls in name.split(' ')
      -  else
      -    el.className = el.className.replace new RegExp("(^| )#{ name.split(' ').join('|') }( |$)", 'gi'), ' '
      -
      -addClass = (el, name) ->
      -  if el.classList?
      -    el.classList.add(cls) for cls in name.split(' ')
      -  else
      -    removeClass el, name
      -    el.className += " #{ name }"
      -
      -hasClass = (el, name) ->
      -  if el.classList?
      -    el.classList.contains(name)
      -  else
      -    new RegExp("(^| )#{ name }( |$)", 'gi').test(el.className)
      -
      -class Evented
      -  on: (event, handler, ctx, once=false) ->
      -    @bindings ?= {}
      -    @bindings[event] ?= []
      -    @bindings[event].push {handler, ctx, once}
      -
      -  once: (event, handler, ctx) ->
      -    @on(event, handler, ctx, true)
      -
      -  off: (event, handler) ->
      -    return unless @bindings?[event]?
      -
      -    if not handler?
      -      delete @bindings[event]
      -    else
      -      i = 0
      -      while i < @bindings[event].length
      -        if @bindings[event][i].handler is handler
      -          @bindings[event].splice i, 1
      -        else
      -          i++
      -
      -  trigger: (event, args...) ->
      -    if @bindings?[event]
      -      i = 0
      -      while i < @bindings[event].length
      -        {handler, ctx, once} = @bindings[event][i]
      -
      -        handler.apply(ctx ? @, args)
      -
      -        if once
      -          @bindings[event].splice i, 1
      -        else
      -          i++
      -
      -Tether.Utils = {getScrollParent, getBounds, getOffsetParent, extend, addClass, removeClass, hasClass, Evented}
      - -
    • - -
    -
    - - diff --git a/tether.coffee b/tether.coffee deleted file mode 100644 index f1cc6753b..000000000 --- a/tether.coffee +++ /dev/null @@ -1,415 +0,0 @@ -{getScrollParent, getSize, getOuterSize, getBounds, getOffsetParent, extend, addClass, removeClass} = Tether.Utils - -debounce = (fn, time=16) -> - pending = false - - return -> - return if pending - - args = arguments - - pending = true - setTimeout => - pending = false - fn.apply @, args - , time - -tethers = [] - -position = -> - for tether in tethers - tether.position() - -lastCall = null -for event in ['resize', 'scroll'] - window.addEventListener event, -> - if not lastCall? or (new Date - lastCall) > 16 - # IE likes to call events a little too frequently - lastCall = +new Date - - position() - -MIRROR_LR = - center: 'center' - left: 'right' - right: 'left' - -MIRROR_TB = - middle: 'middle' - top: 'bottom' - bottom: 'top' - -OFFSET_MAP = - top: '0' - left: '0' - middle: '50%' - center: '50%' - bottom: '100%' - right: '100%' - -autoToFixedAttachment = (attachment, relativeToAttachment) -> - {left, top} = attachment - - if left is 'auto' - left = MIRROR_LR[relativeToAttachment.left] - - if top is 'auto' - top = MIRROR_TB[relativeToAttachment.top] - - {left, top} - -attachmentToOffset = (attachment) -> - return { - left: OFFSET_MAP[attachment.left] ? attachment.left - top: OFFSET_MAP[attachment.top] ? attachment.top - } - -addOffset = (offsets...) -> - out = {top: 0, left: 0} - - for {top, left} in offsets - if typeof top is 'string' - top = parseFloat(top, 10) - if typeof left is 'string' - left = parseFloat(left, 10) - - out.top += top - out.left += left - - out - -offsetToPx = (offset, size) -> - if typeof offset.left is 'string' and offset.left.indexOf('%') isnt -1 - offset.left = parseFloat(offset.left, 10) / 100 * size.width - if typeof offset.top is 'string' and offset.top.indexOf('%') isnt -1 - offset.top = parseFloat(offset.top, 10) / 100 * size.height - - offset - -parseAttachment = parseOffset = (value) -> - [top, left] = value.split(' ') - - {top, left} - -class _Tether - @modules: [] - - constructor: (options) -> - tethers.push @ - - @history = [] - - @setOptions options, false - - for module in Tether.modules - module.initialize?.call(@) - - @position() - - getClass: (key) -> - if @options.classes?[key] - @options.classes[key] - else if @options.classes?[key] isnt false - if @options.classPrefix - "#{ @options.classPrefix }-#{ key }" - else - key - else - '' - - setOptions: (@options, position=true) -> - defaults = - offset: '0 0' - targetOffset: '0 0' - targetAttachment: 'auto auto' - classPrefix: 'tether' - - @options = extend defaults, @options - - {@element, @target, @targetModifier} = @options - - if @target is 'viewport' - @target = document.body - @targetModifier = 'visible' - else if @target is 'scroll-handle' - @target = document.body - @targetModifier = 'scroll-handle' - - for key in ['element', 'target'] - if @[key].jquery? - @[key] = @[key][0] - else if typeof @[key] is 'string' - # This breaks viewport and scroll-handle attachment for the moment - @[key] = document.querySelector @[key] - - if not @[key]? - throw new Error "Tether Error: Both element and target must be defined" - - addClass @element, @getClass 'element' - addClass @target, @getClass 'target' - - @targetAttachment = parseAttachment @options.targetAttachment - @attachment = parseAttachment @options.attachment - @offset = parseOffset @options.offset - @targetOffset = parseOffset @options.targetOffset - - if @scrollParent? - @disable() - - @scrollParent = getScrollParent @target - - unless @options.enabled is false - @enable(position) - - getTargetBounds: -> - if @targetModifier? - switch @targetModifier - when 'visible' - {top: pageYOffset, left: pageXOffset, height: innerHeight, width: innerWidth} - when 'scroll-handle' - { - top: pageYOffset + innerHeight * (pageYOffset / document.body.scrollHeight) - left: innerWidth - 15 - height: innerHeight * 0.98 * (innerHeight / document.body.scrollHeight) - width: 15 - } - else - getBounds @target - - clearCache: -> - @_cache = {} - - cache: (k, getter) -> - # More than one module will often need the same DOM info, so - # we keep a cache which is cleared on each position call - @_cache ?= {} - - if not @_cache[k]? - @_cache[k] = getter.call(@) - - @_cache[k] - - enable: (position=true) -> - @addClass @getClass 'enabled' - @enabled = true - - @scrollParent.addEventListener 'scroll', @position - - if position - setTimeout => @position() - - disable: -> - @removeClass @getClass 'enabled' - @enabled = false - - if @scrollParent? - @scrollParent.removeEventListener 'scroll', @position - - destroy: -> - @disable() - - for tether, i in tethers - if tether is @ - tethers.splice i, 1 - break - - updateAttachClasses: (elementAttach=@attachment, targetAttach=@targetAttachment) -> - sides = ['left', 'top', 'bottom', 'right', 'middle', 'center'] - - @removeClass "#{ @getClass('element-attached') }-#{ side }" for side in sides - @addClass "#{ @getClass('element-attached') }-#{ elementAttach.top }" if elementAttach.top - @addClass "#{ @getClass('element-attached') }-#{ elementAttach.left }" if elementAttach.left - - @removeClass "#{ @getClass('target-attached') }-#{ side }" for side in sides - @addClass "#{ @getClass('target-attached') }-#{ targetAttach.top }" if targetAttach.top - @addClass "#{ @getClass('target-attached') }-#{ targetAttach.left }" if targetAttach.left - - addClass: (classes) -> - addClass @element, classes - addClass @target, classes - - removeClass: (classes) -> - removeClass @element, classes - removeClass @target, classes - - position: => - return unless @enabled - - @clearCache() - - # Turn 'auto' attachments into the appropriate corner or edge - targetAttachment = autoToFixedAttachment(@targetAttachment, @attachment) - - @updateAttachClasses @attachment, targetAttachment - - elementPos = @cache 'element-bounds', => getBounds @element - {width, height} = elementPos - - targetSize = targetPos = @cache 'target-bounds', => @getTargetBounds() - - # Get an actual px offset from the attachment - offset = offsetToPx attachmentToOffset(@attachment), {width, height} - targetOffset = offsetToPx attachmentToOffset(targetAttachment), targetSize - - manualOffset = offsetToPx(@offset, {width, height}) - manualTargetOffset = offsetToPx(@targetOffset, targetSize) - - # Add the manually provided offset - offset = addOffset offset, manualOffset - targetOffset = addOffset targetOffset, manualTargetOffset - - # It's now our goal to make (element position + offset) == (target position + target offset) - left = targetPos.left + targetOffset.left - offset.left - top = targetPos.top + targetOffset.top - offset.top - - for module in Tether.modules - ret = module.position.call(@, {left, top, targetAttachment, targetPos, elementPos, offset, targetOffset, manualOffset, manualTargetOffset}) - - if not ret? or typeof ret isnt 'object' - continue - else if ret is false - return false - else - {top, left} = ret - - # We describe the position three different ways to give the optimizer - # a chance to decide the best possible way to position the element - # with the fewest repaints. - next = { - # It's position relative to the page (absolute positioning when - # the element is a child of the body) - page: - top: top - bottom: document.body.scrollHeight - top - height - left: left - right: document.body.scrollWidth - left - width - - # It's position relative to the viewport (fixed positioning) - viewport: - top: top - pageYOffset - bottom: pageYOffset - top - height + innerHeight - left: left - pageXOffset - right: pageXOffset - left - width + innerWidth - } - - if @options.optimizations?.moveElement isnt false and not @targetModifier? - offsetParent = @cache 'target-offsetparent', => getOffsetParent @target - offsetPosition = @cache 'target-offsetparent-bounds', -> getBounds offsetParent - offsetParentStyle = getComputedStyle offsetParent - offsetParentSize = offsetPosition - - offsetBorder = {} - for side in ['top', 'left', 'bottom', 'right'] - offsetBorder[side] = parseFloat offsetParentStyle["border-#{ side }-width"] - - offsetPosition.left += offsetBorder.left - offsetPosition.top += offsetBorder.top - - offsetPosition.right = document.body.scrollWidth - offsetPosition.left - offsetParentSize.width - offsetPosition.bottom = document.body.scrollHeight - offsetPosition.top - offsetParentSize.height - - if next.page.top >= offsetPosition.top and next.page.bottom >= offsetPosition.bottom - if next.page.left >= offsetPosition.left and next.page.right >= offsetPosition.right - # We're within the visible part of the target's scroll parent - - scrollTop = offsetParent.scrollTop - scrollLeft = offsetParent.scrollLeft - - # It's position relative to the target's offset parent (absolute positioning when - # the element is moved to be a child of the target's offset parent). - next.offset = - top: next.page.top - offsetPosition.top + scrollTop + offsetBorder.top - left: next.page.left - offsetPosition.left + scrollLeft + offsetBorder.left - right: next.page.right - offsetPosition.right + offsetParent.scrollWidth - scrollLeft + offsetBorder.right - bottom: next.page.bottom - offsetPosition.bottom + offsetParent.scrollHeight - scrollTop + offsetBorder.bottom - - # We could also travel up the DOM and try each containing context, rather than only - # looking at the body, but we're gonna get diminishing returns. - - @move next - - @history.unshift next - - if @history.length > 3 - @history.pop() - - true - - move: (position) -> - same = {} - - for type of position - same[type] = {} - - for key of position[type] - found = false - - for point in @history - unless point[type]?[key] is position[type][key] - found = true - break - - if not found - same[type][key] = true - - css = {top: '', left: '', right: '', bottom: ''} - - transcribe = (same, pos) -> - if same.top - css.top = "#{ pos.top }px" - else - css.bottom = "#{ pos.bottom }px" - - if same.left - css.left = "#{ pos.left }px" - else - css.right = "#{ pos.right }px" - - moved = false - if (same.page.top or same.page.bottom) and (same.page.left or same.page.right) - css.position = 'absolute' - transcribe same.page, position.page - - else if (same.viewport.top or same.viewport.bottom) and (same.viewport.left or same.viewport.right) - css.position = 'fixed' - transcribe same.viewport, position.viewport - - else if same.offset? and (same.offset.top or same.offset.bottom) and (same.offset.left or same.offset.right) - css.position = 'absolute' - - offsetParent = @cache 'target-offsetparent', => getOffsetParent @target - - if getOffsetParent(@element) isnt offsetParent - @element.parentNode.removeChild @element - offsetParent.appendChild @element - - offsetParentStyle = getComputedStyle offsetParent - - offset = extend {}, position.offset - for side in ['top', 'left', 'bottom', 'right'] - offset[side] -= parseFloat offsetParentStyle["border-#{ side }-width"] - - transcribe same.offset, offset - - moved = true - - else - css.position = 'absolute' - css.top = "#{ position.page.top }px" - css.left = "#{ position.page.left }px" - - if not moved and @element.parentNode.tagName isnt 'BODY' - @element.parentNode.removeChild @element - document.body.appendChild @element - - # Any css change will trigger a repaint, so let's avoid one if nothing changed - write = false - for key, val of css - if @element.style[key] isnt val - write = true - break - - if write - extend @element.style, css - -window.Tether = extend _Tether, Tether diff --git a/tether.js b/tether.js index 2ff2e64e5..1fcab2435 100644 --- a/tether.js +++ b/tether.js @@ -1,55 +1,373 @@ +/*! tether 0.5.2 */ (function() { - var MIRROR_LR, MIRROR_TB, OFFSET_MAP, addClass, addOffset, attachmentToOffset, autoToFixedAttachment, debounce, event, extend, getBounds, getOffsetParent, getOuterSize, getScrollParent, getSize, lastCall, offsetToPx, parseAttachment, parseOffset, position, removeClass, tethers, _Tether, _i, _len, _ref, _ref1, - __slice = [].slice, - __bind = function(fn, me){ return function(){ return fn.apply(me, arguments); }; }; + var Evented, addClass, defer, deferred, extend, flush, getBounds, getOffsetParent, getOrigin, getScrollParent, hasClass, node, removeClass, uniqueId, updateClasses, zeroPosCache, + __hasProp = {}.hasOwnProperty, + __indexOf = [].indexOf || function(item) { for (var i = 0, l = this.length; i < l; i++) { if (i in this && this[i] === item) return i; } return -1; }, + __slice = [].slice; - _ref = Tether.Utils, getScrollParent = _ref.getScrollParent, getSize = _ref.getSize, getOuterSize = _ref.getOuterSize, getBounds = _ref.getBounds, getOffsetParent = _ref.getOffsetParent, extend = _ref.extend, addClass = _ref.addClass, removeClass = _ref.removeClass; + if (window.Tether == null) { + window.Tether = {}; + } - debounce = function(fn, time) { - var pending; - if (time == null) { - time = 16; + getScrollParent = function(el) { + var parent, position, scrollParent, style, _ref; + position = getComputedStyle(el).position; + if (position === 'fixed') { + return el; + } + scrollParent = void 0; + parent = el; + while (parent = parent.parentNode) { + try { + style = getComputedStyle(parent); + } catch (_error) {} + if (style == null) { + return parent; + } + if (/(auto|scroll)/.test(style['overflow'] + style['overflow-y'] + style['overflow-x'])) { + if (position !== 'absolute' || ((_ref = style['position']) === 'relative' || _ref === 'absolute' || _ref === 'fixed')) { + return parent; + } + } } - pending = false; + return document.body; + }; + + uniqueId = (function() { + var id; + id = 0; return function() { - var args, - _this = this; - if (pending) { + return id++; + }; + })(); + + zeroPosCache = {}; + + getOrigin = function(doc) { + var id, k, node, v, _ref; + node = doc._tetherZeroElement; + if (node == null) { + node = doc.createElement('div'); + node.setAttribute('data-tether-id', uniqueId()); + extend(node.style, { + top: 0, + left: 0, + position: 'absolute' + }); + doc.body.appendChild(node); + doc._tetherZeroElement = node; + } + id = node.getAttribute('data-tether-id'); + if (zeroPosCache[id] == null) { + zeroPosCache[id] = {}; + _ref = node.getBoundingClientRect(); + for (k in _ref) { + v = _ref[k]; + zeroPosCache[id][k] = v; + } + defer(function() { + return zeroPosCache[id] = void 0; + }); + } + return zeroPosCache[id]; + }; + + node = null; + + getBounds = function(el) { + var box, doc, docEl, k, origin, v, _ref; + if (el === document) { + doc = document; + el = document.documentElement; + } else { + doc = el.ownerDocument; + } + docEl = doc.documentElement; + box = {}; + _ref = el.getBoundingClientRect(); + for (k in _ref) { + v = _ref[k]; + box[k] = v; + } + origin = getOrigin(doc); + box.top -= origin.top; + box.left -= origin.left; + if (box.width == null) { + box.width = document.body.scrollWidth - box.left - box.right; + } + if (box.height == null) { + box.height = document.body.scrollHeight - box.top - box.bottom; + } + box.top = box.top - docEl.clientTop; + box.left = box.left - docEl.clientLeft; + box.right = doc.body.clientWidth - box.width - box.left; + box.bottom = doc.body.clientHeight - box.height - box.top; + return box; + }; + + getOffsetParent = function(el) { + return el.offsetParent || document.documentElement; + }; + + extend = function(out) { + var args, key, obj, val, _i, _len, _ref; + if (out == null) { + out = {}; + } + args = []; + Array.prototype.push.apply(args, arguments); + _ref = args.slice(1); + for (_i = 0, _len = _ref.length; _i < _len; _i++) { + obj = _ref[_i]; + if (obj) { + for (key in obj) { + if (!__hasProp.call(obj, key)) continue; + val = obj[key]; + out[key] = val; + } + } + } + return out; + }; + + removeClass = function(el, name) { + var cls, _i, _len, _ref, _results; + if (el.classList != null) { + _ref = name.split(' '); + _results = []; + for (_i = 0, _len = _ref.length; _i < _len; _i++) { + cls = _ref[_i]; + _results.push(el.classList.remove(cls)); + } + return _results; + } else { + return el.className = el.className.replace(new RegExp("(^| )" + (name.split(' ').join('|')) + "( |$)", 'gi'), ' '); + } + }; + + addClass = function(el, name) { + var cls, _i, _len, _ref, _results; + if (el.classList != null) { + _ref = name.split(' '); + _results = []; + for (_i = 0, _len = _ref.length; _i < _len; _i++) { + cls = _ref[_i]; + _results.push(el.classList.add(cls)); + } + return _results; + } else { + removeClass(el, name); + return el.className += " " + name; + } + }; + + hasClass = function(el, name) { + if (el.classList != null) { + return el.classList.contains(name); + } else { + return new RegExp("(^| )" + name + "( |$)", 'gi').test(el.className); + } + }; + + updateClasses = function(el, add, all) { + var cls, _i, _j, _len, _len1, _results; + for (_i = 0, _len = all.length; _i < _len; _i++) { + cls = all[_i]; + if (__indexOf.call(add, cls) < 0) { + if (hasClass(el, cls)) { + removeClass(el, cls); + } + } + } + _results = []; + for (_j = 0, _len1 = add.length; _j < _len1; _j++) { + cls = add[_j]; + if (!hasClass(el, cls)) { + _results.push(addClass(el, cls)); + } else { + _results.push(void 0); + } + } + return _results; + }; + + deferred = []; + + defer = function(fn) { + return deferred.push(fn); + }; + + flush = function() { + var fn, _results; + _results = []; + while (fn = deferred.pop()) { + _results.push(fn()); + } + return _results; + }; + + Evented = (function() { + function Evented() {} + + Evented.prototype.on = function(event, handler, ctx, once) { + var _base; + if (once == null) { + once = false; + } + if (this.bindings == null) { + this.bindings = {}; + } + if ((_base = this.bindings)[event] == null) { + _base[event] = []; + } + return this.bindings[event].push({ + handler: handler, + ctx: ctx, + once: once + }); + }; + + Evented.prototype.once = function(event, handler, ctx) { + return this.on(event, handler, ctx, true); + }; + + Evented.prototype.off = function(event, handler) { + var i, _ref, _results; + if (((_ref = this.bindings) != null ? _ref[event] : void 0) == null) { return; } - args = arguments; - pending = true; - return setTimeout(function() { - pending = false; - return fn.apply(_this, args); - }, time); + if (handler == null) { + return delete this.bindings[event]; + } else { + i = 0; + _results = []; + while (i < this.bindings[event].length) { + if (this.bindings[event][i].handler === handler) { + _results.push(this.bindings[event].splice(i, 1)); + } else { + _results.push(i++); + } + } + return _results; + } }; + + Evented.prototype.trigger = function() { + var args, ctx, event, handler, i, once, _ref, _ref1, _results; + event = arguments[0], args = 2 <= arguments.length ? __slice.call(arguments, 1) : []; + if ((_ref = this.bindings) != null ? _ref[event] : void 0) { + i = 0; + _results = []; + while (i < this.bindings[event].length) { + _ref1 = this.bindings[event][i], handler = _ref1.handler, ctx = _ref1.ctx, once = _ref1.once; + handler.apply(ctx != null ? ctx : this, args); + if (once) { + _results.push(this.bindings[event].splice(i, 1)); + } else { + _results.push(i++); + } + } + return _results; + } + }; + + return Evented; + + })(); + + Tether.Utils = { + getScrollParent: getScrollParent, + getBounds: getBounds, + getOffsetParent: getOffsetParent, + extend: extend, + addClass: addClass, + removeClass: removeClass, + hasClass: hasClass, + updateClasses: updateClasses, + defer: defer, + flush: flush, + uniqueId: uniqueId, + Evented: Evented }; +}).call(this); + +(function() { + var MIRROR_LR, MIRROR_TB, OFFSET_MAP, addClass, addOffset, attachmentToOffset, autoToFixedAttachment, defer, extend, flush, getBounds, getOffsetParent, getOuterSize, getScrollParent, getSize, now, offsetToPx, parseAttachment, parseOffset, position, removeClass, tethers, transformKey, updateClasses, within, _Tether, _ref, + __slice = [].slice, + __bind = function(fn, me){ return function(){ return fn.apply(me, arguments); }; }; + + if (typeof Tether === "undefined" || Tether === null) { + throw new Error("You must include the utils.js file before tether.js"); + } + + _ref = Tether.Utils, getScrollParent = _ref.getScrollParent, getSize = _ref.getSize, getOuterSize = _ref.getOuterSize, getBounds = _ref.getBounds, getOffsetParent = _ref.getOffsetParent, extend = _ref.extend, addClass = _ref.addClass, removeClass = _ref.removeClass, updateClasses = _ref.updateClasses, defer = _ref.defer, flush = _ref.flush; + + within = function(a, b, diff) { + if (diff == null) { + diff = 1; + } + return (a + diff >= b && b >= a - diff); + }; + + transformKey = (function() { + var el, key, _i, _len, _ref1; + el = document.createElement('div'); + _ref1 = ['transform', 'webkitTransform', 'OTransform', 'MozTransform', 'msTransform']; + for (_i = 0, _len = _ref1.length; _i < _len; _i++) { + key = _ref1[_i]; + if (el.style[key] !== void 0) { + return key; + } + } + })(); + tethers = []; position = function() { - var tether, _i, _len, _results; - _results = []; + var tether, _i, _len; for (_i = 0, _len = tethers.length; _i < _len; _i++) { tether = tethers[_i]; - _results.push(tether.position()); + tether.position(false); } - return _results; + return flush(); }; - lastCall = null; + now = function() { + var _ref1; + return (_ref1 = typeof performance !== "undefined" && performance !== null ? typeof performance.now === "function" ? performance.now() : void 0 : void 0) != null ? _ref1 : +(new Date); + }; - _ref1 = ['resize', 'scroll']; - for (_i = 0, _len = _ref1.length; _i < _len; _i++) { - event = _ref1[_i]; - window.addEventListener(event, function() { - if ((lastCall == null) || (new Date - lastCall) > 16) { - lastCall = +(new Date); - return position(); + (function() { + var event, lastCall, lastDuration, pendingTimeout, tick, _i, _len, _ref1, _results; + lastCall = null; + lastDuration = null; + pendingTimeout = null; + tick = function() { + if ((lastDuration != null) && lastDuration > 16) { + lastDuration = Math.min(lastDuration - 16, 250); + pendingTimeout = setTimeout(tick, 250); + return; } - }); - } + if ((lastCall != null) && (now() - lastCall) < 10) { + return; + } + if (pendingTimeout != null) { + clearTimeout(pendingTimeout); + pendingTimeout = null; + } + lastCall = now(); + position(); + return lastDuration = now() - lastCall; + }; + _ref1 = ['resize', 'scroll', 'touchmove']; + _results = []; + for (_i = 0, _len = _ref1.length; _i < _len; _i++) { + event = _ref1[_i]; + _results.push(window.addEventListener(event, tick)); + } + return _results; + })(); MIRROR_LR = { center: 'center', @@ -64,8 +382,8 @@ }; OFFSET_MAP = { - top: '0', - left: '0', + top: 0, + left: 0, middle: '50%', center: '50%', bottom: '100%', @@ -88,22 +406,22 @@ }; attachmentToOffset = function(attachment) { - var _ref2, _ref3; + var _ref1, _ref2; return { - left: (_ref2 = OFFSET_MAP[attachment.left]) != null ? _ref2 : attachment.left, - top: (_ref3 = OFFSET_MAP[attachment.top]) != null ? _ref3 : attachment.top + left: (_ref1 = OFFSET_MAP[attachment.left]) != null ? _ref1 : attachment.left, + top: (_ref2 = OFFSET_MAP[attachment.top]) != null ? _ref2 : attachment.top }; }; addOffset = function() { - var left, offsets, out, top, _j, _len1, _ref2; + var left, offsets, out, top, _i, _len, _ref1; offsets = 1 <= arguments.length ? __slice.call(arguments, 0) : []; out = { top: 0, left: 0 }; - for (_j = 0, _len1 = offsets.length; _j < _len1; _j++) { - _ref2 = offsets[_j], top = _ref2.top, left = _ref2.left; + for (_i = 0, _len = offsets.length; _i < _len; _i++) { + _ref1 = offsets[_i], top = _ref1.top, left = _ref1.left; if (typeof top === 'string') { top = parseFloat(top, 10); } @@ -127,8 +445,8 @@ }; parseAttachment = parseOffset = function(value) { - var left, top, _ref2; - _ref2 = value.split(' '), top = _ref2[0], left = _ref2[1]; + var left, top, _ref1; + _ref1 = value.split(' '), top = _ref1[0], left = _ref1[1]; return { top: top, left: left @@ -140,25 +458,25 @@ function _Tether(options) { this.position = __bind(this.position, this); - var module, _j, _len1, _ref2, _ref3; + var module, _i, _len, _ref1, _ref2; tethers.push(this); this.history = []; this.setOptions(options, false); - _ref2 = Tether.modules; - for (_j = 0, _len1 = _ref2.length; _j < _len1; _j++) { - module = _ref2[_j]; - if ((_ref3 = module.initialize) != null) { - _ref3.call(this); + _ref1 = Tether.modules; + for (_i = 0, _len = _ref1.length; _i < _len; _i++) { + module = _ref1[_i]; + if ((_ref2 = module.initialize) != null) { + _ref2.call(this); } } this.position(); } _Tether.prototype.getClass = function(key) { - var _ref2, _ref3; - if ((_ref2 = this.options.classes) != null ? _ref2[key] : void 0) { + var _ref1, _ref2; + if ((_ref1 = this.options.classes) != null ? _ref1[key] : void 0) { return this.options.classes[key]; - } else if (((_ref3 = this.options.classes) != null ? _ref3[key] : void 0) !== false) { + } else if (((_ref2 = this.options.classes) != null ? _ref2[key] : void 0) !== false) { if (this.options.classPrefix) { return "" + this.options.classPrefix + "-" + key; } else { @@ -170,7 +488,7 @@ }; _Tether.prototype.setOptions = function(options, position) { - var defaults, key, _j, _len1, _ref2, _ref3; + var defaults, key, _i, _len, _ref1, _ref2; this.options = options; if (position == null) { position = true; @@ -182,7 +500,7 @@ classPrefix: 'tether' }; this.options = extend(defaults, this.options); - _ref2 = this.options, this.element = _ref2.element, this.target = _ref2.target, this.targetModifier = _ref2.targetModifier; + _ref1 = this.options, this.element = _ref1.element, this.target = _ref1.target, this.targetModifier = _ref1.targetModifier; if (this.target === 'viewport') { this.target = document.body; this.targetModifier = 'visible'; @@ -190,20 +508,23 @@ this.target = document.body; this.targetModifier = 'scroll-handle'; } - _ref3 = ['element', 'target']; - for (_j = 0, _len1 = _ref3.length; _j < _len1; _j++) { - key = _ref3[_j]; + _ref2 = ['element', 'target']; + for (_i = 0, _len = _ref2.length; _i < _len; _i++) { + key = _ref2[_i]; + if (this[key] == null) { + throw new Error("Tether Error: Both element and target must be defined"); + } if (this[key].jquery != null) { this[key] = this[key][0]; } else if (typeof this[key] === 'string') { this[key] = document.querySelector(this[key]); } - if (this[key] == null) { - throw new Error("Tether Error: Both element and target must be defined"); - } } addClass(this.element, this.getClass('element')); addClass(this.target, this.getClass('target')); + if (!this.options.attachment) { + throw new Error("Tether Error: You must provide an attachment"); + } this.targetAttachment = parseAttachment(this.options.targetAttachment); this.attachment = parseAttachment(this.options.attachment); this.offset = parseOffset(this.options.offset); @@ -211,29 +532,91 @@ if (this.scrollParent != null) { this.disable(); } - this.scrollParent = getScrollParent(this.target); + if (this.targetModifier === 'scroll-handle') { + this.scrollParent = this.target; + } else { + this.scrollParent = getScrollParent(this.target); + } if (this.options.enabled !== false) { return this.enable(position); } }; _Tether.prototype.getTargetBounds = function() { + var bounds, fitAdj, hasBottomScroll, height, out, scrollBottom, scrollPercentage, style, target; if (this.targetModifier != null) { switch (this.targetModifier) { case 'visible': - return { - top: pageYOffset, - left: pageXOffset, - height: innerHeight, - width: innerWidth - }; + if (this.target === document.body) { + return { + top: pageYOffset, + left: pageXOffset, + height: innerHeight, + width: innerWidth + }; + } else { + bounds = getBounds(this.target); + out = { + height: bounds.height, + width: bounds.width, + top: bounds.top, + left: bounds.left + }; + out.height = Math.min(out.height, bounds.height - (pageYOffset - bounds.top)); + out.height = Math.min(out.height, bounds.height - ((bounds.top + bounds.height) - (pageYOffset + innerHeight))); + out.height = Math.min(innerHeight, out.height); + out.height -= 2; + out.width = Math.min(out.width, bounds.width - (pageXOffset - bounds.left)); + out.width = Math.min(out.width, bounds.width - ((bounds.left + bounds.width) - (pageXOffset + innerWidth))); + out.width = Math.min(innerWidth, out.width); + out.width -= 2; + if (out.top < pageYOffset) { + out.top = pageYOffset; + } + if (out.left < pageXOffset) { + out.left = pageXOffset; + } + return out; + } + break; case 'scroll-handle': - return { - top: pageYOffset + innerHeight * (pageYOffset / document.body.scrollHeight), - left: innerWidth - 15, - height: innerHeight * 0.98 * (innerHeight / document.body.scrollHeight), - width: 15 + target = this.target; + if (target === document.body) { + target = document.documentElement; + bounds = { + left: pageXOffset, + top: pageYOffset, + height: innerHeight, + width: innerWidth + }; + } else { + bounds = getBounds(target); + } + style = getComputedStyle(target); + hasBottomScroll = target.scrollWidth > target.clientWidth || 'scroll' === [style.overflow, style.overflowX] || this.target !== document.body; + scrollBottom = 0; + if (hasBottomScroll) { + scrollBottom = 15; + } + height = bounds.height - parseFloat(style.borderTopWidth) - parseFloat(style.borderBottomWidth) - scrollBottom; + out = { + width: 15, + height: height * 0.975 * (height / target.scrollHeight), + left: bounds.left + bounds.width - parseFloat(style.borderLeftWidth) - 15 }; + fitAdj = 0; + if (height < 408 && this.target === document.body) { + fitAdj = -0.00011 * Math.pow(height, 2) - 0.00727 * height + 22.58; + } + if (this.target !== document.body) { + out.height = Math.max(out.height, 24); + } + scrollPercentage = this.target.scrollTop / (target.scrollHeight - height); + out.top = scrollPercentage * (height - out.height - fitAdj) + bounds.top + parseFloat(style.borderTopWidth); + if (this.target === document.body) { + out.height = Math.max(out.height, 24); + } + return out; } } else { return getBounds(this.target); @@ -255,22 +638,23 @@ }; _Tether.prototype.enable = function(position) { - var _this = this; if (position == null) { position = true; } - this.addClass(this.getClass('enabled')); + addClass(this.target, this.getClass('enabled')); + addClass(this.element, this.getClass('enabled')); this.enabled = true; - this.scrollParent.addEventListener('scroll', this.position); + if (this.scrollParent !== document) { + this.scrollParent.addEventListener('scroll', this.position); + } if (position) { - return setTimeout(function() { - return _this.position(); - }); + return this.position(); } }; _Tether.prototype.disable = function() { - this.removeClass(this.getClass('enabled')); + removeClass(this.target, this.getClass('enabled')); + removeClass(this.element, this.getClass('enabled')); this.enabled = false; if (this.scrollParent != null) { return this.scrollParent.removeEventListener('scroll', this.position); @@ -278,10 +662,10 @@ }; _Tether.prototype.destroy = function() { - var i, tether, _j, _len1, _results; + var i, tether, _i, _len, _results; this.disable(); _results = []; - for (i = _j = 0, _len1 = tethers.length; _j < _len1; i = ++_j) { + for (i = _i = 0, _len = tethers.length; _i < _len; i = ++_i) { tether = tethers[i]; if (tether === this) { tethers.splice(i, 1); @@ -294,7 +678,8 @@ }; _Tether.prototype.updateAttachClasses = function(elementAttach, targetAttach) { - var side, sides, _j, _k, _len1, _len2; + var add, all, side, sides, _i, _j, _len, _len1, _ref1, + _this = this; if (elementAttach == null) { elementAttach = this.attachment; } @@ -302,41 +687,47 @@ targetAttach = this.targetAttachment; } sides = ['left', 'top', 'bottom', 'right', 'middle', 'center']; - for (_j = 0, _len1 = sides.length; _j < _len1; _j++) { - side = sides[_j]; - this.removeClass("" + (this.getClass('element-attached')) + "-" + side); + if ((_ref1 = this._addAttachClasses) != null ? _ref1.length : void 0) { + this._addAttachClasses.splice(0, this._addAttachClasses.length); } + add = this._addAttachClasses != null ? this._addAttachClasses : this._addAttachClasses = []; if (elementAttach.top) { - this.addClass("" + (this.getClass('element-attached')) + "-" + elementAttach.top); + add.push("" + (this.getClass('element-attached')) + "-" + elementAttach.top); } if (elementAttach.left) { - this.addClass("" + (this.getClass('element-attached')) + "-" + elementAttach.left); - } - for (_k = 0, _len2 = sides.length; _k < _len2; _k++) { - side = sides[_k]; - this.removeClass("" + (this.getClass('target-attached')) + "-" + side); + add.push("" + (this.getClass('element-attached')) + "-" + elementAttach.left); } if (targetAttach.top) { - this.addClass("" + (this.getClass('target-attached')) + "-" + targetAttach.top); + add.push("" + (this.getClass('target-attached')) + "-" + targetAttach.top); } if (targetAttach.left) { - return this.addClass("" + (this.getClass('target-attached')) + "-" + targetAttach.left); + add.push("" + (this.getClass('target-attached')) + "-" + targetAttach.left); } + all = []; + for (_i = 0, _len = sides.length; _i < _len; _i++) { + side = sides[_i]; + all.push("" + (this.getClass('element-attached')) + "-" + side); + } + for (_j = 0, _len1 = sides.length; _j < _len1; _j++) { + side = sides[_j]; + all.push("" + (this.getClass('target-attached')) + "-" + side); + } + return defer(function() { + if (_this._addAttachClasses == null) { + return; + } + updateClasses(_this.element, _this._addAttachClasses, all); + updateClasses(_this.target, _this._addAttachClasses, all); + return _this._addAttachClasses = void 0; + }); }; - _Tether.prototype.addClass = function(classes) { - addClass(this.element, classes); - return addClass(this.target, classes); - }; - - _Tether.prototype.removeClass = function(classes) { - removeClass(this.element, classes); - return removeClass(this.target, classes); - }; - - _Tether.prototype.position = function() { - var elementPos, height, left, manualOffset, manualTargetOffset, module, next, offset, offsetBorder, offsetParent, offsetParentSize, offsetParentStyle, offsetPosition, ret, scrollLeft, scrollTop, side, targetAttachment, targetOffset, targetPos, targetSize, top, width, _j, _k, _len1, _len2, _ref2, _ref3, _ref4, + _Tether.prototype.position = function(flushChanges) { + var elementPos, elementStyle, height, left, manualOffset, manualTargetOffset, module, next, offset, offsetBorder, offsetParent, offsetParentSize, offsetParentStyle, offsetPosition, ret, scrollLeft, scrollTop, side, targetAttachment, targetOffset, targetPos, targetSize, top, width, _i, _j, _len, _len1, _ref1, _ref2, _ref3, _ref4, _this = this; + if (flushChanges == null) { + flushChanges = true; + } if (!this.enabled) { return; } @@ -347,6 +738,14 @@ return getBounds(_this.element); }); width = elementPos.width, height = elementPos.height; + if (width === 0 && height === 0 && (this.lastSize != null)) { + _ref1 = this.lastSize, width = _ref1.width, height = _ref1.height; + } else { + this.lastSize = { + width: width, + height: height + }; + } targetSize = targetPos = this.cache('target-bounds', function() { return _this.getTargetBounds(); }); @@ -365,13 +764,14 @@ left = targetPos.left + targetOffset.left - offset.left; top = targetPos.top + targetOffset.top - offset.top; _ref2 = Tether.modules; - for (_j = 0, _len1 = _ref2.length; _j < _len1; _j++) { - module = _ref2[_j]; + for (_i = 0, _len = _ref2.length; _i < _len; _i++) { + module = _ref2[_i]; ret = module.position.call(this, { left: left, top: top, targetAttachment: targetAttachment, targetPos: targetPos, + attachment: this.attachment, elementPos: elementPos, offset: offset, targetOffset: targetOffset, @@ -408,26 +808,23 @@ return getBounds(offsetParent); }); offsetParentStyle = getComputedStyle(offsetParent); + elementStyle = getComputedStyle(this.element); offsetParentSize = offsetPosition; offsetBorder = {}; - _ref4 = ['top', 'left', 'bottom', 'right']; - for (_k = 0, _len2 = _ref4.length; _k < _len2; _k++) { - side = _ref4[_k]; - offsetBorder[side] = parseFloat(offsetParentStyle["border-" + side + "-width"]); - } - offsetPosition.left += offsetBorder.left; - offsetPosition.top += offsetBorder.top; - offsetPosition.right = document.body.scrollWidth - offsetPosition.left - offsetParentSize.width; - offsetPosition.bottom = document.body.scrollHeight - offsetPosition.top - offsetParentSize.height; - if (next.page.top >= offsetPosition.top && next.page.bottom >= offsetPosition.bottom) { - if (next.page.left >= offsetPosition.left && next.page.right >= offsetPosition.right) { + _ref4 = ['Top', 'Left', 'Bottom', 'Right']; + for (_j = 0, _len1 = _ref4.length; _j < _len1; _j++) { + side = _ref4[_j]; + offsetBorder[side.toLowerCase()] = parseFloat(offsetParentStyle["border" + side + "Width"]); + } + offsetPosition.right = document.body.scrollWidth - offsetPosition.left - offsetParentSize.width + offsetBorder.right; + offsetPosition.bottom = document.body.scrollHeight - offsetPosition.top - offsetParentSize.height + offsetBorder.bottom; + if (next.page.top >= (offsetPosition.top + offsetBorder.top) && next.page.bottom >= offsetPosition.bottom) { + if (next.page.left >= (offsetPosition.left + offsetBorder.left) && next.page.right >= offsetPosition.right) { scrollTop = offsetParent.scrollTop; scrollLeft = offsetParent.scrollLeft; next.offset = { - top: next.page.top - offsetPosition.top + scrollTop + offsetBorder.top, - left: next.page.left - offsetPosition.left + scrollLeft + offsetBorder.left, - right: next.page.right - offsetPosition.right + offsetParent.scrollWidth - scrollLeft + offsetBorder.right, - bottom: next.page.bottom - offsetPosition.bottom + offsetParent.scrollHeight - scrollTop + offsetBorder.bottom + top: next.page.top - offsetPosition.top + scrollTop - offsetBorder.top, + left: next.page.left - offsetPosition.left + scrollLeft - offsetBorder.left }; } } @@ -437,21 +834,27 @@ if (this.history.length > 3) { this.history.pop(); } + if (flushChanges) { + flush(); + } return true; }; _Tether.prototype.move = function(position) { - var css, found, key, moved, offset, offsetParent, offsetParentStyle, point, same, side, transcribe, type, val, write, _j, _k, _len1, _len2, _ref2, _ref3, _ref4, + var css, elVal, found, key, moved, offsetParent, point, same, transcribe, type, val, write, writeCSS, _i, _len, _ref1, _ref2, _this = this; + if (this.element.parentNode == null) { + return; + } same = {}; for (type in position) { same[type] = {}; for (key in position[type]) { found = false; - _ref2 = this.history; - for (_j = 0, _len1 = _ref2.length; _j < _len1; _j++) { - point = _ref2[_j]; - if (((_ref3 = point[type]) != null ? _ref3[key] : void 0) !== position[type][key]) { + _ref1 = this.history; + for (_i = 0, _len = _ref1.length; _i < _len; _i++) { + point = _ref1[_i]; + if (!within((_ref2 = point[type]) != null ? _ref2[key] : void 0, position[type][key])) { found = true; break; } @@ -468,15 +871,37 @@ bottom: '' }; transcribe = function(same, pos) { - if (same.top) { - css.top = "" + pos.top + "px"; - } else { - css.bottom = "" + pos.bottom + "px"; - } - if (same.left) { - return css.left = "" + pos.left + "px"; + var xPos, yPos, _ref3; + if (((_ref3 = _this.options.optimizations) != null ? _ref3.gpu : void 0) !== false) { + if (same.top) { + css.top = 0; + yPos = pos.top; + } else { + css.bottom = 0; + yPos = -pos.bottom; + } + if (same.left) { + css.left = 0; + xPos = pos.left; + } else { + css.right = 0; + xPos = -pos.right; + } + css[transformKey] = "translateX(" + (Math.round(xPos)) + "px) translateY(" + (Math.round(yPos)) + "px)"; + if (transformKey !== 'msTransform') { + return css[transformKey] += " translateZ(0)"; + } } else { - return css.right = "" + pos.right + "px"; + if (same.top) { + css.top = "" + pos.top + "px"; + } else { + css.bottom = "" + pos.bottom + "px"; + } + if (same.left) { + return css.left = "" + pos.left + "px"; + } else { + return css.right = "" + pos.right + "px"; + } } }; moved = false; @@ -486,43 +911,48 @@ } else if ((same.viewport.top || same.viewport.bottom) && (same.viewport.left || same.viewport.right)) { css.position = 'fixed'; transcribe(same.viewport, position.viewport); - } else if ((same.offset != null) && (same.offset.top || same.offset.bottom) && (same.offset.left || same.offset.right)) { + } else if ((same.offset != null) && same.offset.top && same.offset.left) { css.position = 'absolute'; offsetParent = this.cache('target-offsetparent', function() { return getOffsetParent(_this.target); }); if (getOffsetParent(this.element) !== offsetParent) { - this.element.parentNode.removeChild(this.element); - offsetParent.appendChild(this.element); - } - offsetParentStyle = getComputedStyle(offsetParent); - offset = extend({}, position.offset); - _ref4 = ['top', 'left', 'bottom', 'right']; - for (_k = 0, _len2 = _ref4.length; _k < _len2; _k++) { - side = _ref4[_k]; - offset[side] -= parseFloat(offsetParentStyle["border-" + side + "-width"]); + defer(function() { + _this.element.parentNode.removeChild(_this.element); + return offsetParent.appendChild(_this.element); + }); } - transcribe(same.offset, offset); + transcribe(same.offset, position.offset); moved = true; } else { css.position = 'absolute'; - css.top = "" + position.page.top + "px"; - css.left = "" + position.page.left + "px"; + transcribe({ + top: true, + left: true + }, position.page); } if (!moved && this.element.parentNode.tagName !== 'BODY') { this.element.parentNode.removeChild(this.element); document.body.appendChild(this.element); } + writeCSS = {}; write = false; for (key in css) { val = css[key]; - if (this.element.style[key] !== val) { + elVal = this.element.style[key]; + if (elVal !== '' && val !== '' && (key === 'top' || key === 'left' || key === 'bottom' || key === 'right')) { + elVal = parseFloat(elVal); + val = parseFloat(val); + } + if (elVal !== val) { write = true; - break; + writeCSS[key] = css[key]; } } if (write) { - return extend(this.element.style, css); + return defer(function() { + return extend(_this.element.style, writeCSS); + }); } }; @@ -530,6 +960,399 @@ })(); + Tether.position = position; + window.Tether = extend(_Tether, Tether); }).call(this); + +(function() { + var BOUNDS_FORMAT, MIRROR_ATTACH, defer, extend, getBoundingRect, getBounds, getOuterSize, getSize, updateClasses, _ref, + __indexOf = [].indexOf || function(item) { for (var i = 0, l = this.length; i < l; i++) { if (i in this && this[i] === item) return i; } return -1; }; + + _ref = Tether.Utils, getOuterSize = _ref.getOuterSize, getBounds = _ref.getBounds, getSize = _ref.getSize, extend = _ref.extend, updateClasses = _ref.updateClasses, defer = _ref.defer; + + MIRROR_ATTACH = { + left: 'right', + right: 'left', + top: 'bottom', + bottom: 'top', + middle: 'middle' + }; + + BOUNDS_FORMAT = ['left', 'top', 'right', 'bottom']; + + getBoundingRect = function(tether, to) { + var i, pos, side, size, style, _i, _len; + if (to === 'scrollParent') { + to = tether.scrollParent; + } else if (to === 'window') { + to = [pageXOffset, pageYOffset, innerWidth + pageXOffset, innerHeight + pageYOffset]; + } + if (to === document) { + to = to.documentElement; + } + if (to.nodeType != null) { + pos = size = getBounds(to); + style = getComputedStyle(to); + to = [pos.left, pos.top, size.width + pos.left, size.height + pos.top]; + for (i = _i = 0, _len = BOUNDS_FORMAT.length; _i < _len; i = ++_i) { + side = BOUNDS_FORMAT[i]; + side = side[0].toUpperCase() + side.substr(1); + if (side === 'Top' || side === 'Left') { + to[i] += parseFloat(style["border" + side + "Width"]); + } else { + to[i] -= parseFloat(style["border" + side + "Width"]); + } + } + } + return to; + }; + + Tether.modules.push({ + position: function(_arg) { + var addClasses, allClasses, attachment, bounds, changeAttachX, changeAttachY, cls, constraint, eAttachment, height, left, oob, oobClass, p, pin, pinned, pinnedClass, removeClass, side, tAttachment, targetAttachment, targetHeight, targetSize, targetWidth, to, top, width, _i, _j, _k, _l, _len, _len1, _len2, _len3, _len4, _len5, _m, _n, _ref1, _ref2, _ref3, _ref4, _ref5, _ref6, _ref7, _ref8, + _this = this; + top = _arg.top, left = _arg.left, targetAttachment = _arg.targetAttachment; + if (!this.options.constraints) { + return true; + } + removeClass = function(prefix) { + var side, _i, _len, _results; + _this.removeClass(prefix); + _results = []; + for (_i = 0, _len = BOUNDS_FORMAT.length; _i < _len; _i++) { + side = BOUNDS_FORMAT[_i]; + _results.push(_this.removeClass("" + prefix + "-" + side)); + } + return _results; + }; + _ref1 = this.cache('element-bounds', function() { + return getBounds(_this.element); + }), height = _ref1.height, width = _ref1.width; + if (width === 0 && height === 0 && (this.lastSize != null)) { + _ref2 = this.lastSize, width = _ref2.width, height = _ref2.height; + } + targetSize = this.cache('target-bounds', function() { + return _this.getTargetBounds(); + }); + targetHeight = targetSize.height; + targetWidth = targetSize.width; + tAttachment = {}; + eAttachment = {}; + allClasses = [this.getClass('pinned'), this.getClass('out-of-bounds')]; + _ref3 = this.options.constraints; + for (_i = 0, _len = _ref3.length; _i < _len; _i++) { + constraint = _ref3[_i]; + if (constraint.outOfBoundsClass) { + allClasses.push(constraint.outOfBoundsClass); + } + if (constraint.pinnedClass) { + allClasses.push(constraint.pinnedClass); + } + } + for (_j = 0, _len1 = allClasses.length; _j < _len1; _j++) { + cls = allClasses[_j]; + _ref4 = ['left', 'top', 'right', 'bottom']; + for (_k = 0, _len2 = _ref4.length; _k < _len2; _k++) { + side = _ref4[_k]; + allClasses.push("" + cls + "-" + side); + } + } + addClasses = []; + tAttachment = extend({}, targetAttachment); + eAttachment = extend({}, this.attachment); + _ref5 = this.options.constraints; + for (_l = 0, _len3 = _ref5.length; _l < _len3; _l++) { + constraint = _ref5[_l]; + to = constraint.to, attachment = constraint.attachment, pin = constraint.pin; + if (attachment == null) { + attachment = ''; + } + if (__indexOf.call(attachment, ' ') >= 0) { + _ref6 = attachment.split(' '), changeAttachY = _ref6[0], changeAttachX = _ref6[1]; + } else { + changeAttachX = changeAttachY = attachment; + } + bounds = getBoundingRect(this, to); + if (changeAttachY === 'target' || changeAttachY === 'both') { + if (top < bounds[1] && tAttachment.top === 'top') { + top += targetHeight; + tAttachment.top = 'bottom'; + } + if (top + height > bounds[3] && tAttachment.top === 'bottom') { + top -= targetHeight; + tAttachment.top = 'top'; + } + } + if (changeAttachY === 'together') { + if (top < bounds[1] && tAttachment.top === 'top') { + if (eAttachment.top === 'bottom') { + top += targetHeight; + tAttachment.top = 'bottom'; + top += height; + eAttachment.top = 'top'; + } else if (eAttachment.top === 'top') { + top += targetHeight; + tAttachment.top = 'bottom'; + top -= height; + eAttachment.top = 'bottom'; + } + } + if (top + height > bounds[3] && tAttachment.top === 'bottom') { + if (eAttachment.top === 'top') { + top -= targetHeight; + tAttachment.top = 'top'; + top -= height; + eAttachment.top = 'bottom'; + } else if (eAttachment.top === 'bottom') { + top -= targetHeight; + tAttachment.top = 'top'; + top += height; + eAttachment.top = 'top'; + } + } + } + if (changeAttachX === 'target' || changeAttachX === 'both') { + if (left < bounds[0] && tAttachment.left === 'left') { + left += targetWidth; + tAttachment.left = 'right'; + } + if (left + width > bounds[2] && tAttachment.left === 'right') { + left -= targetWidth; + tAttachment.left = 'left'; + } + } + if (changeAttachX === 'together') { + if (left < bounds[0] && tAttachment.left === 'left') { + if (eAttachment.left === 'right') { + left += targetWidth; + tAttachment.left = 'right'; + left += width; + eAttachment.left = 'left'; + } else if (eAttachment.left === 'left') { + left += targetWidth; + tAttachment.left = 'right'; + left -= width; + eAttachment.left = 'right'; + } + } else if (left + width > bounds[2] && tAttachment.left === 'right') { + if (eAttachment.left === 'left') { + left -= targetWidth; + tAttachment.left = 'left'; + left -= width; + eAttachment.left = 'right'; + } else if (eAttachment.left === 'right') { + left -= targetWidth; + tAttachment.left = 'left'; + left += width; + eAttachment.left = 'left'; + } + } + } + if (changeAttachY === 'element' || changeAttachY === 'both') { + if (top < bounds[1] && eAttachment.top === 'bottom') { + top += height; + eAttachment.top = 'top'; + } + if (top + height > bounds[3] && eAttachment.top === 'top') { + top -= height; + eAttachment.top = 'bottom'; + } + } + if (changeAttachX === 'element' || changeAttachX === 'both') { + if (left < bounds[0] && eAttachment.left === 'right') { + left += width; + eAttachment.left = 'left'; + } + if (left + width > bounds[2] && eAttachment.left === 'left') { + left -= width; + eAttachment.left = 'right'; + } + } + if (typeof pin === 'string') { + pin = (function() { + var _len4, _m, _ref7, _results; + _ref7 = pin.split(','); + _results = []; + for (_m = 0, _len4 = _ref7.length; _m < _len4; _m++) { + p = _ref7[_m]; + _results.push(p.trim()); + } + return _results; + })(); + } else if (pin === true) { + pin = ['top', 'left', 'right', 'bottom']; + } + pin || (pin = []); + pinned = []; + oob = []; + if (top < bounds[1]) { + if (__indexOf.call(pin, 'top') >= 0) { + top = bounds[1]; + pinned.push('top'); + } else { + oob.push('top'); + } + } + if (top + height > bounds[3]) { + if (__indexOf.call(pin, 'bottom') >= 0) { + top = bounds[3] - height; + pinned.push('bottom'); + } else { + oob.push('bottom'); + } + } + if (left < bounds[0]) { + if (__indexOf.call(pin, 'left') >= 0) { + left = bounds[0]; + pinned.push('left'); + } else { + oob.push('left'); + } + } + if (left + width > bounds[2]) { + if (__indexOf.call(pin, 'right') >= 0) { + left = bounds[2] - width; + pinned.push('right'); + } else { + oob.push('right'); + } + } + if (pinned.length) { + pinnedClass = (_ref7 = this.options.pinnedClass) != null ? _ref7 : this.getClass('pinned'); + addClasses.push(pinnedClass); + for (_m = 0, _len4 = pinned.length; _m < _len4; _m++) { + side = pinned[_m]; + addClasses.push("" + pinnedClass + "-" + side); + } + } + if (oob.length) { + oobClass = (_ref8 = this.options.outOfBoundsClass) != null ? _ref8 : this.getClass('out-of-bounds'); + addClasses.push(oobClass); + for (_n = 0, _len5 = oob.length; _n < _len5; _n++) { + side = oob[_n]; + addClasses.push("" + oobClass + "-" + side); + } + } + if (__indexOf.call(pinned, 'left') >= 0 || __indexOf.call(pinned, 'right') >= 0) { + eAttachment.left = tAttachment.left = false; + } + if (__indexOf.call(pinned, 'top') >= 0 || __indexOf.call(pinned, 'bottom') >= 0) { + eAttachment.top = tAttachment.top = false; + } + if (tAttachment.top !== targetAttachment.top || tAttachment.left !== targetAttachment.left || eAttachment.top !== this.attachment.top || eAttachment.left !== this.attachment.left) { + this.updateAttachClasses(eAttachment, tAttachment); + } + } + defer(function() { + updateClasses(_this.target, addClasses, allClasses); + return updateClasses(_this.element, addClasses, allClasses); + }); + return { + top: top, + left: left + }; + } + }); + +}).call(this); + +(function() { + var defer, getBounds, updateClasses, _ref; + + _ref = Tether.Utils, getBounds = _ref.getBounds, updateClasses = _ref.updateClasses, defer = _ref.defer; + + Tether.modules.push({ + position: function(_arg) { + var abutted, addClasses, allClasses, bottom, height, left, right, side, sides, targetPos, top, width, _i, _j, _k, _l, _len, _len1, _len2, _len3, _ref1, _ref2, _ref3, _ref4, _ref5, + _this = this; + top = _arg.top, left = _arg.left; + _ref1 = this.cache('element-bounds', function() { + return getBounds(_this.element); + }), height = _ref1.height, width = _ref1.width; + targetPos = this.getTargetBounds(); + bottom = top + height; + right = left + width; + abutted = []; + if (top <= targetPos.bottom && bottom >= targetPos.top) { + _ref2 = ['left', 'right']; + for (_i = 0, _len = _ref2.length; _i < _len; _i++) { + side = _ref2[_i]; + if ((_ref3 = targetPos[side]) === left || _ref3 === right) { + abutted.push(side); + } + } + } + if (left <= targetPos.right && right >= targetPos.left) { + _ref4 = ['top', 'bottom']; + for (_j = 0, _len1 = _ref4.length; _j < _len1; _j++) { + side = _ref4[_j]; + if ((_ref5 = targetPos[side]) === top || _ref5 === bottom) { + abutted.push(side); + } + } + } + allClasses = []; + addClasses = []; + sides = ['left', 'top', 'right', 'bottom']; + allClasses.push(this.getClass('abutted')); + for (_k = 0, _len2 = sides.length; _k < _len2; _k++) { + side = sides[_k]; + allClasses.push("" + (this.getClass('abutted')) + "-" + side); + } + if (abutted.length) { + addClasses.push(this.getClass('abutted')); + } + for (_l = 0, _len3 = abutted.length; _l < _len3; _l++) { + side = abutted[_l]; + addClasses.push("" + (this.getClass('abutted')) + "-" + side); + } + defer(function() { + updateClasses(_this.target, addClasses, allClasses); + return updateClasses(_this.element, addClasses, allClasses); + }); + return true; + } + }); + +}).call(this); + +(function() { + Tether.modules.push({ + position: function(_arg) { + var left, result, shift, shiftLeft, shiftTop, top, _ref; + top = _arg.top, left = _arg.left; + if (!this.options.shift) { + return; + } + result = function(val) { + if (typeof val === 'function') { + return val.call(this, { + top: top, + left: left + }); + } else { + return val; + } + }; + shift = result(this.options.shift); + if (typeof shift === 'string') { + shift = shift.split(' '); + shift[1] || (shift[1] = shift[0]); + shiftTop = shift[0], shiftLeft = shift[1]; + shiftTop = parseFloat(shiftTop, 10); + shiftLeft = parseFloat(shiftLeft, 10); + } else { + _ref = [shift.top, shift.left], shiftTop = _ref[0], shiftLeft = _ref[1]; + } + top += shiftTop; + left += shiftLeft; + return { + top: top, + left: left + }; + } + }); + +}).call(this); diff --git a/tether.min.js b/tether.min.js index 0d55c7a5c..310f9db07 100644 --- a/tether.min.js +++ b/tether.min.js @@ -1,2 +1,2 @@ -/*! tether.js 0.2.8 */ -(function(){var a,b,c,d,e,f,g,h,i={}.hasOwnProperty,j=[].slice;null==window.Tether&&(window.Tether={}),f=function(a){var b,c,d,e,f;if(c=getComputedStyle(a).position,"fixed"===c)return a;for(d=void 0,b=a;b=b.parentNode;){if(!(e=getComputedStyle(b)))return b;if(/(auto|scroll)/.test(e.overflow+e["overflow-y"]+e["overflow-x"])&&("absolute"!==c||"relative"===(f=e.position)||"absolute"===f||"fixed"===f))return b}return document.body},d=function(a){var b,d,e,f;return d=a.ownerDocument,e=d.documentElement,b=c({},a.getBoundingClientRect()),b.top=b.top+window.pageYOffset-e.clientTop,b.left=b.left+window.pageXOffset-e.clientLeft,b.right=d.body.clientWidth-b.width-b.left,b.bottom=d.body.clientHeight-b.height-b.top,b.height&&b.width||(f=getComputedStyle(a),b.height||(b.height=parseFloat(f.height)),b.width||(b.width=parseFloat(f.width))),b},e=function(a){return a.offsetParent||document.documentElement},c=function(a){var b,c,d,e,f,g,h;for(null==a&&(a={}),b=[],Array.prototype.push.apply(b,arguments),h=b.slice(1),f=0,g=h.length;g>f;f++)if(d=h[f])for(c in d)i.call(d,c)&&(e=d[c],a[c]=e);return a},h=function(a,b){var c,d,e,f,g;if(null!=a.classList){for(f=b.split(" "),g=[],d=0,e=f.length;e>d;d++)c=f[d],g.push(a.classList.remove(c));return g}return a.className=a.className.replace(new RegExp("(^| )"+b.split(" ").join("|")+"( |$)","gi")," ")},b=function(a,b){var c,d,e,f,g;if(null!=a.classList){for(f=b.split(" "),g=[],d=0,e=f.length;e>d;d++)c=f[d],g.push(a.classList.add(c));return g}return h(a,b),a.className+=" "+b},g=function(a,b){return null!=a.classList?a.classList.contains(b):new RegExp("(^| )"+b+"( |$)","gi").test(a.className)},a=function(){function a(){}return a.prototype.on=function(a,b,c,d){var e;return null==d&&(d=!1),null==this.bindings&&(this.bindings={}),null==(e=this.bindings)[a]&&(e[a]=[]),this.bindings[a].push({handler:b,ctx:c,once:d})},a.prototype.once=function(a,b,c){return this.on(a,b,c,!0)},a.prototype.off=function(a,b){var c,d,e;if(null!=(null!=(d=this.bindings)?d[a]:void 0)){if(null==b)return delete this.bindings[a];for(c=0,e=[];cb;b++)a=v[b],d.push(a.position());return d},p=null,A=["resize","scroll"],x=0,y=A.length;y>x;x++)i=A[x],window.addEventListener(i,function(){return null==p||new Date-p>16?(p=+new Date,t()):void 0});a={center:"center",left:"right",right:"left"},b={middle:"middle",top:"bottom",bottom:"top"},c={top:"0",left:"0",middle:"50%",center:"50%",bottom:"100%",right:"100%"},g=function(c,d){var e,f;return e=c.left,f=c.top,"auto"===e&&(e=a[d.left]),"auto"===f&&(f=b[d.top]),{left:e,top:f}},f=function(a){var b,d;return{left:null!=(b=c[a.left])?b:a.left,top:null!=(d=c[a.top])?d:a.top}},e=function(){var a,b,c,d,e,f,g;for(b=1<=arguments.length?B.call(arguments,0):[],c={top:0,left:0},e=0,f=b.length;f>e;e++)g=b[e],d=g.top,a=g.left,"string"==typeof d&&(d=parseFloat(d,10)),"string"==typeof a&&(a=parseFloat(a,10)),c.top+=d,c.left+=a;return c},q=function(a,b){return"string"==typeof a.left&&-1!==a.left.indexOf("%")&&(a.left=parseFloat(a.left,10)/100*b.width),"string"==typeof a.top&&-1!==a.top.indexOf("%")&&(a.top=parseFloat(a.top,10)/100*b.height),a},r=s=function(a){var b,c,d;return d=a.split(" "),c=d[0],b=d[1],{top:c,left:b}},w=function(){function a(a){this.position=C(this.position,this);var b,c,d,e,f;for(v.push(this),this.history=[],this.setOptions(a,!1),e=Tether.modules,c=0,d=e.length;d>c;c++)b=e[c],null!=(f=b.initialize)&&f.call(this);this.position()}return a.modules=[],a.prototype.getClass=function(a){var b,c;return(null!=(b=this.options.classes)?b[a]:void 0)?this.options.classes[a]:(null!=(c=this.options.classes)?c[a]:void 0)!==!1?this.options.classPrefix?""+this.options.classPrefix+"-"+a:a:""},a.prototype.setOptions=function(a,b){var c,e,f,g,h,i;for(this.options=a,null==b&&(b=!0),c={offset:"0 0",targetOffset:"0 0",targetAttachment:"auto auto",classPrefix:"tether"},this.options=j(c,this.options),h=this.options,this.element=h.element,this.target=h.target,this.targetModifier=h.targetModifier,"viewport"===this.target?(this.target=document.body,this.targetModifier="visible"):"scroll-handle"===this.target&&(this.target=document.body,this.targetModifier="scroll-handle"),i=["element","target"],f=0,g=i.length;g>f;f++)if(e=i[f],null!=this[e].jquery?this[e]=this[e][0]:"string"==typeof this[e]&&(this[e]=document.querySelector(this[e])),null==this[e])throw new Error("Tether Error: Both element and target must be defined");return d(this.element,this.getClass("element")),d(this.target,this.getClass("target")),this.targetAttachment=r(this.options.targetAttachment),this.attachment=r(this.options.attachment),this.offset=s(this.options.offset),this.targetOffset=s(this.options.targetOffset),null!=this.scrollParent&&this.disable(),this.scrollParent=n(this.target),this.options.enabled!==!1?this.enable(b):void 0},a.prototype.getTargetBounds=function(){if(null==this.targetModifier)return k(this.target);switch(this.targetModifier){case"visible":return{top:pageYOffset,left:pageXOffset,height:innerHeight,width:innerWidth};case"scroll-handle":return{top:pageYOffset+innerHeight*(pageYOffset/document.body.scrollHeight),left:innerWidth-15,height:.98*innerHeight*(innerHeight/document.body.scrollHeight),width:15}}},a.prototype.clearCache=function(){return this._cache={}},a.prototype.cache=function(a,b){return null==this._cache&&(this._cache={}),null==this._cache[a]&&(this._cache[a]=b.call(this)),this._cache[a]},a.prototype.enable=function(a){var b=this;return null==a&&(a=!0),this.addClass(this.getClass("enabled")),this.enabled=!0,this.scrollParent.addEventListener("scroll",this.position),a?setTimeout(function(){return b.position()}):void 0},a.prototype.disable=function(){return this.removeClass(this.getClass("enabled")),this.enabled=!1,null!=this.scrollParent?this.scrollParent.removeEventListener("scroll",this.position):void 0},a.prototype.destroy=function(){var a,b,c,d,e;for(this.disable(),e=[],a=c=0,d=v.length;d>c;a=++c){if(b=v[a],b===this){v.splice(a,1);break}e.push(void 0)}return e},a.prototype.updateAttachClasses=function(a,b){var c,d,e,f,g,h;for(null==a&&(a=this.attachment),null==b&&(b=this.targetAttachment),d=["left","top","bottom","right","middle","center"],e=0,g=d.length;g>e;e++)c=d[e],this.removeClass(""+this.getClass("element-attached")+"-"+c);for(a.top&&this.addClass(""+this.getClass("element-attached")+"-"+a.top),a.left&&this.addClass(""+this.getClass("element-attached")+"-"+a.left),f=0,h=d.length;h>f;f++)c=d[f],this.removeClass(""+this.getClass("target-attached")+"-"+c);return b.top&&this.addClass(""+this.getClass("target-attached")+"-"+b.top),b.left?this.addClass(""+this.getClass("target-attached")+"-"+b.left):void 0},a.prototype.addClass=function(a){return d(this.element,a),d(this.target,a)},a.prototype.removeClass=function(a){return u(this.element,a),u(this.target,a)},a.prototype.position=function(){var a,b,c,d,h,i,j,m,n,o,p,r,s,t,u,v,w,x,y,z,A,B,C,D,E,F,G,H,I,J,K=this;if(this.enabled){for(this.clearCache(),x=g(this.targetAttachment,this.attachment),this.updateAttachClasses(this.attachment,x),a=this.cache("element-bounds",function(){return k(K.element)}),C=a.width,b=a.height,A=z=this.cache("target-bounds",function(){return K.getTargetBounds()}),m=q(f(this.attachment),{width:C,height:b}),y=q(f(x),A),d=q(this.offset,{width:C,height:b}),h=q(this.targetOffset,A),m=e(m,d),y=e(y,h),c=z.left+y.left-m.left,B=z.top+y.top-m.top,H=Tether.modules,D=0,F=H.length;F>D;D++)if(i=H[D],t=i.position.call(this,{left:c,top:B,targetAttachment:x,targetPos:z,elementPos:a,offset:m,targetOffset:y,manualOffset:d,manualTargetOffset:h}),null!=t&&"object"==typeof t){if(t===!1)return!1;B=t.top,c=t.left}if(j={page:{top:B,bottom:document.body.scrollHeight-B-b,left:c,right:document.body.scrollWidth-c-C},viewport:{top:B-pageYOffset,bottom:pageYOffset-B-b+innerHeight,left:c-pageXOffset,right:pageXOffset-c-C+innerWidth}},(null!=(I=this.options.optimizations)?I.moveElement:void 0)!==!1&&null==this.targetModifier){for(o=this.cache("target-offsetparent",function(){return l(K.target)}),s=this.cache("target-offsetparent-bounds",function(){return k(o)}),r=getComputedStyle(o),p=s,n={},J=["top","left","bottom","right"],E=0,G=J.length;G>E;E++)w=J[E],n[w]=parseFloat(r["border-"+w+"-width"]);s.left+=n.left,s.top+=n.top,s.right=document.body.scrollWidth-s.left-p.width,s.bottom=document.body.scrollHeight-s.top-p.height,j.page.top>=s.top&&j.page.bottom>=s.bottom&&j.page.left>=s.left&&j.page.right>=s.right&&(v=o.scrollTop,u=o.scrollLeft,j.offset={top:j.page.top-s.top+v+n.top,left:j.page.left-s.left+u+n.left,right:j.page.right-s.right+o.scrollWidth-u+n.right,bottom:j.page.bottom-s.bottom+o.scrollHeight-v+n.bottom})}return this.move(j),this.history.unshift(j),this.history.length>3&&this.history.pop(),!0}},a.prototype.move=function(a){var b,c,d,e,f,g,h,i,k,m,n,o,p,q,r,s,t,u,v,w,x,y=this;k={};for(o in a){k[o]={};for(d in a[o]){for(c=!1,v=this.history,r=0,t=v.length;t>r;r++)if(i=v[r],(null!=(w=i[o])?w[d]:void 0)!==a[o][d]){c=!0;break}c||(k[o][d]=!0)}}if(b={top:"",left:"",right:"",bottom:""},n=function(a,c){return a.top?b.top=""+c.top+"px":b.bottom=""+c.bottom+"px",a.left?b.left=""+c.left+"px":b.right=""+c.right+"px"},e=!1,(k.page.top||k.page.bottom)&&(k.page.left||k.page.right))b.position="absolute",n(k.page,a.page);else if((k.viewport.top||k.viewport.bottom)&&(k.viewport.left||k.viewport.right))b.position="fixed",n(k.viewport,a.viewport);else if(null!=k.offset&&(k.offset.top||k.offset.bottom)&&(k.offset.left||k.offset.right)){for(b.position="absolute",g=this.cache("target-offsetparent",function(){return l(y.target)}),l(this.element)!==g&&(this.element.parentNode.removeChild(this.element),g.appendChild(this.element)),h=getComputedStyle(g),f=j({},a.offset),x=["top","left","bottom","right"],s=0,u=x.length;u>s;s++)m=x[s],f[m]-=parseFloat(h["border-"+m+"-width"]);n(k.offset,f),e=!0}else b.position="absolute",b.top=""+a.page.top+"px",b.left=""+a.page.left+"px";e||"BODY"===this.element.parentNode.tagName||(this.element.parentNode.removeChild(this.element),document.body.appendChild(this.element)),q=!1;for(d in b)if(p=b[d],this.element.style[d]!==p){q=!0;break}return q?j(this.element.style,b):void 0},a}(),window.Tether=j(w,Tether)}.call(this),function(){var a,b,c,d,e,f,g,h,i=[].indexOf||function(a){for(var b=0,c=this.length;c>b;b++)if(b in this&&this[b]===a)return b;return-1};h=Tether.Utils,f=h.getOuterSize,e=h.getBounds,g=h.getSize,c=h.extend,b={left:"right",right:"left",top:"bottom",bottom:"top",middle:"middle"},a=["left","top","right","bottom"],d=function(b,c){var d,f,g,h,i,j,k;if("scrollParent"===c?c=b.scrollParent:"window"===c&&(c=[pageXOffset,pageYOffset,innerWidth+pageXOffset,innerHeight+pageYOffset]),null!=c.nodeType)for(f=h=e(c),i=getComputedStyle(c),c=[f.left,f.top,h.width+f.left,h.height+f.top],d=j=0,k=a.length;k>j;d=++j)g=a[d],"top"===g||"left"===g?c[d]+=parseFloat(i["border-"+g+"-width"]):c[d]-=parseFloat(i["border-"+g+"-width"]);return c},Tether.modules.push({position:function(b){var f,g,h,j,k,l,m,n,o,p,q,r,s,t,u,v,w,x,y,z,A,B,C,D,E,F,G,H,I,J,K,L,M,N,O,P,Q,R,S,T,U,V,W=this;if(E=b.top,o=b.left,z=b.targetAttachment,!this.options.constraints)return!0;for(v=function(b){var c,d,e,f;for(W.removeClass(b),f=[],d=0,e=a.length;e>d;d++)c=a[d],f.push(W.removeClass(""+b+"-"+c));return f},Q=this.cache("element-bounds",function(){return e(W.element)}),n=Q.height,F=Q.width,B=this.cache("target-bounds",function(){return W.getTargetBounds()}),A=B.height,C=B.width,y={},m={},w=[this.getClass("pinned"),this.getClass("out-of-bounds")],R=this.options.constraints,G=0,K=R.length;K>G;G++)l=R[G],l.outOfBoundsClass&&w.push(l.outOfBoundsClass),l.pinnedClass&&w.push(l.pinnedClass);for(H=0,L=w.length;L>H;H++)k=w[H],v(k);for(y=c({},z),m=c({},this.attachment),S=this.options.constraints,I=0,M=S.length;M>I;I++){if(l=S[I],D=l.to,f=l.attachment,s=l.pin,null==f&&(f=""),i.call(f," ")>=0?(T=f.split(" "),j=T[0],h=T[1]):h=j=f,g=d(this,D),("target"===j||"both"===j)&&(Eg[3]&&"bottom"===y.top&&(E-=A,y.top="top")),"together"===j&&(Eg[3]&&"bottom"===y.top&&("top"===m.top?(E-=A,y.top="top",E-=n,m.top="bottom"):"bottom"===m.top&&(E-=A,y.top="top",E+=n,m.top="top"))),("target"===h||"both"===h)&&(og[2]&&"right"===y.left&&(o-=C,y.left="left")),"together"===h&&(og[2]&&"right"===y.left&&("left"===m.left?(o-=C,y.left="left",o-=F,m.left="right"):"right"===m.left&&(o-=C,y.left="left",o+=F,m.left="left"))),("element"===j||"both"===j)&&(Eg[3]&&"top"===m.top&&(E-=n,m.top="bottom")),("element"===h||"both"===h)&&(og[2]&&"left"===m.left&&(o-=F,m.left="right")),"string"==typeof s?s=function(){var a,b,c,d;for(c=s.split(","),d=[],a=0,b=c.length;b>a;a++)r=c[a],d.push(r.trim());return d}():s===!0&&(s=["top","left","right","bottom"]),s||(s=[]),t=[],p=[],E=0?(E=g[1],t.push("top")):p.push("top")),E+n>g[3]&&(i.call(s,"bottom")>=0?(E=g[3]-n,t.push("bottom")):p.push("bottom")),o=0?(o=g[0],t.push("left")):p.push("left")),o+F>g[2]&&(i.call(s,"right")>=0?(o=g[2]-F,t.push("right")):p.push("right")),t.length)for(u=null!=(U=this.options.pinnedClass)?U:this.getClass("pinned"),this.addClass(u),J=0,N=t.length;N>J;J++)x=t[J],this.addClass(""+u+"-"+x);if(p.length)for(q=null!=(V=this.options.outOfBoundsClass)?V:this.getClass("out-of-bounds"),this.addClass(q),P=0,O=p.length;O>P;P++)x=p[P],this.addClass(""+q+"-"+x);(i.call(t,"left")>=0||i.call(t,"right")>=0)&&(m.left=y.left=!1),(i.call(t,"top")>=0||i.call(t,"bottom")>=0)&&(m.top=y.top=!1),(y.top!==z.top||y.left!==z.left||m.top!==this.attachment.top||m.left!==this.attachment.left)&&this.updateAttachClasses(m,y)}return{top:E,left:o}}})}.call(this),function(){var a;a=Tether.Utils.getBounds,Tether.modules.push({position:function(b){var c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u,v,w,x,y,z=this;if(k=b.top,f=b.left,u=this.cache("element-bounds",function(){return a(z.element)}),e=u.height,l=u.width,j=this.getTargetBounds(),d=k+e,g=f+l,c=[],k<=j.bottom&&d>=j.top)for(v=["left","right"],m=0,q=v.length;q>m;m++)h=v[m],((w=j[h])===f||w===g)&&c.push(h);if(f<=j.right&&g>=j.left)for(x=["top","bottom"],n=0,r=x.length;r>n;n++)h=x[n],((y=j[h])===k||y===d)&&c.push(h);for(i=["left","top","right","bottom"],this.removeClass(this.getClass("abutted")),o=0,s=i.length;s>o;o++)h=i[o],this.removeClass(""+this.getClass("abutted")+"-"+h);for(c.length&&this.addClass(this.getClass("abutted")),p=0,t=c.length;t>p;p++)h=c[p],this.addClass(""+this.getClass("abutted")+"-"+h);return!0}})}.call(this),function(){Tether.modules.push({position:function(a){var b,c,d,e,f,g,h;return g=a.top,b=a.left,this.options.shift?(c=function(a){return"function"==typeof a?a.call(this,{top:g,left:b}):a},d=c(this.options.shift),"string"==typeof d?(d=d.split(" "),d[1]||(d[1]=d[0]),f=d[0],e=d[1],f=parseFloat(f,10),e=parseFloat(e,10)):(h=[d.top,d.left],f=h[0],e=h[1]),g+=f,b+=e,{top:g,left:b}):void 0}})}.call(this); \ No newline at end of file +/*! tether 0.5.2 */ +(function(){var t,e,o,i,n,s,l,r,h,a,f,p,u,d,g,c,m={}.hasOwnProperty,b=[].indexOf||function(t){for(var e=0,o=this.length;o>e;e++)if(e in this&&this[e]===t)return e;return-1},v=[].slice;null==window.Tether&&(window.Tether={}),a=function(t){var e,o,i,n,s;if(o=getComputedStyle(t).position,"fixed"===o)return t;for(i=void 0,e=t;e=e.parentNode;){try{n=getComputedStyle(e)}catch(l){}if(null==n)return e;if(/(auto|scroll)/.test(n.overflow+n["overflow-y"]+n["overflow-x"])&&("absolute"!==o||"relative"===(s=n.position)||"absolute"===s||"fixed"===s))return e}return document.body},d=function(){var t;return t=0,function(){return t++}}(),c={},h=function(t){var e,i,s,l,r;if(s=t._tetherZeroElement,null==s&&(s=t.createElement("div"),s.setAttribute("data-tether-id",d()),n(s.style,{top:0,left:0,position:"absolute"}),t.body.appendChild(s),t._tetherZeroElement=s),e=s.getAttribute("data-tether-id"),null==c[e]){c[e]={},r=s.getBoundingClientRect();for(i in r)l=r[i],c[e][i]=l;o(function(){return c[e]=void 0})}return c[e]},p=null,l=function(t){var e,o,i,n,s,l,r;t===document?(o=document,t=document.documentElement):o=t.ownerDocument,i=o.documentElement,e={},r=t.getBoundingClientRect();for(n in r)l=r[n],e[n]=l;return s=h(o),e.top-=s.top,e.left-=s.left,null==e.width&&(e.width=document.body.scrollWidth-e.left-e.right),null==e.height&&(e.height=document.body.scrollHeight-e.top-e.bottom),e.top=e.top-i.clientTop,e.left=e.left-i.clientLeft,e.right=o.body.clientWidth-e.width-e.left,e.bottom=o.body.clientHeight-e.height-e.top,e},r=function(t){return t.offsetParent||document.documentElement},n=function(t){var e,o,i,n,s,l,r;for(null==t&&(t={}),e=[],Array.prototype.push.apply(e,arguments),r=e.slice(1),s=0,l=r.length;l>s;s++)if(i=r[s])for(o in i)m.call(i,o)&&(n=i[o],t[o]=n);return t},u=function(t,e){var o,i,n,s,l;if(null!=t.classList){for(s=e.split(" "),l=[],i=0,n=s.length;n>i;i++)o=s[i],l.push(t.classList.remove(o));return l}return t.className=t.className.replace(new RegExp("(^| )"+e.split(" ").join("|")+"( |$)","gi")," ")},e=function(t,e){var o,i,n,s,l;if(null!=t.classList){for(s=e.split(" "),l=[],i=0,n=s.length;n>i;i++)o=s[i],l.push(t.classList.add(o));return l}return u(t,e),t.className+=" "+e},f=function(t,e){return null!=t.classList?t.classList.contains(e):new RegExp("(^| )"+e+"( |$)","gi").test(t.className)},g=function(t,o,i){var n,s,l,r,h,a;for(s=0,r=i.length;r>s;s++)n=i[s],b.call(o,n)<0&&f(t,n)&&u(t,n);for(a=[],l=0,h=o.length;h>l;l++)n=o[l],f(t,n)?a.push(void 0):a.push(e(t,n));return a},i=[],o=function(t){return i.push(t)},s=function(){var t,e;for(e=[];t=i.pop();)e.push(t());return e},t=function(){function t(){}return t.prototype.on=function(t,e,o,i){var n;return null==i&&(i=!1),null==this.bindings&&(this.bindings={}),null==(n=this.bindings)[t]&&(n[t]=[]),this.bindings[t].push({handler:e,ctx:o,once:i})},t.prototype.once=function(t,e,o){return this.on(t,e,o,!0)},t.prototype.off=function(t,e){var o,i,n;if(null!=(null!=(i=this.bindings)?i[t]:void 0)){if(null==e)return delete this.bindings[t];for(o=0,n=[];o=e&&e>=t-o},O=function(){var t,e,o,i,n;for(t=document.createElement("div"),n=["transform","webkitTransform","OTransform","MozTransform","msTransform"],o=0,i=n.length;i>o;o++)if(e=n[o],void 0!==t.style[e])return e}(),C=[],y=function(){var t,e,o;for(e=0,o=C.length;o>e;e++)t=C[e],t.position(!1);return a()},c=function(){var t;return null!=(t="undefined"!=typeof performance&&null!==performance?"function"==typeof performance.now?performance.now():void 0:void 0)?t:+new Date},function(){var t,e,o,i,n,s,l,r,h;for(e=null,o=null,i=null,n=function(){if(null!=o&&o>16)return o=Math.min(o-16,250),i=setTimeout(n,250),void 0;if(!(null!=e&&c()-e<10))return null!=i&&(clearTimeout(i),i=null),e=c(),y(),o=c()-e},r=["resize","scroll","touchmove"],h=[],s=0,l=r.length;l>s;s++)t=r[s],h.push(window.addEventListener(t,n));return h}(),t={center:"center",left:"right",right:"left"},e={middle:"middle",top:"bottom",bottom:"top"},o={top:0,left:0,middle:"50%",center:"50%",bottom:"100%",right:"100%"},l=function(o,i){var n,s;return n=o.left,s=o.top,"auto"===n&&(n=t[i.left]),"auto"===s&&(s=e[i.top]),{left:n,top:s}},s=function(t){var e,i;return{left:null!=(e=o[t.left])?e:t.left,top:null!=(i=o[t.top])?i:t.top}},n=function(){var t,e,o,i,n,s,l;for(e=1<=arguments.length?M.call(arguments,0):[],o={top:0,left:0},n=0,s=e.length;s>n;n++)l=e[n],i=l.top,t=l.left,"string"==typeof i&&(i=parseFloat(i,10)),"string"==typeof t&&(t=parseFloat(t,10)),o.top+=i,o.left+=t;return o},m=function(t,e){return"string"==typeof t.left&&-1!==t.left.indexOf("%")&&(t.left=parseFloat(t.left,10)/100*e.width),"string"==typeof t.top&&-1!==t.top.indexOf("%")&&(t.top=parseFloat(t.top,10)/100*e.height),t},b=v=function(t){var e,o,i;return i=t.split(" "),o=i[0],e=i[1],{top:o,left:e}},A=function(){function t(t){this.position=P(this.position,this);var e,o,i,n,s;for(C.push(this),this.history=[],this.setOptions(t,!1),n=Tether.modules,o=0,i=n.length;i>o;o++)e=n[o],null!=(s=e.initialize)&&s.call(this);this.position()}return t.modules=[],t.prototype.getClass=function(t){var e,o;return(null!=(e=this.options.classes)?e[t]:void 0)?this.options.classes[t]:(null!=(o=this.options.classes)?o[t]:void 0)!==!1?this.options.classPrefix?""+this.options.classPrefix+"-"+t:t:""},t.prototype.setOptions=function(t,e){var o,n,s,l,r,a;for(this.options=t,null==e&&(e=!0),o={offset:"0 0",targetOffset:"0 0",targetAttachment:"auto auto",classPrefix:"tether"},this.options=h(o,this.options),r=this.options,this.element=r.element,this.target=r.target,this.targetModifier=r.targetModifier,"viewport"===this.target?(this.target=document.body,this.targetModifier="visible"):"scroll-handle"===this.target&&(this.target=document.body,this.targetModifier="scroll-handle"),a=["element","target"],s=0,l=a.length;l>s;s++){if(n=a[s],null==this[n])throw new Error("Tether Error: Both element and target must be defined");null!=this[n].jquery?this[n]=this[n][0]:"string"==typeof this[n]&&(this[n]=document.querySelector(this[n]))}if(i(this.element,this.getClass("element")),i(this.target,this.getClass("target")),!this.options.attachment)throw new Error("Tether Error: You must provide an attachment");return this.targetAttachment=b(this.options.targetAttachment),this.attachment=b(this.options.attachment),this.offset=v(this.options.offset),this.targetOffset=v(this.options.targetOffset),null!=this.scrollParent&&this.disable(),this.scrollParent="scroll-handle"===this.targetModifier?this.target:d(this.target),this.options.enabled!==!1?this.enable(e):void 0},t.prototype.getTargetBounds=function(){var t,e,o,i,n,s,l,r,h;if(null==this.targetModifier)return f(this.target);switch(this.targetModifier){case"visible":return this.target===document.body?{top:pageYOffset,left:pageXOffset,height:innerHeight,width:innerWidth}:(t=f(this.target),n={height:t.height,width:t.width,top:t.top,left:t.left},n.height=Math.min(n.height,t.height-(pageYOffset-t.top)),n.height=Math.min(n.height,t.height-(t.top+t.height-(pageYOffset+innerHeight))),n.height=Math.min(innerHeight,n.height),n.height-=2,n.width=Math.min(n.width,t.width-(pageXOffset-t.left)),n.width=Math.min(n.width,t.width-(t.left+t.width-(pageXOffset+innerWidth))),n.width=Math.min(innerWidth,n.width),n.width-=2,n.toph.clientWidth||"scroll"===[r.overflow,r.overflowX]||this.target!==document.body,s=0,o&&(s=15),i=t.height-parseFloat(r.borderTopWidth)-parseFloat(r.borderBottomWidth)-s,n={width:15,height:.975*i*(i/h.scrollHeight),left:t.left+t.width-parseFloat(r.borderLeftWidth)-15},e=0,408>i&&this.target===document.body&&(e=-11e-5*Math.pow(i,2)-.00727*i+22.58),this.target!==document.body&&(n.height=Math.max(n.height,24)),l=this.target.scrollTop/(h.scrollHeight-i),n.top=l*(i-n.height-e)+t.top+parseFloat(r.borderTopWidth),this.target===document.body&&(n.height=Math.max(n.height,24)),n}},t.prototype.clearCache=function(){return this._cache={}},t.prototype.cache=function(t,e){return null==this._cache&&(this._cache={}),null==this._cache[t]&&(this._cache[t]=e.call(this)),this._cache[t]},t.prototype.enable=function(t){return null==t&&(t=!0),i(this.target,this.getClass("enabled")),i(this.element,this.getClass("enabled")),this.enabled=!0,this.scrollParent!==document&&this.scrollParent.addEventListener("scroll",this.position),t?this.position():void 0},t.prototype.disable=function(){return w(this.target,this.getClass("enabled")),w(this.element,this.getClass("enabled")),this.enabled=!1,null!=this.scrollParent?this.scrollParent.removeEventListener("scroll",this.position):void 0},t.prototype.destroy=function(){var t,e,o,i,n;for(this.disable(),n=[],t=o=0,i=C.length;i>o;t=++o){if(e=C[t],e===this){C.splice(t,1);break}n.push(void 0)}return n},t.prototype.updateAttachClasses=function(t,e){var o,i,n,s,l,h,a,f,p,u=this;for(null==t&&(t=this.attachment),null==e&&(e=this.targetAttachment),s=["left","top","bottom","right","middle","center"],(null!=(p=this._addAttachClasses)?p.length:void 0)&&this._addAttachClasses.splice(0,this._addAttachClasses.length),o=null!=this._addAttachClasses?this._addAttachClasses:this._addAttachClasses=[],t.top&&o.push(""+this.getClass("element-attached")+"-"+t.top),t.left&&o.push(""+this.getClass("element-attached")+"-"+t.left),e.top&&o.push(""+this.getClass("target-attached")+"-"+e.top),e.left&&o.push(""+this.getClass("target-attached")+"-"+e.left),i=[],l=0,a=s.length;a>l;l++)n=s[l],i.push(""+this.getClass("element-attached")+"-"+n);for(h=0,f=s.length;f>h;h++)n=s[h],i.push(""+this.getClass("target-attached")+"-"+n);return r(function(){return null!=u._addAttachClasses?(T(u.element,u._addAttachClasses,i),T(u.target,u._addAttachClasses,i),u._addAttachClasses=void 0):void 0})},t.prototype.position=function(t){var e,o,i,r,h,u,d,g,c,b,v,y,w,C,O,T,x,A,E,M,P,W,S,_,B,F,L,z,Y,H,X,N,j=this;if(null==t&&(t=!0),this.enabled){for(this.clearCache(),E=l(this.targetAttachment,this.attachment),this.updateAttachClasses(this.attachment,E),e=this.cache("element-bounds",function(){return f(j.element)}),_=e.width,i=e.height,0===_&&0===i&&null!=this.lastSize?(Y=this.lastSize,_=Y.width,i=Y.height):this.lastSize={width:_,height:i},W=P=this.cache("target-bounds",function(){return j.getTargetBounds()}),c=m(s(this.attachment),{width:_,height:i}),M=m(s(E),W),h=m(this.offset,{width:_,height:i}),u=m(this.targetOffset,W),c=n(c,h),M=n(M,u),r=P.left+M.left-c.left,S=P.top+M.top-c.top,H=Tether.modules,B=0,L=H.length;L>B;B++)if(d=H[B],O=d.position.call(this,{left:r,top:S,targetAttachment:E,targetPos:P,attachment:this.attachment,elementPos:e,offset:c,targetOffset:M,manualOffset:h,manualTargetOffset:u}),null!=O&&"object"==typeof O){if(O===!1)return!1;S=O.top,r=O.left}if(g={page:{top:S,bottom:document.body.scrollHeight-S-i,left:r,right:document.body.scrollWidth-r-_},viewport:{top:S-pageYOffset,bottom:pageYOffset-S-i+innerHeight,left:r-pageXOffset,right:pageXOffset-r-_+innerWidth}},(null!=(X=this.options.optimizations)?X.moveElement:void 0)!==!1&&null==this.targetModifier){for(v=this.cache("target-offsetparent",function(){return p(j.target)}),C=this.cache("target-offsetparent-bounds",function(){return f(v)}),w=getComputedStyle(v),o=getComputedStyle(this.element),y=C,b={},N=["Top","Left","Bottom","Right"],F=0,z=N.length;z>F;F++)A=N[F],b[A.toLowerCase()]=parseFloat(w["border"+A+"Width"]);C.right=document.body.scrollWidth-C.left-y.width+b.right,C.bottom=document.body.scrollHeight-C.top-y.height+b.bottom,g.page.top>=C.top+b.top&&g.page.bottom>=C.bottom&&g.page.left>=C.left+b.left&&g.page.right>=C.right&&(x=v.scrollTop,T=v.scrollLeft,g.offset={top:g.page.top-C.top+x-b.top,left:g.page.left-C.left+T-b.left})}return this.move(g),this.history.unshift(g),this.history.length>3&&this.history.pop(),t&&a(),!0}},t.prototype.move=function(t){var e,o,i,n,s,l,a,f,u,d,g,c,m,b,v,y,w,C=this;if(null!=this.element.parentNode){f={};for(d in t){f[d]={};for(n in t[d]){for(i=!1,y=this.history,b=0,v=y.length;v>b;b++)if(a=y[b],!x(null!=(w=a[d])?w[n]:void 0,t[d][n])){i=!0;break}i||(f[d][n]=!0)}}e={top:"",left:"",right:"",bottom:""},u=function(t,o){var i,n,s;return(null!=(s=C.options.optimizations)?s.gpu:void 0)===!1?(t.top?e.top=""+o.top+"px":e.bottom=""+o.bottom+"px",t.left?e.left=""+o.left+"px":e.right=""+o.right+"px"):(t.top?(e.top=0,n=o.top):(e.bottom=0,n=-o.bottom),t.left?(e.left=0,i=o.left):(e.right=0,i=-o.right),e[O]="translateX("+Math.round(i)+"px) translateY("+Math.round(n)+"px)","msTransform"!==O?e[O]+=" translateZ(0)":void 0)},s=!1,(f.page.top||f.page.bottom)&&(f.page.left||f.page.right)?(e.position="absolute",u(f.page,t.page)):(f.viewport.top||f.viewport.bottom)&&(f.viewport.left||f.viewport.right)?(e.position="fixed",u(f.viewport,t.viewport)):null!=f.offset&&f.offset.top&&f.offset.left?(e.position="absolute",l=this.cache("target-offsetparent",function(){return p(C.target)}),p(this.element)!==l&&r(function(){return C.element.parentNode.removeChild(C.element),l.appendChild(C.element)}),u(f.offset,t.offset),s=!0):(e.position="absolute",u({top:!0,left:!0},t.page)),s||"BODY"===this.element.parentNode.tagName||(this.element.parentNode.removeChild(this.element),document.body.appendChild(this.element)),m={},c=!1;for(n in e)g=e[n],o=this.element.style[n],""===o||""===g||"top"!==n&&"left"!==n&&"bottom"!==n&&"right"!==n||(o=parseFloat(o),g=parseFloat(g)),o!==g&&(c=!0,m[n]=e[n]);return c?r(function(){return h(C.element.style,m)}):void 0}},t}(),Tether.position=y,window.Tether=h(A,Tether)}.call(this),function(){var t,e,o,i,n,s,l,r,h,a,f=[].indexOf||function(t){for(var e=0,o=this.length;o>e;e++)if(e in this&&this[e]===t)return e;return-1};a=Tether.Utils,l=a.getOuterSize,s=a.getBounds,r=a.getSize,i=a.extend,h=a.updateClasses,o=a.defer,e={left:"right",right:"left",top:"bottom",bottom:"top",middle:"middle"},t=["left","top","right","bottom"],n=function(e,o){var i,n,l,r,h,a,f;if("scrollParent"===o?o=e.scrollParent:"window"===o&&(o=[pageXOffset,pageYOffset,innerWidth+pageXOffset,innerHeight+pageYOffset]),o===document&&(o=o.documentElement),null!=o.nodeType)for(n=r=s(o),h=getComputedStyle(o),o=[n.left,n.top,r.width+n.left,r.height+n.top],i=a=0,f=t.length;f>a;i=++a)l=t[i],l=l[0].toUpperCase()+l.substr(1),"Top"===l||"Left"===l?o[i]+=parseFloat(h["border"+l+"Width"]):o[i]-=parseFloat(h["border"+l+"Width"]);return o},Tether.modules.push({position:function(e){var l,r,a,p,u,d,g,c,m,b,v,y,w,C,O,T,x,A,E,M,P,W,S,_,B,F,L,z,Y,H,X,N,j,R,U,k,q,D,Z,$,I,G,J,K,Q,V,te,ee=this;if(F=e.top,v=e.left,P=e.targetAttachment,!this.options.constraints)return!0;for(A=function(e){var o,i,n,s;for(ee.removeClass(e),s=[],i=0,n=t.length;n>i;i++)o=t[i],s.push(ee.removeClass(""+e+"-"+o));return s},$=this.cache("element-bounds",function(){return s(ee.element)}),b=$.height,L=$.width,0===L&&0===b&&null!=this.lastSize&&(I=this.lastSize,L=I.width,b=I.height),S=this.cache("target-bounds",function(){return ee.getTargetBounds()}),W=S.height,_=S.width,M={},m={},r=[this.getClass("pinned"),this.getClass("out-of-bounds")],G=this.options.constraints,z=0,N=G.length;N>z;z++)c=G[z],c.outOfBoundsClass&&r.push(c.outOfBoundsClass),c.pinnedClass&&r.push(c.pinnedClass);for(Y=0,j=r.length;j>Y;Y++)for(g=r[Y],J=["left","top","right","bottom"],H=0,R=J.length;R>H;H++)E=J[H],r.push(""+g+"-"+E);for(l=[],M=i({},P),m=i({},this.attachment),K=this.options.constraints,X=0,U=K.length;U>X;X++){if(c=K[X],B=c.to,a=c.attachment,O=c.pin,null==a&&(a=""),f.call(a," ")>=0?(Q=a.split(" "),d=Q[0],u=Q[1]):u=d=a,p=n(this,B),("target"===d||"both"===d)&&(Fp[3]&&"bottom"===M.top&&(F-=W,M.top="top")),"together"===d&&(Fp[3]&&"bottom"===M.top&&("top"===m.top?(F-=W,M.top="top",F-=b,m.top="bottom"):"bottom"===m.top&&(F-=W,M.top="top",F+=b,m.top="top"))),("target"===u||"both"===u)&&(vp[2]&&"right"===M.left&&(v-=_,M.left="left")),"together"===u&&(vp[2]&&"right"===M.left&&("left"===m.left?(v-=_,M.left="left",v-=L,m.left="right"):"right"===m.left&&(v-=_,M.left="left",v+=L,m.left="left"))),("element"===d||"both"===d)&&(Fp[3]&&"top"===m.top&&(F-=b,m.top="bottom")),("element"===u||"both"===u)&&(vp[2]&&"left"===m.left&&(v-=L,m.left="right")),"string"==typeof O?O=function(){var t,e,o,i;for(o=O.split(","),i=[],e=0,t=o.length;t>e;e++)C=o[e],i.push(C.trim());return i}():O===!0&&(O=["top","left","right","bottom"]),O||(O=[]),T=[],y=[],F=0?(F=p[1],T.push("top")):y.push("top")),F+b>p[3]&&(f.call(O,"bottom")>=0?(F=p[3]-b,T.push("bottom")):y.push("bottom")),v=0?(v=p[0],T.push("left")):y.push("left")),v+L>p[2]&&(f.call(O,"right")>=0?(v=p[2]-L,T.push("right")):y.push("right")),T.length)for(x=null!=(V=this.options.pinnedClass)?V:this.getClass("pinned"),l.push(x),D=0,k=T.length;k>D;D++)E=T[D],l.push(""+x+"-"+E);if(y.length)for(w=null!=(te=this.options.outOfBoundsClass)?te:this.getClass("out-of-bounds"),l.push(w),Z=0,q=y.length;q>Z;Z++)E=y[Z],l.push(""+w+"-"+E);(f.call(T,"left")>=0||f.call(T,"right")>=0)&&(m.left=M.left=!1),(f.call(T,"top")>=0||f.call(T,"bottom")>=0)&&(m.top=M.top=!1),(M.top!==P.top||M.left!==P.left||m.top!==this.attachment.top||m.left!==this.attachment.left)&&this.updateAttachClasses(m,M)}return o(function(){return h(ee.target,l,r),h(ee.element,l,r)}),{top:F,left:v}}})}.call(this),function(){var t,e,o,i;i=Tether.Utils,e=i.getBounds,o=i.updateClasses,t=i.defer,Tether.modules.push({position:function(i){var n,s,l,r,h,a,f,p,u,d,g,c,m,b,v,y,w,C,O,T,x,A,E,M,P,W=this;if(g=i.top,a=i.left,x=this.cache("element-bounds",function(){return e(W.element)}),h=x.height,c=x.width,d=this.getTargetBounds(),r=g+h,f=a+c,n=[],g<=d.bottom&&r>=d.top)for(A=["left","right"],m=0,w=A.length;w>m;m++)p=A[m],((E=d[p])===a||E===f)&&n.push(p);if(a<=d.right&&f>=d.left)for(M=["top","bottom"],b=0,C=M.length;C>b;b++)p=M[b],((P=d[p])===g||P===r)&&n.push(p);for(l=[],s=[],u=["left","top","right","bottom"],l.push(this.getClass("abutted")),v=0,O=u.length;O>v;v++)p=u[v],l.push(""+this.getClass("abutted")+"-"+p);for(n.length&&s.push(this.getClass("abutted")),y=0,T=n.length;T>y;y++)p=n[y],s.push(""+this.getClass("abutted")+"-"+p);return t(function(){return o(W.target,s,l),o(W.element,s,l)}),!0}})}.call(this),function(){Tether.modules.push({position:function(t){var e,o,i,n,s,l,r;return l=t.top,e=t.left,this.options.shift?(o=function(t){return"function"==typeof t?t.call(this,{top:l,left:e}):t},i=o(this.options.shift),"string"==typeof i?(i=i.split(" "),i[1]||(i[1]=i[0]),s=i[0],n=i[1],s=parseFloat(s,10),n=parseFloat(n,10)):(r=[i.top,i.left],s=r[0],n=r[1]),l+=s,e+=n,{top:l,left:e}):void 0}})}.call(this); \ No newline at end of file diff --git a/tooltip.coffee b/tooltip.coffee deleted file mode 100644 index d778f7127..000000000 --- a/tooltip.coffee +++ /dev/null @@ -1,25 +0,0 @@ -DropTooltip = Drop.createContext() - -defaults = - attach: 'top center' - -class Tooltip - - constructor: (@options) -> - @$target = $ @options.el - - @createDrop() - - createDrop: -> - @options.attach = defaults.attach if not @options.attach? - - @dropTooltip = new DropTooltip - target: @$target[0] - className: 'drop-tooltip-theme-arrows' - attach: @options.attach - constrainToWindow: true - constrainToScrollParent: false - openOn: 'hover' - content: @options.content ? @$target.attr('data-tooltip-content') - -window.Tooltip = Tooltip diff --git a/tooltip.js b/tooltip.js deleted file mode 100644 index 11288287c..000000000 --- a/tooltip.js +++ /dev/null @@ -1,39 +0,0 @@ -(function() { - var DropTooltip, Tooltip, defaults; - - DropTooltip = Drop.createContext(); - - defaults = { - attach: 'top center' - }; - - Tooltip = (function() { - function Tooltip(options) { - this.options = options; - this.$target = $(this.options.el); - this.createDrop(); - } - - Tooltip.prototype.createDrop = function() { - var _ref; - if (this.options.attach == null) { - this.options.attach = defaults.attach; - } - return this.dropTooltip = new DropTooltip({ - target: this.$target[0], - className: 'drop-tooltip-theme-arrows', - attach: this.options.attach, - constrainToWindow: true, - constrainToScrollParent: false, - openOn: 'hover', - content: (_ref = this.options.content) != null ? _ref : this.$target.attr('data-tooltip-content') - }); - }; - - return Tooltip; - - })(); - - window.Tooltip = Tooltip; - -}).call(this); diff --git a/utils.coffee b/utils.coffee deleted file mode 100644 index 2983a9cca..000000000 --- a/utils.coffee +++ /dev/null @@ -1,112 +0,0 @@ -window.Tether ?= {} - -getScrollParent = (el) -> - position = getComputedStyle(el).position - - if position is 'fixed' - return el - - scrollParent = undefined - - parent = el - while parent = parent.parentNode - unless style = getComputedStyle parent - return parent - - if /(auto|scroll)/.test(style['overflow'] + style['overflow-y'] + style['overflow-x']) - if position isnt 'absolute' or style['position'] in ['relative', 'absolute', 'fixed'] - return parent - - return document.body - -getBounds = (el) -> - doc = el.ownerDocument - docEl = doc.documentElement - - box = extend {}, el.getBoundingClientRect() - - box.top = box.top + window.pageYOffset - docEl.clientTop - box.left = box.left + window.pageXOffset - docEl.clientLeft - box.right = doc.body.clientWidth - box.width - box.left - box.bottom = doc.body.clientHeight - box.height - box.top - - if not box.height or not box.width - # When the element is hidden it doesn't have a bounding - # rect, but we still need it's size to know if it should still - # be invisible in the next frame. - - style = getComputedStyle el - - box.height or= parseFloat style.height - box.width or= parseFloat style.width - - box - -getOffsetParent = (el) -> - el.offsetParent or document.documentElement - -extend = (out={}) -> - args = [] - Array::push.apply(args, arguments) - - for obj in args[1..] when obj - for own key, val of obj - out[key] = val - - out - -removeClass = (el, name) -> - if el.classList? - el.classList.remove(cls) for cls in name.split(' ') - else - el.className = el.className.replace new RegExp("(^| )#{ name.split(' ').join('|') }( |$)", 'gi'), ' ' - -addClass = (el, name) -> - if el.classList? - el.classList.add(cls) for cls in name.split(' ') - else - removeClass el, name - el.className += " #{ name }" - -hasClass = (el, name) -> - if el.classList? - el.classList.contains(name) - else - new RegExp("(^| )#{ name }( |$)", 'gi').test(el.className) - -class Evented - on: (event, handler, ctx, once=false) -> - @bindings ?= {} - @bindings[event] ?= [] - @bindings[event].push {handler, ctx, once} - - once: (event, handler, ctx) -> - @on(event, handler, ctx, true) - - off: (event, handler) -> - return unless @bindings?[event]? - - if not handler? - delete @bindings[event] - else - i = 0 - while i < @bindings[event].length - if @bindings[event][i].handler is handler - @bindings[event].splice i, 1 - else - i++ - - trigger: (event, args...) -> - if @bindings?[event] - i = 0 - while i < @bindings[event].length - {handler, ctx, once} = @bindings[event][i] - - handler.apply(ctx ? @, args) - - if once - @bindings[event].splice i, 1 - else - i++ - -Tether.Utils = {getScrollParent, getBounds, getOffsetParent, extend, addClass, removeClass, hasClass, Evented} From d2f4b4681e9acdfe26e2c0835113881ebd0a48d1 Mon Sep 17 00:00:00 2001 From: Zack Bloom Date: Tue, 25 Mar 2014 14:48:12 -0400 Subject: [PATCH 05/40] Rebuild docs --- advanced/embedding_tether/index.html | 2 +- advanced/extending_tether/index.html | 2 +- docs/intro.html | 47 +++--- docs/welcome/css/welcome.css | 2 + docs/welcome/index.html | 5 +- docs/welcome/js/jquery.js | 2 +- docs/welcome/sass/welcome.sass | 3 + examples/content-visible/index.html | 4 +- examples/dolls/index.html | 2 +- examples/element-scroll/index.html | 6 +- examples/enable-disable/index.html | 4 +- examples/list_of_examples/index.html | 2 +- examples/out-of-bounds/index.html | 4 +- examples/pin/index.html | 4 +- examples/simple/index.html | 4 +- examples/string-selector/index.html | 30 ---- examples/testbed/index.html | 2 +- examples/viewport/index.html | 4 +- gulpfile.coffee | 5 + index.html | 49 ++++--- js/abutment.js | 4 +- js/constraint.js | 21 ++- js/markAttachment.js | 2 +- js/shift.js | 2 +- js/tether.js | 39 +++-- js/utils.js | 53 ++++++- overview/repositioning/index.html | 2 +- overview/why_we_dont_support_ie_8/index.html | 4 +- overview/why_you_should_use_tether/index.html | 2 +- tether.js | 137 ++++++++++++++---- tether.min.js | 4 +- 31 files changed, 298 insertions(+), 155 deletions(-) delete mode 100644 examples/string-selector/index.html diff --git a/advanced/embedding_tether/index.html b/advanced/embedding_tether/index.html index 23463039c..9e8975cd2 100644 --- a/advanced/embedding_tether/index.html +++ b/advanced/embedding_tether/index.html @@ -29,7 +29,7 @@
    -
    - -
    - -
      - -
    • -
      -

      shift.coffee

      -
      -
    • - - - -
    • -
      - -
      - -
      - -
      - -
      Tether.modules.push
      -  position: ({top, left}) ->
      -    return unless @options.shift
      -
      -    result = (val) ->
      -      if typeof val is 'function'
      -        val.call @, {top, left}
      -      else
      -        val
      -
      -    shift = result @options.shift
      -
      -    if typeof shift is 'string'
      -      shift = shift.split(' ')
      -      shift[1] or= shift[0]
      -
      -      [shiftTop, shiftLeft] = shift
      -
      -      shiftTop = parseFloat shiftTop, 10
      -      shiftLeft = parseFloat shiftLeft, 10
      -    else
      -      [shiftTop, shiftLeft] = [shift.top, shift.left]
      -
      -    top += shiftTop
      -    left += shiftLeft
      -
      -    {top, left}
      - -
    • - -
    -

    Embedding Tether

    -

    Tether is designed to be embedable in other libraries.

    +

    Tether is designed to be embeddable in other libraries.

    There is one thing you should think about doing to create an embedded Tether:

    • Set the classPrefix of the tethers you create. That prefix will replace 'tether' in diff --git a/advanced/extending_tether/index.html b/advanced/extending_tether/index.html index 0c8c2abbc..65d6dd95e 100644 --- a/advanced/extending_tether/index.html +++ b/advanced/extending_tether/index.html @@ -46,7 +46,7 @@

      Position

      targetAttachment, // The targetAttachment, with 'auto' resolved to an actual attachment targetPos, // The coordinates of the target attachment, // The attachment, as passed in the option - elementPos, // The cooridinates of the element + elementPos, // The coordinates of the element offset, // The offset, after it's converted into pixels and the manual offset is added targetOffset, // The attachment is converted into an offset and is included in these values manualOffset, // The manual offset, in pixels diff --git a/docs/intro.html b/docs/intro.html index caf4e3d6c..7172eb02f 100644 --- a/docs/intro.html +++ b/docs/intro.html @@ -34,15 +34,15 @@

      Tether

      -

      Tether is a javascript library for efficiently making an absolutely positioned +

      Tether is a JavaScript library for efficiently making an absolutely positioned element stay next to another element on the page. For example, you might want a tooltip or dialog to open, and remain, next to the relevant item on the page.

      -

      Tether includes the ability to constrain the element within the viewport, it's +

      Tether includes the ability to constrain the element within the viewport, its scroll parent, any other element on the page, or a fixed bounding box. When it -exceedes those constraints it can be pinned to the edge, flip to the other -side of it's target, or hide itself.

      -

      Tether optimizes it's location placement to result in the minimum amount of +exceeds those constraints it can be pinned to the edge, flip to the other +side of its target, or hide itself.

      +

      Tether optimizes its location placement to result in the minimum amount of 'jankyness' as the page is scrolled and resized. The page can maintain 60fps scrolling even with dozens or hundreds of tethers on screen (pop open the devtools timeline as you scroll this page).

      @@ -176,7 +176,7 @@

      Offset

      Constraints

      If you have tried any of the previous examples, you'll notice that it's pretty easy to scroll the regions in such a way that the element is hanging out on -it's own, with no target in sight.

      +its own, with no target in sight.

      Constraints allow you to control what happens when the tethered element would have to fall outside of a defined region to maintain the attachment.

      new Tether({
      @@ -192,7 +192,7 @@ 

      Constraints

      ] });

      -

      We've created a constraint which will keep the element within it's scroll +

      We've created a constraint which will keep the element within its scroll parent by 'pinning' it to the edges if it tries to escape. For the sake of the example, we're also highlighting the pinned edge in red.

      Specify an array of sides if you'd only like to pin those edges:

      @@ -209,8 +209,8 @@

      Constraints

      ] });

      -

      You might want to allow the element to change it's attachment, if doing so -would keep more of it within it's assigned region:

      +

      You might want to allow the element to change its attachment, if doing so +would keep more of it within its assigned region:

      new Tether({
         element: yellowBox,
         target: greenBox,
      @@ -356,7 +356,7 @@ 

      Element Moving

      CSS as the page is scrolled or resized. To accomplish this it looks at the last few positions, finds commonalities, and uses them to decide whether to position the element absolutely or with fixed positioning.

      -

      If the element is fully contained within it's scroll parent, its DOM node +

      If the element is fully contained within its scroll parent, its DOM node can also be moved inside the scroll parent, to avoid repaints as the container is scrolled.

      new Tether({
      @@ -386,7 +386,7 @@ 

      Element Moving

      GPU

      By default tether positions elements using CSS transforms. These transforms allow the -tethered element to be moved as it's own layer to not force a repaint of the underlying +tethered element to be moved as its own layer to not force a repaint of the underlying page.

      This method of positioning can cause some issues however, including color shifts and artifacts.

      If you experience these issues, you can disable this optimization by setting optimizations.gpu @@ -455,20 +455,25 @@

      Classes

      You can change the prefix of the classes with the classPrefix option. It is 'tether' by default, but you could, for example, change it to be 'bill' if you were building the bill library and all the classes would be 'bill-*'.

      -
      new Tether
      -  classPrefix: 'bill'
      +
      new Tether({
      +  classPrefix: 'bill'
      +});

      The sass/css is similarily configurable, see tooltip for an example of how to make your own prefixed css file.

      All classes can be changed or disabled with the classes option. For example, to change the tether-element class to be my-box:

      -
      new Tether
      -  classes:
      -    element: 'my-box'
      +
      new Tether({
      +  classes: {
      +    element: 'my-box'
      +  }
      +});

      You can also disable classes you're not going to use:

      -
      new Tether
      -  classes:
      -    out-of-bounds: false
      +
      new Tether({
      +  classes: {
      +    out-of-bounds: false
      +  }
      +});
      • tether-element is added to the element
      • tether-target is added to the target
      • @@ -485,7 +490,7 @@

        Classes

        • tether-out-of-bounds, tether-out-of-bounds-[side] are added to both the element and the target -when the element is placed outside of it's constraint.
        • +when the element is placed outside of its constraint.
        • tether-pinned, tether-pinned-[side] are added to both the element and target when a constraint has pinned the element to the [side] of the container.
        @@ -496,7 +501,7 @@

        Browser Support

        a PR.

        Contributing

        Please contribute! Tether is developed in Coffeescript, but if that's problematic for you, feel free -to submit pull requests which just change the javascript files, we can adapt them as needed.

        +to submit pull requests which just change the JavaScript files, we can adapt them as needed.

        To build Tether, you need:

        • Node.js
        • diff --git a/docs/welcome/css/welcome.css b/docs/welcome/css/welcome.css index 7db9b3b5d..5dba90e8c 100644 --- a/docs/welcome/css/welcome.css +++ b/docs/welcome/css/welcome.css @@ -112,6 +112,8 @@ table.showcase { float: left; text-align: center; margin-bottom: 2rem; } + table.showcase.projects-showcase .showcase-inner .projects-list .project:nth-child(odd) { + clear: left; } table.showcase.projects-showcase .showcase-inner .projects-list .os-icon { width: 8rem; height: 8rem; diff --git a/docs/welcome/index.html b/docs/welcome/index.html index ee71a1035..f604763bb 100644 --- a/docs/welcome/index.html +++ b/docs/welcome/index.html @@ -3,8 +3,7 @@ Tether – Marrying elements for life - - + @@ -167,7 +166,7 @@

          Help us spread the word.

      -

      You might want to allow the element to change it's attachment, if doing so -would keep more of it within it's assigned region:

      +

      You might want to allow the element to change its attachment, if doing so +would keep more of it within its assigned region:

      new Tether({
         element: yellowBox,
         target: greenBox,
      @@ -356,7 +356,7 @@ 

      Element Moving

      CSS as the page is scrolled or resized. To accomplish this it looks at the last few positions, finds commonalities, and uses them to decide whether to position the element absolutely or with fixed positioning.

      -

      If the element is fully contained within it's scroll parent, its DOM node +

      If the element is fully contained within its scroll parent, its DOM node can also be moved inside the scroll parent, to avoid repaints as the container is scrolled.

      new Tether({
      @@ -386,7 +386,7 @@ 

      Element Moving

      GPU

      By default tether positions elements using CSS transforms. These transforms allow the -tethered element to be moved as it's own layer to not force a repaint of the underlying +tethered element to be moved as its own layer to not force a repaint of the underlying page.

      This method of positioning can cause some issues however, including color shifts and artifacts.

      If you experience these issues, you can disable this optimization by setting optimizations.gpu @@ -455,20 +455,25 @@

      Classes

      You can change the prefix of the classes with the classPrefix option. It is 'tether' by default, but you could, for example, change it to be 'bill' if you were building the bill library and all the classes would be 'bill-*'.

      -
      new Tether
      -  classPrefix: 'bill'
      +
      new Tether({
      +  classPrefix: 'bill'
      +});

      The sass/css is similarily configurable, see tooltip for an example of how to make your own prefixed css file.

      All classes can be changed or disabled with the classes option. For example, to change the tether-element class to be my-box:

      -
      new Tether
      -  classes:
      -    element: 'my-box'
      +
      new Tether({
      +  classes: {
      +    element: 'my-box'
      +  }
      +});

      You can also disable classes you're not going to use:

      -
      new Tether
      -  classes:
      -    out-of-bounds: false
      +
      new Tether({
      +  classes: {
      +    out-of-bounds: false
      +  }
      +});
      • tether-element is added to the element
      • tether-target is added to the target
      • @@ -485,7 +490,7 @@

        Classes

        • tether-out-of-bounds, tether-out-of-bounds-[side] are added to both the element and the target -when the element is placed outside of it's constraint.
        • +when the element is placed outside of its constraint.
        • tether-pinned, tether-pinned-[side] are added to both the element and target when a constraint has pinned the element to the [side] of the container.
        @@ -496,7 +501,7 @@

        Browser Support

        a PR.

        Contributing

        Please contribute! Tether is developed in Coffeescript, but if that's problematic for you, feel free -to submit pull requests which just change the javascript files, we can adapt them as needed.

        +to submit pull requests which just change the JavaScript files, we can adapt them as needed.

        To build Tether, you need:

        • Node.js
        • diff --git a/js/abutment.js b/js/abutment.js index 476b88e9d..b3acaa047 100644 --- a/js/abutment.js +++ b/js/abutment.js @@ -1,9 +1,9 @@ (function() { var defer, getBounds, updateClasses, _ref; - _ref = Tether.Utils, getBounds = _ref.getBounds, updateClasses = _ref.updateClasses, defer = _ref.defer; + _ref = this.Tether.Utils, getBounds = _ref.getBounds, updateClasses = _ref.updateClasses, defer = _ref.defer; - Tether.modules.push({ + this.Tether.modules.push({ position: function(_arg) { var abutted, addClasses, allClasses, bottom, height, left, right, side, sides, targetPos, top, width, _i, _j, _k, _l, _len, _len1, _len2, _len3, _ref1, _ref2, _ref3, _ref4, _ref5, _this = this; diff --git a/js/constraint.js b/js/constraint.js index 5feff43e1..69a2bde45 100644 --- a/js/constraint.js +++ b/js/constraint.js @@ -2,7 +2,7 @@ var BOUNDS_FORMAT, MIRROR_ATTACH, defer, extend, getBoundingRect, getBounds, getOuterSize, getSize, updateClasses, _ref, __indexOf = [].indexOf || function(item) { for (var i = 0, l = this.length; i < l; i++) { if (i in this && this[i] === item) return i; } return -1; }; - _ref = Tether.Utils, getOuterSize = _ref.getOuterSize, getBounds = _ref.getBounds, getSize = _ref.getSize, extend = _ref.extend, updateClasses = _ref.updateClasses, defer = _ref.defer; + _ref = this.Tether.Utils, getOuterSize = _ref.getOuterSize, getBounds = _ref.getBounds, getSize = _ref.getSize, extend = _ref.extend, updateClasses = _ref.updateClasses, defer = _ref.defer; MIRROR_ATTACH = { left: 'right', @@ -41,7 +41,7 @@ return to; }; - Tether.modules.push({ + this.Tether.modules.push({ position: function(_arg) { var addClasses, allClasses, attachment, bounds, changeAttachX, changeAttachY, cls, constraint, eAttachment, height, left, oob, oobClass, p, pin, pinned, pinnedClass, removeClass, side, tAttachment, targetAttachment, targetHeight, targetSize, targetWidth, to, top, width, _i, _j, _k, _l, _len, _len1, _len2, _len3, _len4, _len5, _m, _n, _ref1, _ref2, _ref3, _ref4, _ref5, _ref6, _ref7, _ref8, _this = this; @@ -144,6 +144,15 @@ eAttachment.top = 'top'; } } + if (tAttachment.top === 'middle') { + if (top + height > bounds[3] && eAttachment.top === 'top') { + top -= height; + eAttachment.top = 'bottom'; + } else if (top < bounds[1] && eAttachment.top === 'bottom') { + top += height; + eAttachment.top = 'top'; + } + } } if (changeAttachX === 'target' || changeAttachX === 'both') { if (left < bounds[0] && tAttachment.left === 'left') { @@ -180,6 +189,14 @@ left += width; eAttachment.left = 'left'; } + } else if (tAttachment.left === 'center') { + if (left + width > bounds[2] && eAttachment.left === 'left') { + left -= width; + eAttachment.left = 'right'; + } else if (left < bounds[0] && eAttachment.left === 'right') { + left += width; + eAttachment.left = 'left'; + } } } if (changeAttachY === 'element' || changeAttachY === 'both') { diff --git a/js/markAttachment.js b/js/markAttachment.js index 69524fe32..a6d8f80b5 100644 --- a/js/markAttachment.js +++ b/js/markAttachment.js @@ -1,5 +1,5 @@ (function() { - Tether.modules.push({ + this.Tether.modules.push({ initialize: function() { var dot, el, type, _i, _len, _ref, _results; this.markers = {}; diff --git a/js/shift.js b/js/shift.js index b19129941..58b935f6b 100644 --- a/js/shift.js +++ b/js/shift.js @@ -1,5 +1,5 @@ (function() { - Tether.modules.push({ + this.Tether.modules.push({ position: function(_arg) { var left, result, shift, shiftLeft, shiftTop, top, _ref; top = _arg.top, left = _arg.left; diff --git a/js/tether.js b/js/tether.js index e4fc3e5c5..92f64854a 100644 --- a/js/tether.js +++ b/js/tether.js @@ -1,13 +1,15 @@ (function() { - var MIRROR_LR, MIRROR_TB, OFFSET_MAP, addClass, addOffset, attachmentToOffset, autoToFixedAttachment, defer, extend, flush, getBounds, getOffsetParent, getOuterSize, getScrollParent, getSize, now, offsetToPx, parseAttachment, parseOffset, position, removeClass, tethers, transformKey, updateClasses, within, _Tether, _ref, + var MIRROR_LR, MIRROR_TB, OFFSET_MAP, Tether, addClass, addOffset, attachmentToOffset, autoToFixedAttachment, defer, extend, flush, getBounds, getOffsetParent, getOuterSize, getScrollBarSize, getScrollParent, getSize, now, offsetToPx, parseAttachment, parseOffset, position, removeClass, tethers, transformKey, updateClasses, within, _Tether, _ref, __slice = [].slice, __bind = function(fn, me){ return function(){ return fn.apply(me, arguments); }; }; - if (typeof Tether === "undefined" || Tether === null) { + if (this.Tether == null) { throw new Error("You must include the utils.js file before tether.js"); } - _ref = Tether.Utils, getScrollParent = _ref.getScrollParent, getSize = _ref.getSize, getOuterSize = _ref.getOuterSize, getBounds = _ref.getBounds, getOffsetParent = _ref.getOffsetParent, extend = _ref.extend, addClass = _ref.addClass, removeClass = _ref.removeClass, updateClasses = _ref.updateClasses, defer = _ref.defer, flush = _ref.flush; + Tether = this.Tether; + + _ref = Tether.Utils, getScrollParent = _ref.getScrollParent, getSize = _ref.getSize, getOuterSize = _ref.getOuterSize, getBounds = _ref.getBounds, getOffsetParent = _ref.getOffsetParent, extend = _ref.extend, addClass = _ref.addClass, removeClass = _ref.removeClass, updateClasses = _ref.updateClasses, defer = _ref.defer, flush = _ref.flush, getScrollBarSize = _ref.getScrollBarSize; within = function(a, b, diff) { if (diff == null) { @@ -429,7 +431,7 @@ }; _Tether.prototype.position = function(flushChanges) { - var elementPos, elementStyle, height, left, manualOffset, manualTargetOffset, module, next, offset, offsetBorder, offsetParent, offsetParentSize, offsetParentStyle, offsetPosition, ret, scrollLeft, scrollTop, side, targetAttachment, targetOffset, targetPos, targetSize, top, width, _i, _j, _len, _len1, _ref1, _ref2, _ref3, _ref4, + var elementPos, elementStyle, height, left, manualOffset, manualTargetOffset, module, next, offset, offsetBorder, offsetParent, offsetParentSize, offsetParentStyle, offsetPosition, ret, scrollLeft, scrollTop, scrollbarSize, side, targetAttachment, targetOffset, targetPos, targetSize, top, width, _i, _j, _len, _len1, _ref1, _ref2, _ref3, _ref4, _ref5, _ref6, _this = this; if (flushChanges == null) { flushChanges = true; @@ -482,7 +484,8 @@ offset: offset, targetOffset: targetOffset, manualOffset: manualOffset, - manualTargetOffset: manualTargetOffset + manualTargetOffset: manualTargetOffset, + scrollbarSize: scrollbarSize }); if ((ret == null) || typeof ret !== 'object') { continue; @@ -495,9 +498,7 @@ next = { page: { top: top, - bottom: document.body.scrollHeight - top - height, - left: left, - right: document.body.scrollWidth - left - width + left: left }, viewport: { top: top - pageYOffset, @@ -506,7 +507,19 @@ right: pageXOffset - left - width + innerWidth } }; - if (((_ref3 = this.options.optimizations) != null ? _ref3.moveElement : void 0) !== false && (this.targetModifier == null)) { + if (document.body.scrollWidth > window.innerWidth) { + scrollbarSize = this.cache('scrollbar-size', getScrollBarSize); + next.viewport.bottom -= scrollbarSize.height; + } + if (document.body.scrollHeight > window.innerHeight) { + scrollbarSize = this.cache('scrollbar-size', getScrollBarSize); + next.viewport.right -= scrollbarSize.width; + } + if (((_ref3 = document.body.style.position) !== '' && _ref3 !== 'static') || ((_ref4 = document.body.parentElement.style.position) !== '' && _ref4 !== 'static')) { + next.page.bottom = document.body.scrollHeight - top - height; + next.page.right = document.body.scrollWidth - left - width; + } + if (((_ref5 = this.options.optimizations) != null ? _ref5.moveElement : void 0) !== false && (this.targetModifier == null)) { offsetParent = this.cache('target-offsetparent', function() { return getOffsetParent(_this.target); }); @@ -517,9 +530,9 @@ elementStyle = getComputedStyle(this.element); offsetParentSize = offsetPosition; offsetBorder = {}; - _ref4 = ['Top', 'Left', 'Bottom', 'Right']; - for (_j = 0, _len1 = _ref4.length; _j < _len1; _j++) { - side = _ref4[_j]; + _ref6 = ['Top', 'Left', 'Bottom', 'Right']; + for (_j = 0, _len1 = _ref6.length; _j < _len1; _j++) { + side = _ref6[_j]; offsetBorder[side.toLowerCase()] = parseFloat(offsetParentStyle["border" + side + "Width"]); } offsetPosition.right = document.body.scrollWidth - offsetPosition.left - offsetParentSize.width + offsetBorder.right; @@ -668,6 +681,6 @@ Tether.position = position; - window.Tether = extend(_Tether, Tether); + this.Tether = extend(_Tether, Tether); }).call(this); diff --git a/js/utils.js b/js/utils.js index 0e245973c..b25510395 100644 --- a/js/utils.js +++ b/js/utils.js @@ -1,11 +1,13 @@ (function() { - var Evented, addClass, defer, deferred, extend, flush, getBounds, getOffsetParent, getOrigin, getScrollParent, hasClass, node, removeClass, uniqueId, updateClasses, zeroPosCache, + var Evented, addClass, defer, deferred, extend, flush, getBounds, getOffsetParent, getOrigin, getScrollBarSize, getScrollParent, hasClass, node, removeClass, uniqueId, updateClasses, zeroPosCache, __hasProp = {}.hasOwnProperty, __indexOf = [].indexOf || function(item) { for (var i = 0, l = this.length; i < l; i++) { if (i in this && this[i] === item) return i; } return -1; }, __slice = [].slice; - if (window.Tether == null) { - window.Tether = {}; + if (this.Tether == null) { + this.Tether = { + modules: [] + }; } getScrollParent = function(el) { @@ -108,6 +110,38 @@ return el.offsetParent || document.documentElement; }; + getScrollBarSize = function() { + var inner, outer, width, widthContained, widthScroll; + inner = document.createElement('div'); + inner.style.width = '100%'; + inner.style.height = '200px'; + outer = document.createElement('div'); + extend(outer.style, { + position: 'absolute', + top: 0, + left: 0, + pointerEvents: 'none', + visibility: 'hidden', + width: '200px', + height: '150px', + overflow: 'hidden' + }); + outer.appendChild(inner); + document.body.appendChild(outer); + widthContained = inner.offsetWidth; + outer.style.overflow = 'scroll'; + widthScroll = inner.offsetWidth; + if (widthContained === widthScroll) { + widthScroll = outer.clientWidth; + } + document.body.removeChild(outer); + width = widthContained - widthScroll; + return { + width: width, + height: width + }; + }; + extend = function(out) { var args, key, obj, val, _i, _len, _ref; if (out == null) { @@ -136,7 +170,9 @@ _results = []; for (_i = 0, _len = _ref.length; _i < _len; _i++) { cls = _ref[_i]; - _results.push(el.classList.remove(cls)); + if (cls.trim()) { + _results.push(el.classList.remove(cls)); + } } return _results; } else { @@ -151,7 +187,9 @@ _results = []; for (_i = 0, _len = _ref.length; _i < _len; _i++) { cls = _ref[_i]; - _results.push(el.classList.add(cls)); + if (cls.trim()) { + _results.push(el.classList.add(cls)); + } } return _results; } else { @@ -274,7 +312,7 @@ })(); - Tether.Utils = { + this.Tether.Utils = { getScrollParent: getScrollParent, getBounds: getBounds, getOffsetParent: getOffsetParent, @@ -286,7 +324,8 @@ defer: defer, flush: flush, uniqueId: uniqueId, - Evented: Evented + Evented: Evented, + getScrollBarSize: getScrollBarSize }; }).call(this); diff --git a/overview/repositioning/index.html b/overview/repositioning/index.html index 7cd344372..d0c3c22aa 100644 --- a/overview/repositioning/index.html +++ b/overview/repositioning/index.html @@ -30,7 +30,7 @@

    Repositioning

    Tethers will be automatically repositioned when the page is resized, and when any element containing the Tether is scrolled. -If the element moves for some other reason (e.g. with javascript), Tether won't know to reposition the element.

    +If the element moves for some other reason (e.g. with JavaScript), Tether won't know to reposition the element.

    Manually Repositioning

    The simplest way to reposition every Tether on the page is to call Tether.position(). It will efficiently reposition every Tether in a single repaint, making it more efficient than manually repositioning many Tethers individually.

    diff --git a/overview/why_we_dont_support_ie_8/index.html b/overview/why_we_dont_support_ie_8/index.html index 844128fdd..d88644d43 100644 --- a/overview/why_we_dont_support_ie_8/index.html +++ b/overview/why_we_dont_support_ie_8/index.html @@ -31,7 +31,7 @@

    Why we don't support IE 8

    We've been living in 2007 for a while now, pretending that new browser features don't exist because they aren't in IE8. You might not even know about some of these features, -or think they are only enabled by jQuery or underscore, simply because it hasen't +or think they are only enabled by jQuery or underscore, simply because it hasn't been an option to rely upon them.

    Here is the list of features you don't have if you choose to support IE 8:

      @@ -49,7 +49,7 @@
    • addEventListener
    • Object.create, .seal, .freeze, .defineProperty
    • Array.isArray, .indexOf, .every, .some, .forEach, .map, .filter, .reduce
    • -
    • A modern javascript engine
    • +
    • A modern JavaScript engine
    • A real developer tools
    • A consistent box model
    • jQuery 2
    • diff --git a/overview/why_you_should_use_tether/index.html b/overview/why_you_should_use_tether/index.html index 0bd0ae89b..836a63223 100644 --- a/overview/why_you_should_use_tether/index.html +++ b/overview/why_you_should_use_tether/index.html @@ -31,7 +31,7 @@

      Why You Should Use Tether

      Virtually every app includes some sort of overlay attached to an element on the page. Things like tooltips, -dropdowns, hover-activiated info boxes, etc.

      +dropdowns, hover-activated info boxes, etc.

      Those elements need to be attached to something on the page. Actually placing them next to the element in the DOM causes problems though, if any parent element is anything but overflow: visible, the element gets cut off. So you need absolute positioning diff --git a/tether.js b/tether.js index 1fcab2435..d5d026151 100644 --- a/tether.js +++ b/tether.js @@ -1,12 +1,26 @@ -/*! tether 0.5.2 */ +/*! tether 0.6.5 */ + + +(function(root, factory) { + if (typeof define === 'function' && define.amd) { + define(factory); + } else if (typeof exports === 'object') { + module.exports = factory(require,exports,module); + } else { + root.Tether = factory(); + } +}(this, function(require,exports,module) { + (function() { - var Evented, addClass, defer, deferred, extend, flush, getBounds, getOffsetParent, getOrigin, getScrollParent, hasClass, node, removeClass, uniqueId, updateClasses, zeroPosCache, + var Evented, addClass, defer, deferred, extend, flush, getBounds, getOffsetParent, getOrigin, getScrollBarSize, getScrollParent, hasClass, node, removeClass, uniqueId, updateClasses, zeroPosCache, __hasProp = {}.hasOwnProperty, __indexOf = [].indexOf || function(item) { for (var i = 0, l = this.length; i < l; i++) { if (i in this && this[i] === item) return i; } return -1; }, __slice = [].slice; - if (window.Tether == null) { - window.Tether = {}; + if (this.Tether == null) { + this.Tether = { + modules: [] + }; } getScrollParent = function(el) { @@ -109,6 +123,38 @@ return el.offsetParent || document.documentElement; }; + getScrollBarSize = function() { + var inner, outer, width, widthContained, widthScroll; + inner = document.createElement('div'); + inner.style.width = '100%'; + inner.style.height = '200px'; + outer = document.createElement('div'); + extend(outer.style, { + position: 'absolute', + top: 0, + left: 0, + pointerEvents: 'none', + visibility: 'hidden', + width: '200px', + height: '150px', + overflow: 'hidden' + }); + outer.appendChild(inner); + document.body.appendChild(outer); + widthContained = inner.offsetWidth; + outer.style.overflow = 'scroll'; + widthScroll = inner.offsetWidth; + if (widthContained === widthScroll) { + widthScroll = outer.clientWidth; + } + document.body.removeChild(outer); + width = widthContained - widthScroll; + return { + width: width, + height: width + }; + }; + extend = function(out) { var args, key, obj, val, _i, _len, _ref; if (out == null) { @@ -137,7 +183,9 @@ _results = []; for (_i = 0, _len = _ref.length; _i < _len; _i++) { cls = _ref[_i]; - _results.push(el.classList.remove(cls)); + if (cls.trim()) { + _results.push(el.classList.remove(cls)); + } } return _results; } else { @@ -152,7 +200,9 @@ _results = []; for (_i = 0, _len = _ref.length; _i < _len; _i++) { cls = _ref[_i]; - _results.push(el.classList.add(cls)); + if (cls.trim()) { + _results.push(el.classList.add(cls)); + } } return _results; } else { @@ -275,7 +325,7 @@ })(); - Tether.Utils = { + this.Tether.Utils = { getScrollParent: getScrollParent, getBounds: getBounds, getOffsetParent: getOffsetParent, @@ -287,21 +337,24 @@ defer: defer, flush: flush, uniqueId: uniqueId, - Evented: Evented + Evented: Evented, + getScrollBarSize: getScrollBarSize }; }).call(this); (function() { - var MIRROR_LR, MIRROR_TB, OFFSET_MAP, addClass, addOffset, attachmentToOffset, autoToFixedAttachment, defer, extend, flush, getBounds, getOffsetParent, getOuterSize, getScrollParent, getSize, now, offsetToPx, parseAttachment, parseOffset, position, removeClass, tethers, transformKey, updateClasses, within, _Tether, _ref, + var MIRROR_LR, MIRROR_TB, OFFSET_MAP, Tether, addClass, addOffset, attachmentToOffset, autoToFixedAttachment, defer, extend, flush, getBounds, getOffsetParent, getOuterSize, getScrollBarSize, getScrollParent, getSize, now, offsetToPx, parseAttachment, parseOffset, position, removeClass, tethers, transformKey, updateClasses, within, _Tether, _ref, __slice = [].slice, __bind = function(fn, me){ return function(){ return fn.apply(me, arguments); }; }; - if (typeof Tether === "undefined" || Tether === null) { + if (this.Tether == null) { throw new Error("You must include the utils.js file before tether.js"); } - _ref = Tether.Utils, getScrollParent = _ref.getScrollParent, getSize = _ref.getSize, getOuterSize = _ref.getOuterSize, getBounds = _ref.getBounds, getOffsetParent = _ref.getOffsetParent, extend = _ref.extend, addClass = _ref.addClass, removeClass = _ref.removeClass, updateClasses = _ref.updateClasses, defer = _ref.defer, flush = _ref.flush; + Tether = this.Tether; + + _ref = Tether.Utils, getScrollParent = _ref.getScrollParent, getSize = _ref.getSize, getOuterSize = _ref.getOuterSize, getBounds = _ref.getBounds, getOffsetParent = _ref.getOffsetParent, extend = _ref.extend, addClass = _ref.addClass, removeClass = _ref.removeClass, updateClasses = _ref.updateClasses, defer = _ref.defer, flush = _ref.flush, getScrollBarSize = _ref.getScrollBarSize; within = function(a, b, diff) { if (diff == null) { @@ -723,7 +776,7 @@ }; _Tether.prototype.position = function(flushChanges) { - var elementPos, elementStyle, height, left, manualOffset, manualTargetOffset, module, next, offset, offsetBorder, offsetParent, offsetParentSize, offsetParentStyle, offsetPosition, ret, scrollLeft, scrollTop, side, targetAttachment, targetOffset, targetPos, targetSize, top, width, _i, _j, _len, _len1, _ref1, _ref2, _ref3, _ref4, + var elementPos, elementStyle, height, left, manualOffset, manualTargetOffset, module, next, offset, offsetBorder, offsetParent, offsetParentSize, offsetParentStyle, offsetPosition, ret, scrollLeft, scrollTop, scrollbarSize, side, targetAttachment, targetOffset, targetPos, targetSize, top, width, _i, _j, _len, _len1, _ref1, _ref2, _ref3, _ref4, _ref5, _ref6, _this = this; if (flushChanges == null) { flushChanges = true; @@ -776,7 +829,8 @@ offset: offset, targetOffset: targetOffset, manualOffset: manualOffset, - manualTargetOffset: manualTargetOffset + manualTargetOffset: manualTargetOffset, + scrollbarSize: scrollbarSize }); if ((ret == null) || typeof ret !== 'object') { continue; @@ -789,9 +843,7 @@ next = { page: { top: top, - bottom: document.body.scrollHeight - top - height, - left: left, - right: document.body.scrollWidth - left - width + left: left }, viewport: { top: top - pageYOffset, @@ -800,7 +852,19 @@ right: pageXOffset - left - width + innerWidth } }; - if (((_ref3 = this.options.optimizations) != null ? _ref3.moveElement : void 0) !== false && (this.targetModifier == null)) { + if (document.body.scrollWidth > window.innerWidth) { + scrollbarSize = this.cache('scrollbar-size', getScrollBarSize); + next.viewport.bottom -= scrollbarSize.height; + } + if (document.body.scrollHeight > window.innerHeight) { + scrollbarSize = this.cache('scrollbar-size', getScrollBarSize); + next.viewport.right -= scrollbarSize.width; + } + if (((_ref3 = document.body.style.position) !== '' && _ref3 !== 'static') || ((_ref4 = document.body.parentElement.style.position) !== '' && _ref4 !== 'static')) { + next.page.bottom = document.body.scrollHeight - top - height; + next.page.right = document.body.scrollWidth - left - width; + } + if (((_ref5 = this.options.optimizations) != null ? _ref5.moveElement : void 0) !== false && (this.targetModifier == null)) { offsetParent = this.cache('target-offsetparent', function() { return getOffsetParent(_this.target); }); @@ -811,9 +875,9 @@ elementStyle = getComputedStyle(this.element); offsetParentSize = offsetPosition; offsetBorder = {}; - _ref4 = ['Top', 'Left', 'Bottom', 'Right']; - for (_j = 0, _len1 = _ref4.length; _j < _len1; _j++) { - side = _ref4[_j]; + _ref6 = ['Top', 'Left', 'Bottom', 'Right']; + for (_j = 0, _len1 = _ref6.length; _j < _len1; _j++) { + side = _ref6[_j]; offsetBorder[side.toLowerCase()] = parseFloat(offsetParentStyle["border" + side + "Width"]); } offsetPosition.right = document.body.scrollWidth - offsetPosition.left - offsetParentSize.width + offsetBorder.right; @@ -962,7 +1026,7 @@ Tether.position = position; - window.Tether = extend(_Tether, Tether); + this.Tether = extend(_Tether, Tether); }).call(this); @@ -970,7 +1034,7 @@ var BOUNDS_FORMAT, MIRROR_ATTACH, defer, extend, getBoundingRect, getBounds, getOuterSize, getSize, updateClasses, _ref, __indexOf = [].indexOf || function(item) { for (var i = 0, l = this.length; i < l; i++) { if (i in this && this[i] === item) return i; } return -1; }; - _ref = Tether.Utils, getOuterSize = _ref.getOuterSize, getBounds = _ref.getBounds, getSize = _ref.getSize, extend = _ref.extend, updateClasses = _ref.updateClasses, defer = _ref.defer; + _ref = this.Tether.Utils, getOuterSize = _ref.getOuterSize, getBounds = _ref.getBounds, getSize = _ref.getSize, extend = _ref.extend, updateClasses = _ref.updateClasses, defer = _ref.defer; MIRROR_ATTACH = { left: 'right', @@ -1009,7 +1073,7 @@ return to; }; - Tether.modules.push({ + this.Tether.modules.push({ position: function(_arg) { var addClasses, allClasses, attachment, bounds, changeAttachX, changeAttachY, cls, constraint, eAttachment, height, left, oob, oobClass, p, pin, pinned, pinnedClass, removeClass, side, tAttachment, targetAttachment, targetHeight, targetSize, targetWidth, to, top, width, _i, _j, _k, _l, _len, _len1, _len2, _len3, _len4, _len5, _m, _n, _ref1, _ref2, _ref3, _ref4, _ref5, _ref6, _ref7, _ref8, _this = this; @@ -1112,6 +1176,15 @@ eAttachment.top = 'top'; } } + if (tAttachment.top === 'middle') { + if (top + height > bounds[3] && eAttachment.top === 'top') { + top -= height; + eAttachment.top = 'bottom'; + } else if (top < bounds[1] && eAttachment.top === 'bottom') { + top += height; + eAttachment.top = 'top'; + } + } } if (changeAttachX === 'target' || changeAttachX === 'both') { if (left < bounds[0] && tAttachment.left === 'left') { @@ -1148,6 +1221,14 @@ left += width; eAttachment.left = 'left'; } + } else if (tAttachment.left === 'center') { + if (left + width > bounds[2] && eAttachment.left === 'left') { + left -= width; + eAttachment.left = 'right'; + } else if (left < bounds[0] && eAttachment.left === 'right') { + left += width; + eAttachment.left = 'left'; + } } } if (changeAttachY === 'element' || changeAttachY === 'both') { @@ -1261,9 +1342,9 @@ (function() { var defer, getBounds, updateClasses, _ref; - _ref = Tether.Utils, getBounds = _ref.getBounds, updateClasses = _ref.updateClasses, defer = _ref.defer; + _ref = this.Tether.Utils, getBounds = _ref.getBounds, updateClasses = _ref.updateClasses, defer = _ref.defer; - Tether.modules.push({ + this.Tether.modules.push({ position: function(_arg) { var abutted, addClasses, allClasses, bottom, height, left, right, side, sides, targetPos, top, width, _i, _j, _k, _l, _len, _len1, _len2, _len3, _ref1, _ref2, _ref3, _ref4, _ref5, _this = this; @@ -1319,7 +1400,7 @@ }).call(this); (function() { - Tether.modules.push({ + this.Tether.modules.push({ position: function(_arg) { var left, result, shift, shiftLeft, shiftTop, top, _ref; top = _arg.top, left = _arg.left; @@ -1356,3 +1437,7 @@ }); }).call(this); + +return this.Tether; + +})); diff --git a/tether.min.js b/tether.min.js index 310f9db07..065085e24 100644 --- a/tether.min.js +++ b/tether.min.js @@ -1,2 +1,2 @@ -/*! tether 0.5.2 */ -(function(){var t,e,o,i,n,s,l,r,h,a,f,p,u,d,g,c,m={}.hasOwnProperty,b=[].indexOf||function(t){for(var e=0,o=this.length;o>e;e++)if(e in this&&this[e]===t)return e;return-1},v=[].slice;null==window.Tether&&(window.Tether={}),a=function(t){var e,o,i,n,s;if(o=getComputedStyle(t).position,"fixed"===o)return t;for(i=void 0,e=t;e=e.parentNode;){try{n=getComputedStyle(e)}catch(l){}if(null==n)return e;if(/(auto|scroll)/.test(n.overflow+n["overflow-y"]+n["overflow-x"])&&("absolute"!==o||"relative"===(s=n.position)||"absolute"===s||"fixed"===s))return e}return document.body},d=function(){var t;return t=0,function(){return t++}}(),c={},h=function(t){var e,i,s,l,r;if(s=t._tetherZeroElement,null==s&&(s=t.createElement("div"),s.setAttribute("data-tether-id",d()),n(s.style,{top:0,left:0,position:"absolute"}),t.body.appendChild(s),t._tetherZeroElement=s),e=s.getAttribute("data-tether-id"),null==c[e]){c[e]={},r=s.getBoundingClientRect();for(i in r)l=r[i],c[e][i]=l;o(function(){return c[e]=void 0})}return c[e]},p=null,l=function(t){var e,o,i,n,s,l,r;t===document?(o=document,t=document.documentElement):o=t.ownerDocument,i=o.documentElement,e={},r=t.getBoundingClientRect();for(n in r)l=r[n],e[n]=l;return s=h(o),e.top-=s.top,e.left-=s.left,null==e.width&&(e.width=document.body.scrollWidth-e.left-e.right),null==e.height&&(e.height=document.body.scrollHeight-e.top-e.bottom),e.top=e.top-i.clientTop,e.left=e.left-i.clientLeft,e.right=o.body.clientWidth-e.width-e.left,e.bottom=o.body.clientHeight-e.height-e.top,e},r=function(t){return t.offsetParent||document.documentElement},n=function(t){var e,o,i,n,s,l,r;for(null==t&&(t={}),e=[],Array.prototype.push.apply(e,arguments),r=e.slice(1),s=0,l=r.length;l>s;s++)if(i=r[s])for(o in i)m.call(i,o)&&(n=i[o],t[o]=n);return t},u=function(t,e){var o,i,n,s,l;if(null!=t.classList){for(s=e.split(" "),l=[],i=0,n=s.length;n>i;i++)o=s[i],l.push(t.classList.remove(o));return l}return t.className=t.className.replace(new RegExp("(^| )"+e.split(" ").join("|")+"( |$)","gi")," ")},e=function(t,e){var o,i,n,s,l;if(null!=t.classList){for(s=e.split(" "),l=[],i=0,n=s.length;n>i;i++)o=s[i],l.push(t.classList.add(o));return l}return u(t,e),t.className+=" "+e},f=function(t,e){return null!=t.classList?t.classList.contains(e):new RegExp("(^| )"+e+"( |$)","gi").test(t.className)},g=function(t,o,i){var n,s,l,r,h,a;for(s=0,r=i.length;r>s;s++)n=i[s],b.call(o,n)<0&&f(t,n)&&u(t,n);for(a=[],l=0,h=o.length;h>l;l++)n=o[l],f(t,n)?a.push(void 0):a.push(e(t,n));return a},i=[],o=function(t){return i.push(t)},s=function(){var t,e;for(e=[];t=i.pop();)e.push(t());return e},t=function(){function t(){}return t.prototype.on=function(t,e,o,i){var n;return null==i&&(i=!1),null==this.bindings&&(this.bindings={}),null==(n=this.bindings)[t]&&(n[t]=[]),this.bindings[t].push({handler:e,ctx:o,once:i})},t.prototype.once=function(t,e,o){return this.on(t,e,o,!0)},t.prototype.off=function(t,e){var o,i,n;if(null!=(null!=(i=this.bindings)?i[t]:void 0)){if(null==e)return delete this.bindings[t];for(o=0,n=[];o=e&&e>=t-o},O=function(){var t,e,o,i,n;for(t=document.createElement("div"),n=["transform","webkitTransform","OTransform","MozTransform","msTransform"],o=0,i=n.length;i>o;o++)if(e=n[o],void 0!==t.style[e])return e}(),C=[],y=function(){var t,e,o;for(e=0,o=C.length;o>e;e++)t=C[e],t.position(!1);return a()},c=function(){var t;return null!=(t="undefined"!=typeof performance&&null!==performance?"function"==typeof performance.now?performance.now():void 0:void 0)?t:+new Date},function(){var t,e,o,i,n,s,l,r,h;for(e=null,o=null,i=null,n=function(){if(null!=o&&o>16)return o=Math.min(o-16,250),i=setTimeout(n,250),void 0;if(!(null!=e&&c()-e<10))return null!=i&&(clearTimeout(i),i=null),e=c(),y(),o=c()-e},r=["resize","scroll","touchmove"],h=[],s=0,l=r.length;l>s;s++)t=r[s],h.push(window.addEventListener(t,n));return h}(),t={center:"center",left:"right",right:"left"},e={middle:"middle",top:"bottom",bottom:"top"},o={top:0,left:0,middle:"50%",center:"50%",bottom:"100%",right:"100%"},l=function(o,i){var n,s;return n=o.left,s=o.top,"auto"===n&&(n=t[i.left]),"auto"===s&&(s=e[i.top]),{left:n,top:s}},s=function(t){var e,i;return{left:null!=(e=o[t.left])?e:t.left,top:null!=(i=o[t.top])?i:t.top}},n=function(){var t,e,o,i,n,s,l;for(e=1<=arguments.length?M.call(arguments,0):[],o={top:0,left:0},n=0,s=e.length;s>n;n++)l=e[n],i=l.top,t=l.left,"string"==typeof i&&(i=parseFloat(i,10)),"string"==typeof t&&(t=parseFloat(t,10)),o.top+=i,o.left+=t;return o},m=function(t,e){return"string"==typeof t.left&&-1!==t.left.indexOf("%")&&(t.left=parseFloat(t.left,10)/100*e.width),"string"==typeof t.top&&-1!==t.top.indexOf("%")&&(t.top=parseFloat(t.top,10)/100*e.height),t},b=v=function(t){var e,o,i;return i=t.split(" "),o=i[0],e=i[1],{top:o,left:e}},A=function(){function t(t){this.position=P(this.position,this);var e,o,i,n,s;for(C.push(this),this.history=[],this.setOptions(t,!1),n=Tether.modules,o=0,i=n.length;i>o;o++)e=n[o],null!=(s=e.initialize)&&s.call(this);this.position()}return t.modules=[],t.prototype.getClass=function(t){var e,o;return(null!=(e=this.options.classes)?e[t]:void 0)?this.options.classes[t]:(null!=(o=this.options.classes)?o[t]:void 0)!==!1?this.options.classPrefix?""+this.options.classPrefix+"-"+t:t:""},t.prototype.setOptions=function(t,e){var o,n,s,l,r,a;for(this.options=t,null==e&&(e=!0),o={offset:"0 0",targetOffset:"0 0",targetAttachment:"auto auto",classPrefix:"tether"},this.options=h(o,this.options),r=this.options,this.element=r.element,this.target=r.target,this.targetModifier=r.targetModifier,"viewport"===this.target?(this.target=document.body,this.targetModifier="visible"):"scroll-handle"===this.target&&(this.target=document.body,this.targetModifier="scroll-handle"),a=["element","target"],s=0,l=a.length;l>s;s++){if(n=a[s],null==this[n])throw new Error("Tether Error: Both element and target must be defined");null!=this[n].jquery?this[n]=this[n][0]:"string"==typeof this[n]&&(this[n]=document.querySelector(this[n]))}if(i(this.element,this.getClass("element")),i(this.target,this.getClass("target")),!this.options.attachment)throw new Error("Tether Error: You must provide an attachment");return this.targetAttachment=b(this.options.targetAttachment),this.attachment=b(this.options.attachment),this.offset=v(this.options.offset),this.targetOffset=v(this.options.targetOffset),null!=this.scrollParent&&this.disable(),this.scrollParent="scroll-handle"===this.targetModifier?this.target:d(this.target),this.options.enabled!==!1?this.enable(e):void 0},t.prototype.getTargetBounds=function(){var t,e,o,i,n,s,l,r,h;if(null==this.targetModifier)return f(this.target);switch(this.targetModifier){case"visible":return this.target===document.body?{top:pageYOffset,left:pageXOffset,height:innerHeight,width:innerWidth}:(t=f(this.target),n={height:t.height,width:t.width,top:t.top,left:t.left},n.height=Math.min(n.height,t.height-(pageYOffset-t.top)),n.height=Math.min(n.height,t.height-(t.top+t.height-(pageYOffset+innerHeight))),n.height=Math.min(innerHeight,n.height),n.height-=2,n.width=Math.min(n.width,t.width-(pageXOffset-t.left)),n.width=Math.min(n.width,t.width-(t.left+t.width-(pageXOffset+innerWidth))),n.width=Math.min(innerWidth,n.width),n.width-=2,n.toph.clientWidth||"scroll"===[r.overflow,r.overflowX]||this.target!==document.body,s=0,o&&(s=15),i=t.height-parseFloat(r.borderTopWidth)-parseFloat(r.borderBottomWidth)-s,n={width:15,height:.975*i*(i/h.scrollHeight),left:t.left+t.width-parseFloat(r.borderLeftWidth)-15},e=0,408>i&&this.target===document.body&&(e=-11e-5*Math.pow(i,2)-.00727*i+22.58),this.target!==document.body&&(n.height=Math.max(n.height,24)),l=this.target.scrollTop/(h.scrollHeight-i),n.top=l*(i-n.height-e)+t.top+parseFloat(r.borderTopWidth),this.target===document.body&&(n.height=Math.max(n.height,24)),n}},t.prototype.clearCache=function(){return this._cache={}},t.prototype.cache=function(t,e){return null==this._cache&&(this._cache={}),null==this._cache[t]&&(this._cache[t]=e.call(this)),this._cache[t]},t.prototype.enable=function(t){return null==t&&(t=!0),i(this.target,this.getClass("enabled")),i(this.element,this.getClass("enabled")),this.enabled=!0,this.scrollParent!==document&&this.scrollParent.addEventListener("scroll",this.position),t?this.position():void 0},t.prototype.disable=function(){return w(this.target,this.getClass("enabled")),w(this.element,this.getClass("enabled")),this.enabled=!1,null!=this.scrollParent?this.scrollParent.removeEventListener("scroll",this.position):void 0},t.prototype.destroy=function(){var t,e,o,i,n;for(this.disable(),n=[],t=o=0,i=C.length;i>o;t=++o){if(e=C[t],e===this){C.splice(t,1);break}n.push(void 0)}return n},t.prototype.updateAttachClasses=function(t,e){var o,i,n,s,l,h,a,f,p,u=this;for(null==t&&(t=this.attachment),null==e&&(e=this.targetAttachment),s=["left","top","bottom","right","middle","center"],(null!=(p=this._addAttachClasses)?p.length:void 0)&&this._addAttachClasses.splice(0,this._addAttachClasses.length),o=null!=this._addAttachClasses?this._addAttachClasses:this._addAttachClasses=[],t.top&&o.push(""+this.getClass("element-attached")+"-"+t.top),t.left&&o.push(""+this.getClass("element-attached")+"-"+t.left),e.top&&o.push(""+this.getClass("target-attached")+"-"+e.top),e.left&&o.push(""+this.getClass("target-attached")+"-"+e.left),i=[],l=0,a=s.length;a>l;l++)n=s[l],i.push(""+this.getClass("element-attached")+"-"+n);for(h=0,f=s.length;f>h;h++)n=s[h],i.push(""+this.getClass("target-attached")+"-"+n);return r(function(){return null!=u._addAttachClasses?(T(u.element,u._addAttachClasses,i),T(u.target,u._addAttachClasses,i),u._addAttachClasses=void 0):void 0})},t.prototype.position=function(t){var e,o,i,r,h,u,d,g,c,b,v,y,w,C,O,T,x,A,E,M,P,W,S,_,B,F,L,z,Y,H,X,N,j=this;if(null==t&&(t=!0),this.enabled){for(this.clearCache(),E=l(this.targetAttachment,this.attachment),this.updateAttachClasses(this.attachment,E),e=this.cache("element-bounds",function(){return f(j.element)}),_=e.width,i=e.height,0===_&&0===i&&null!=this.lastSize?(Y=this.lastSize,_=Y.width,i=Y.height):this.lastSize={width:_,height:i},W=P=this.cache("target-bounds",function(){return j.getTargetBounds()}),c=m(s(this.attachment),{width:_,height:i}),M=m(s(E),W),h=m(this.offset,{width:_,height:i}),u=m(this.targetOffset,W),c=n(c,h),M=n(M,u),r=P.left+M.left-c.left,S=P.top+M.top-c.top,H=Tether.modules,B=0,L=H.length;L>B;B++)if(d=H[B],O=d.position.call(this,{left:r,top:S,targetAttachment:E,targetPos:P,attachment:this.attachment,elementPos:e,offset:c,targetOffset:M,manualOffset:h,manualTargetOffset:u}),null!=O&&"object"==typeof O){if(O===!1)return!1;S=O.top,r=O.left}if(g={page:{top:S,bottom:document.body.scrollHeight-S-i,left:r,right:document.body.scrollWidth-r-_},viewport:{top:S-pageYOffset,bottom:pageYOffset-S-i+innerHeight,left:r-pageXOffset,right:pageXOffset-r-_+innerWidth}},(null!=(X=this.options.optimizations)?X.moveElement:void 0)!==!1&&null==this.targetModifier){for(v=this.cache("target-offsetparent",function(){return p(j.target)}),C=this.cache("target-offsetparent-bounds",function(){return f(v)}),w=getComputedStyle(v),o=getComputedStyle(this.element),y=C,b={},N=["Top","Left","Bottom","Right"],F=0,z=N.length;z>F;F++)A=N[F],b[A.toLowerCase()]=parseFloat(w["border"+A+"Width"]);C.right=document.body.scrollWidth-C.left-y.width+b.right,C.bottom=document.body.scrollHeight-C.top-y.height+b.bottom,g.page.top>=C.top+b.top&&g.page.bottom>=C.bottom&&g.page.left>=C.left+b.left&&g.page.right>=C.right&&(x=v.scrollTop,T=v.scrollLeft,g.offset={top:g.page.top-C.top+x-b.top,left:g.page.left-C.left+T-b.left})}return this.move(g),this.history.unshift(g),this.history.length>3&&this.history.pop(),t&&a(),!0}},t.prototype.move=function(t){var e,o,i,n,s,l,a,f,u,d,g,c,m,b,v,y,w,C=this;if(null!=this.element.parentNode){f={};for(d in t){f[d]={};for(n in t[d]){for(i=!1,y=this.history,b=0,v=y.length;v>b;b++)if(a=y[b],!x(null!=(w=a[d])?w[n]:void 0,t[d][n])){i=!0;break}i||(f[d][n]=!0)}}e={top:"",left:"",right:"",bottom:""},u=function(t,o){var i,n,s;return(null!=(s=C.options.optimizations)?s.gpu:void 0)===!1?(t.top?e.top=""+o.top+"px":e.bottom=""+o.bottom+"px",t.left?e.left=""+o.left+"px":e.right=""+o.right+"px"):(t.top?(e.top=0,n=o.top):(e.bottom=0,n=-o.bottom),t.left?(e.left=0,i=o.left):(e.right=0,i=-o.right),e[O]="translateX("+Math.round(i)+"px) translateY("+Math.round(n)+"px)","msTransform"!==O?e[O]+=" translateZ(0)":void 0)},s=!1,(f.page.top||f.page.bottom)&&(f.page.left||f.page.right)?(e.position="absolute",u(f.page,t.page)):(f.viewport.top||f.viewport.bottom)&&(f.viewport.left||f.viewport.right)?(e.position="fixed",u(f.viewport,t.viewport)):null!=f.offset&&f.offset.top&&f.offset.left?(e.position="absolute",l=this.cache("target-offsetparent",function(){return p(C.target)}),p(this.element)!==l&&r(function(){return C.element.parentNode.removeChild(C.element),l.appendChild(C.element)}),u(f.offset,t.offset),s=!0):(e.position="absolute",u({top:!0,left:!0},t.page)),s||"BODY"===this.element.parentNode.tagName||(this.element.parentNode.removeChild(this.element),document.body.appendChild(this.element)),m={},c=!1;for(n in e)g=e[n],o=this.element.style[n],""===o||""===g||"top"!==n&&"left"!==n&&"bottom"!==n&&"right"!==n||(o=parseFloat(o),g=parseFloat(g)),o!==g&&(c=!0,m[n]=e[n]);return c?r(function(){return h(C.element.style,m)}):void 0}},t}(),Tether.position=y,window.Tether=h(A,Tether)}.call(this),function(){var t,e,o,i,n,s,l,r,h,a,f=[].indexOf||function(t){for(var e=0,o=this.length;o>e;e++)if(e in this&&this[e]===t)return e;return-1};a=Tether.Utils,l=a.getOuterSize,s=a.getBounds,r=a.getSize,i=a.extend,h=a.updateClasses,o=a.defer,e={left:"right",right:"left",top:"bottom",bottom:"top",middle:"middle"},t=["left","top","right","bottom"],n=function(e,o){var i,n,l,r,h,a,f;if("scrollParent"===o?o=e.scrollParent:"window"===o&&(o=[pageXOffset,pageYOffset,innerWidth+pageXOffset,innerHeight+pageYOffset]),o===document&&(o=o.documentElement),null!=o.nodeType)for(n=r=s(o),h=getComputedStyle(o),o=[n.left,n.top,r.width+n.left,r.height+n.top],i=a=0,f=t.length;f>a;i=++a)l=t[i],l=l[0].toUpperCase()+l.substr(1),"Top"===l||"Left"===l?o[i]+=parseFloat(h["border"+l+"Width"]):o[i]-=parseFloat(h["border"+l+"Width"]);return o},Tether.modules.push({position:function(e){var l,r,a,p,u,d,g,c,m,b,v,y,w,C,O,T,x,A,E,M,P,W,S,_,B,F,L,z,Y,H,X,N,j,R,U,k,q,D,Z,$,I,G,J,K,Q,V,te,ee=this;if(F=e.top,v=e.left,P=e.targetAttachment,!this.options.constraints)return!0;for(A=function(e){var o,i,n,s;for(ee.removeClass(e),s=[],i=0,n=t.length;n>i;i++)o=t[i],s.push(ee.removeClass(""+e+"-"+o));return s},$=this.cache("element-bounds",function(){return s(ee.element)}),b=$.height,L=$.width,0===L&&0===b&&null!=this.lastSize&&(I=this.lastSize,L=I.width,b=I.height),S=this.cache("target-bounds",function(){return ee.getTargetBounds()}),W=S.height,_=S.width,M={},m={},r=[this.getClass("pinned"),this.getClass("out-of-bounds")],G=this.options.constraints,z=0,N=G.length;N>z;z++)c=G[z],c.outOfBoundsClass&&r.push(c.outOfBoundsClass),c.pinnedClass&&r.push(c.pinnedClass);for(Y=0,j=r.length;j>Y;Y++)for(g=r[Y],J=["left","top","right","bottom"],H=0,R=J.length;R>H;H++)E=J[H],r.push(""+g+"-"+E);for(l=[],M=i({},P),m=i({},this.attachment),K=this.options.constraints,X=0,U=K.length;U>X;X++){if(c=K[X],B=c.to,a=c.attachment,O=c.pin,null==a&&(a=""),f.call(a," ")>=0?(Q=a.split(" "),d=Q[0],u=Q[1]):u=d=a,p=n(this,B),("target"===d||"both"===d)&&(Fp[3]&&"bottom"===M.top&&(F-=W,M.top="top")),"together"===d&&(Fp[3]&&"bottom"===M.top&&("top"===m.top?(F-=W,M.top="top",F-=b,m.top="bottom"):"bottom"===m.top&&(F-=W,M.top="top",F+=b,m.top="top"))),("target"===u||"both"===u)&&(vp[2]&&"right"===M.left&&(v-=_,M.left="left")),"together"===u&&(vp[2]&&"right"===M.left&&("left"===m.left?(v-=_,M.left="left",v-=L,m.left="right"):"right"===m.left&&(v-=_,M.left="left",v+=L,m.left="left"))),("element"===d||"both"===d)&&(Fp[3]&&"top"===m.top&&(F-=b,m.top="bottom")),("element"===u||"both"===u)&&(vp[2]&&"left"===m.left&&(v-=L,m.left="right")),"string"==typeof O?O=function(){var t,e,o,i;for(o=O.split(","),i=[],e=0,t=o.length;t>e;e++)C=o[e],i.push(C.trim());return i}():O===!0&&(O=["top","left","right","bottom"]),O||(O=[]),T=[],y=[],F=0?(F=p[1],T.push("top")):y.push("top")),F+b>p[3]&&(f.call(O,"bottom")>=0?(F=p[3]-b,T.push("bottom")):y.push("bottom")),v=0?(v=p[0],T.push("left")):y.push("left")),v+L>p[2]&&(f.call(O,"right")>=0?(v=p[2]-L,T.push("right")):y.push("right")),T.length)for(x=null!=(V=this.options.pinnedClass)?V:this.getClass("pinned"),l.push(x),D=0,k=T.length;k>D;D++)E=T[D],l.push(""+x+"-"+E);if(y.length)for(w=null!=(te=this.options.outOfBoundsClass)?te:this.getClass("out-of-bounds"),l.push(w),Z=0,q=y.length;q>Z;Z++)E=y[Z],l.push(""+w+"-"+E);(f.call(T,"left")>=0||f.call(T,"right")>=0)&&(m.left=M.left=!1),(f.call(T,"top")>=0||f.call(T,"bottom")>=0)&&(m.top=M.top=!1),(M.top!==P.top||M.left!==P.left||m.top!==this.attachment.top||m.left!==this.attachment.left)&&this.updateAttachClasses(m,M)}return o(function(){return h(ee.target,l,r),h(ee.element,l,r)}),{top:F,left:v}}})}.call(this),function(){var t,e,o,i;i=Tether.Utils,e=i.getBounds,o=i.updateClasses,t=i.defer,Tether.modules.push({position:function(i){var n,s,l,r,h,a,f,p,u,d,g,c,m,b,v,y,w,C,O,T,x,A,E,M,P,W=this;if(g=i.top,a=i.left,x=this.cache("element-bounds",function(){return e(W.element)}),h=x.height,c=x.width,d=this.getTargetBounds(),r=g+h,f=a+c,n=[],g<=d.bottom&&r>=d.top)for(A=["left","right"],m=0,w=A.length;w>m;m++)p=A[m],((E=d[p])===a||E===f)&&n.push(p);if(a<=d.right&&f>=d.left)for(M=["top","bottom"],b=0,C=M.length;C>b;b++)p=M[b],((P=d[p])===g||P===r)&&n.push(p);for(l=[],s=[],u=["left","top","right","bottom"],l.push(this.getClass("abutted")),v=0,O=u.length;O>v;v++)p=u[v],l.push(""+this.getClass("abutted")+"-"+p);for(n.length&&s.push(this.getClass("abutted")),y=0,T=n.length;T>y;y++)p=n[y],s.push(""+this.getClass("abutted")+"-"+p);return t(function(){return o(W.target,s,l),o(W.element,s,l)}),!0}})}.call(this),function(){Tether.modules.push({position:function(t){var e,o,i,n,s,l,r;return l=t.top,e=t.left,this.options.shift?(o=function(t){return"function"==typeof t?t.call(this,{top:l,left:e}):t},i=o(this.options.shift),"string"==typeof i?(i=i.split(" "),i[1]||(i[1]=i[0]),s=i[0],n=i[1],s=parseFloat(s,10),n=parseFloat(n,10)):(r=[i.top,i.left],s=r[0],n=r[1]),l+=s,e+=n,{top:l,left:e}):void 0}})}.call(this); \ No newline at end of file +/*! tether 0.6.5 */ +!function(t,e){"function"==typeof define&&define.amd?define(e):"object"==typeof exports?module.exports=e(require,exports,module):t.Tether=e()}(this,function(){return function(){var t,e,o,i,n,s,l,r,h,a,f,p,u,d,g,c,m,b={}.hasOwnProperty,v=[].indexOf||function(t){for(var e=0,o=this.length;o>e;e++)if(e in this&&this[e]===t)return e;return-1},y=[].slice;null==this.Tether&&(this.Tether={modules:[]}),f=function(t){var e,o,i,n,s;if(o=getComputedStyle(t).position,"fixed"===o)return t;for(i=void 0,e=t;e=e.parentNode;){try{n=getComputedStyle(e)}catch(l){}if(null==n)return e;if(/(auto|scroll)/.test(n.overflow+n["overflow-y"]+n["overflow-x"])&&("absolute"!==o||"relative"===(s=n.position)||"absolute"===s||"fixed"===s))return e}return document.body},g=function(){var t;return t=0,function(){return t++}}(),m={},h=function(t){var e,i,s,l,r;if(s=t._tetherZeroElement,null==s&&(s=t.createElement("div"),s.setAttribute("data-tether-id",g()),n(s.style,{top:0,left:0,position:"absolute"}),t.body.appendChild(s),t._tetherZeroElement=s),e=s.getAttribute("data-tether-id"),null==m[e]){m[e]={},r=s.getBoundingClientRect();for(i in r)l=r[i],m[e][i]=l;o(function(){return m[e]=void 0})}return m[e]},u=null,l=function(t){var e,o,i,n,s,l,r;t===document?(o=document,t=document.documentElement):o=t.ownerDocument,i=o.documentElement,e={},r=t.getBoundingClientRect();for(n in r)l=r[n],e[n]=l;return s=h(o),e.top-=s.top,e.left-=s.left,null==e.width&&(e.width=document.body.scrollWidth-e.left-e.right),null==e.height&&(e.height=document.body.scrollHeight-e.top-e.bottom),e.top=e.top-i.clientTop,e.left=e.left-i.clientLeft,e.right=o.body.clientWidth-e.width-e.left,e.bottom=o.body.clientHeight-e.height-e.top,e},r=function(t){return t.offsetParent||document.documentElement},a=function(){var t,e,o,i,s;return t=document.createElement("div"),t.style.width="100%",t.style.height="200px",e=document.createElement("div"),n(e.style,{position:"absolute",top:0,left:0,pointerEvents:"none",visibility:"hidden",width:"200px",height:"150px",overflow:"hidden"}),e.appendChild(t),document.body.appendChild(e),i=t.offsetWidth,e.style.overflow="scroll",s=t.offsetWidth,i===s&&(s=e.clientWidth),document.body.removeChild(e),o=i-s,{width:o,height:o}},n=function(t){var e,o,i,n,s,l,r;for(null==t&&(t={}),e=[],Array.prototype.push.apply(e,arguments),r=e.slice(1),s=0,l=r.length;l>s;s++)if(i=r[s])for(o in i)b.call(i,o)&&(n=i[o],t[o]=n);return t},d=function(t,e){var o,i,n,s,l;if(null!=t.classList){for(s=e.split(" "),l=[],i=0,n=s.length;n>i;i++)o=s[i],o.trim()&&l.push(t.classList.remove(o));return l}return t.className=t.className.replace(new RegExp("(^| )"+e.split(" ").join("|")+"( |$)","gi")," ")},e=function(t,e){var o,i,n,s,l;if(null!=t.classList){for(s=e.split(" "),l=[],i=0,n=s.length;n>i;i++)o=s[i],o.trim()&&l.push(t.classList.add(o));return l}return d(t,e),t.className+=" "+e},p=function(t,e){return null!=t.classList?t.classList.contains(e):new RegExp("(^| )"+e+"( |$)","gi").test(t.className)},c=function(t,o,i){var n,s,l,r,h,a;for(s=0,r=i.length;r>s;s++)n=i[s],v.call(o,n)<0&&p(t,n)&&d(t,n);for(a=[],l=0,h=o.length;h>l;l++)n=o[l],a.push(p(t,n)?void 0:e(t,n));return a},i=[],o=function(t){return i.push(t)},s=function(){var t,e;for(e=[];t=i.pop();)e.push(t());return e},t=function(){function t(){}return t.prototype.on=function(t,e,o,i){var n;return null==i&&(i=!1),null==this.bindings&&(this.bindings={}),null==(n=this.bindings)[t]&&(n[t]=[]),this.bindings[t].push({handler:e,ctx:o,once:i})},t.prototype.once=function(t,e,o){return this.on(t,e,o,!0)},t.prototype.off=function(t,e){var o,i,n;if(null!=(null!=(i=this.bindings)?i[t]:void 0)){if(null==e)return delete this.bindings[t];for(o=0,n=[];o=e&&e>=t-o},x=function(){var t,e,o,i,n;for(t=document.createElement("div"),n=["transform","webkitTransform","OTransform","MozTransform","msTransform"],o=0,i=n.length;i>o;o++)if(e=n[o],void 0!==t.style[e])return e}(),T=[],C=function(){var t,e,o;for(e=0,o=T.length;o>e;e++)t=T[e],t.position(!1);return f()},b=function(){var t;return null!=(t="undefined"!=typeof performance&&null!==performance?"function"==typeof performance.now?performance.now():void 0:void 0)?t:+new Date},function(){var t,e,o,i,n,s,l,r,h;for(e=null,o=null,i=null,n=function(){if(null!=o&&o>16)return o=Math.min(o-16,250),void(i=setTimeout(n,250));if(!(null!=e&&b()-e<10))return null!=i&&(clearTimeout(i),i=null),e=b(),C(),o=b()-e},r=["resize","scroll","touchmove"],h=[],s=0,l=r.length;l>s;s++)t=r[s],h.push(window.addEventListener(t,n));return h}(),t={center:"center",left:"right",right:"left"},e={middle:"middle",top:"bottom",bottom:"top"},o={top:0,left:0,middle:"50%",center:"50%",bottom:"100%",right:"100%"},r=function(o,i){var n,s;return n=o.left,s=o.top,"auto"===n&&(n=t[i.left]),"auto"===s&&(s=e[i.top]),{left:n,top:s}},l=function(t){var e,i;return{left:null!=(e=o[t.left])?e:t.left,top:null!=(i=o[t.top])?i:t.top}},s=function(){var t,e,o,i,n,s,l;for(e=1<=arguments.length?M.call(arguments,0):[],o={top:0,left:0},n=0,s=e.length;s>n;n++)l=e[n],i=l.top,t=l.left,"string"==typeof i&&(i=parseFloat(i,10)),"string"==typeof t&&(t=parseFloat(t,10)),o.top+=i,o.left+=t;return o},v=function(t,e){return"string"==typeof t.left&&-1!==t.left.indexOf("%")&&(t.left=parseFloat(t.left,10)/100*e.width),"string"==typeof t.top&&-1!==t.top.indexOf("%")&&(t.top=parseFloat(t.top,10)/100*e.height),t},y=w=function(t){var e,o,i;return i=t.split(" "),o=i[0],e=i[1],{top:o,left:e}},A=function(){function t(t){this.position=z(this.position,this);var e,o,n,s,l;for(T.push(this),this.history=[],this.setOptions(t,!1),s=i.modules,o=0,n=s.length;n>o;o++)e=s[o],null!=(l=e.initialize)&&l.call(this);this.position()}return t.modules=[],t.prototype.getClass=function(t){var e,o;return(null!=(e=this.options.classes)?e[t]:void 0)?this.options.classes[t]:(null!=(o=this.options.classes)?o[t]:void 0)!==!1?this.options.classPrefix?""+this.options.classPrefix+"-"+t:t:""},t.prototype.setOptions=function(t,e){var o,i,s,l,r,h;for(this.options=t,null==e&&(e=!0),o={offset:"0 0",targetOffset:"0 0",targetAttachment:"auto auto",classPrefix:"tether"},this.options=a(o,this.options),r=this.options,this.element=r.element,this.target=r.target,this.targetModifier=r.targetModifier,"viewport"===this.target?(this.target=document.body,this.targetModifier="visible"):"scroll-handle"===this.target&&(this.target=document.body,this.targetModifier="scroll-handle"),h=["element","target"],s=0,l=h.length;l>s;s++){if(i=h[s],null==this[i])throw new Error("Tether Error: Both element and target must be defined");null!=this[i].jquery?this[i]=this[i][0]:"string"==typeof this[i]&&(this[i]=document.querySelector(this[i]))}if(n(this.element,this.getClass("element")),n(this.target,this.getClass("target")),!this.options.attachment)throw new Error("Tether Error: You must provide an attachment");return this.targetAttachment=y(this.options.targetAttachment),this.attachment=y(this.options.attachment),this.offset=w(this.options.offset),this.targetOffset=w(this.options.targetOffset),null!=this.scrollParent&&this.disable(),this.scrollParent="scroll-handle"===this.targetModifier?this.target:c(this.target),this.options.enabled!==!1?this.enable(e):void 0},t.prototype.getTargetBounds=function(){var t,e,o,i,n,s,l,r,h;if(null==this.targetModifier)return p(this.target);switch(this.targetModifier){case"visible":return this.target===document.body?{top:pageYOffset,left:pageXOffset,height:innerHeight,width:innerWidth}:(t=p(this.target),n={height:t.height,width:t.width,top:t.top,left:t.left},n.height=Math.min(n.height,t.height-(pageYOffset-t.top)),n.height=Math.min(n.height,t.height-(t.top+t.height-(pageYOffset+innerHeight))),n.height=Math.min(innerHeight,n.height),n.height-=2,n.width=Math.min(n.width,t.width-(pageXOffset-t.left)),n.width=Math.min(n.width,t.width-(t.left+t.width-(pageXOffset+innerWidth))),n.width=Math.min(innerWidth,n.width),n.width-=2,n.toph.clientWidth||"scroll"===[r.overflow,r.overflowX]||this.target!==document.body,s=0,o&&(s=15),i=t.height-parseFloat(r.borderTopWidth)-parseFloat(r.borderBottomWidth)-s,n={width:15,height:.975*i*(i/h.scrollHeight),left:t.left+t.width-parseFloat(r.borderLeftWidth)-15},e=0,408>i&&this.target===document.body&&(e=-11e-5*Math.pow(i,2)-.00727*i+22.58),this.target!==document.body&&(n.height=Math.max(n.height,24)),l=this.target.scrollTop/(h.scrollHeight-i),n.top=l*(i-n.height-e)+t.top+parseFloat(r.borderTopWidth),this.target===document.body&&(n.height=Math.max(n.height,24)),n}},t.prototype.clearCache=function(){return this._cache={}},t.prototype.cache=function(t,e){return null==this._cache&&(this._cache={}),null==this._cache[t]&&(this._cache[t]=e.call(this)),this._cache[t]},t.prototype.enable=function(t){return null==t&&(t=!0),n(this.target,this.getClass("enabled")),n(this.element,this.getClass("enabled")),this.enabled=!0,this.scrollParent!==document&&this.scrollParent.addEventListener("scroll",this.position),t?this.position():void 0},t.prototype.disable=function(){return O(this.target,this.getClass("enabled")),O(this.element,this.getClass("enabled")),this.enabled=!1,null!=this.scrollParent?this.scrollParent.removeEventListener("scroll",this.position):void 0},t.prototype.destroy=function(){var t,e,o,i,n;for(this.disable(),n=[],t=o=0,i=T.length;i>o;t=++o){if(e=T[t],e===this){T.splice(t,1);break}n.push(void 0)}return n},t.prototype.updateAttachClasses=function(t,e){var o,i,n,s,l,r,a,f,p,u=this;for(null==t&&(t=this.attachment),null==e&&(e=this.targetAttachment),s=["left","top","bottom","right","middle","center"],(null!=(p=this._addAttachClasses)?p.length:void 0)&&this._addAttachClasses.splice(0,this._addAttachClasses.length),o=null!=this._addAttachClasses?this._addAttachClasses:this._addAttachClasses=[],t.top&&o.push(""+this.getClass("element-attached")+"-"+t.top),t.left&&o.push(""+this.getClass("element-attached")+"-"+t.left),e.top&&o.push(""+this.getClass("target-attached")+"-"+e.top),e.left&&o.push(""+this.getClass("target-attached")+"-"+e.left),i=[],l=0,a=s.length;a>l;l++)n=s[l],i.push(""+this.getClass("element-attached")+"-"+n);for(r=0,f=s.length;f>r;r++)n=s[r],i.push(""+this.getClass("target-attached")+"-"+n);return h(function(){return null!=u._addAttachClasses?(E(u.element,u._addAttachClasses,i),E(u.target,u._addAttachClasses,i),u._addAttachClasses=void 0):void 0})},t.prototype.position=function(t){var e,o,n,h,a,d,c,m,b,y,w,C,O,T,x,E,W,A,S,M,z,B,P,_,F,L,H,Y,X,N,j,R,U,q,k,D=this;if(null==t&&(t=!0),this.enabled){for(this.clearCache(),M=r(this.targetAttachment,this.attachment),this.updateAttachClasses(this.attachment,M),e=this.cache("element-bounds",function(){return p(D.element)}),F=e.width,n=e.height,0===F&&0===n&&null!=this.lastSize?(N=this.lastSize,F=N.width,n=N.height):this.lastSize={width:F,height:n},P=B=this.cache("target-bounds",function(){return D.getTargetBounds()}),b=v(l(this.attachment),{width:F,height:n}),z=v(l(M),P),a=v(this.offset,{width:F,height:n}),d=v(this.targetOffset,P),b=s(b,a),z=s(z,d),h=B.left+z.left-b.left,_=B.top+z.top-b.top,j=i.modules,L=0,Y=j.length;Y>L;L++)if(c=j[L],x=c.position.call(this,{left:h,top:_,targetAttachment:M,targetPos:B,attachment:this.attachment,elementPos:e,offset:b,targetOffset:z,manualOffset:a,manualTargetOffset:d,scrollbarSize:A}),null!=x&&"object"==typeof x){if(x===!1)return!1;_=x.top,h=x.left}if(m={page:{top:_,left:h},viewport:{top:_-pageYOffset,bottom:pageYOffset-_-n+innerHeight,left:h-pageXOffset,right:pageXOffset-h-F+innerWidth}},document.body.scrollWidth>window.innerWidth&&(A=this.cache("scrollbar-size",g),m.viewport.bottom-=A.height),document.body.scrollHeight>window.innerHeight&&(A=this.cache("scrollbar-size",g),m.viewport.right-=A.width),(""!==(R=document.body.style.position)&&"static"!==R||""!==(U=document.body.parentElement.style.position)&&"static"!==U)&&(m.page.bottom=document.body.scrollHeight-_-n,m.page.right=document.body.scrollWidth-h-F),(null!=(q=this.options.optimizations)?q.moveElement:void 0)!==!1&&null==this.targetModifier){for(w=this.cache("target-offsetparent",function(){return u(D.target)}),T=this.cache("target-offsetparent-bounds",function(){return p(w)}),O=getComputedStyle(w),o=getComputedStyle(this.element),C=T,y={},k=["Top","Left","Bottom","Right"],H=0,X=k.length;X>H;H++)S=k[H],y[S.toLowerCase()]=parseFloat(O["border"+S+"Width"]);T.right=document.body.scrollWidth-T.left-C.width+y.right,T.bottom=document.body.scrollHeight-T.top-C.height+y.bottom,m.page.top>=T.top+y.top&&m.page.bottom>=T.bottom&&m.page.left>=T.left+y.left&&m.page.right>=T.right&&(W=w.scrollTop,E=w.scrollLeft,m.offset={top:m.page.top-T.top+W-y.top,left:m.page.left-T.left+E-y.left})}return this.move(m),this.history.unshift(m),this.history.length>3&&this.history.pop(),t&&f(),!0}},t.prototype.move=function(t){var e,o,i,n,s,l,r,f,p,d,g,c,m,b,v,y,w,C=this;if(null!=this.element.parentNode){f={};for(d in t){f[d]={};for(n in t[d]){for(i=!1,y=this.history,b=0,v=y.length;v>b;b++)if(r=y[b],!W(null!=(w=r[d])?w[n]:void 0,t[d][n])){i=!0;break}i||(f[d][n]=!0)}}e={top:"",left:"",right:"",bottom:""},p=function(t,o){var i,n,s;return(null!=(s=C.options.optimizations)?s.gpu:void 0)===!1?(t.top?e.top=""+o.top+"px":e.bottom=""+o.bottom+"px",t.left?e.left=""+o.left+"px":e.right=""+o.right+"px"):(t.top?(e.top=0,n=o.top):(e.bottom=0,n=-o.bottom),t.left?(e.left=0,i=o.left):(e.right=0,i=-o.right),e[x]="translateX("+Math.round(i)+"px) translateY("+Math.round(n)+"px)","msTransform"!==x?e[x]+=" translateZ(0)":void 0)},s=!1,(f.page.top||f.page.bottom)&&(f.page.left||f.page.right)?(e.position="absolute",p(f.page,t.page)):(f.viewport.top||f.viewport.bottom)&&(f.viewport.left||f.viewport.right)?(e.position="fixed",p(f.viewport,t.viewport)):null!=f.offset&&f.offset.top&&f.offset.left?(e.position="absolute",l=this.cache("target-offsetparent",function(){return u(C.target)}),u(this.element)!==l&&h(function(){return C.element.parentNode.removeChild(C.element),l.appendChild(C.element)}),p(f.offset,t.offset),s=!0):(e.position="absolute",p({top:!0,left:!0},t.page)),s||"BODY"===this.element.parentNode.tagName||(this.element.parentNode.removeChild(this.element),document.body.appendChild(this.element)),m={},c=!1;for(n in e)g=e[n],o=this.element.style[n],""===o||""===g||"top"!==n&&"left"!==n&&"bottom"!==n&&"right"!==n||(o=parseFloat(o),g=parseFloat(g)),o!==g&&(c=!0,m[n]=e[n]);return c?h(function(){return a(C.element.style,m)}):void 0}},t}(),i.position=C,this.Tether=a(A,i)}.call(this),function(){var t,e,o,i,n,s,l,r,h,a,f=[].indexOf||function(t){for(var e=0,o=this.length;o>e;e++)if(e in this&&this[e]===t)return e;return-1};a=this.Tether.Utils,l=a.getOuterSize,s=a.getBounds,r=a.getSize,i=a.extend,h=a.updateClasses,o=a.defer,e={left:"right",right:"left",top:"bottom",bottom:"top",middle:"middle"},t=["left","top","right","bottom"],n=function(e,o){var i,n,l,r,h,a,f;if("scrollParent"===o?o=e.scrollParent:"window"===o&&(o=[pageXOffset,pageYOffset,innerWidth+pageXOffset,innerHeight+pageYOffset]),o===document&&(o=o.documentElement),null!=o.nodeType)for(n=r=s(o),h=getComputedStyle(o),o=[n.left,n.top,r.width+n.left,r.height+n.top],i=a=0,f=t.length;f>a;i=++a)l=t[i],l=l[0].toUpperCase()+l.substr(1),"Top"===l||"Left"===l?o[i]+=parseFloat(h["border"+l+"Width"]):o[i]-=parseFloat(h["border"+l+"Width"]);return o},this.Tether.modules.push({position:function(e){var l,r,a,p,u,d,g,c,m,b,v,y,w,C,O,T,x,E,W,A,S,M,z,B,P,_,F,L,H,Y,X,N,j,R,U,q,k,D,Z,$,I,G,J,K,Q,V,te,ee=this;if(_=e.top,v=e.left,S=e.targetAttachment,!this.options.constraints)return!0;for(E=function(e){var o,i,n,s;for(ee.removeClass(e),s=[],i=0,n=t.length;n>i;i++)o=t[i],s.push(ee.removeClass(""+e+"-"+o));return s},$=this.cache("element-bounds",function(){return s(ee.element)}),b=$.height,F=$.width,0===F&&0===b&&null!=this.lastSize&&(I=this.lastSize,F=I.width,b=I.height),z=this.cache("target-bounds",function(){return ee.getTargetBounds()}),M=z.height,B=z.width,A={},m={},r=[this.getClass("pinned"),this.getClass("out-of-bounds")],G=this.options.constraints,L=0,N=G.length;N>L;L++)c=G[L],c.outOfBoundsClass&&r.push(c.outOfBoundsClass),c.pinnedClass&&r.push(c.pinnedClass);for(H=0,j=r.length;j>H;H++)for(g=r[H],J=["left","top","right","bottom"],Y=0,R=J.length;R>Y;Y++)W=J[Y],r.push(""+g+"-"+W);for(l=[],A=i({},S),m=i({},this.attachment),K=this.options.constraints,X=0,U=K.length;U>X;X++){if(c=K[X],P=c.to,a=c.attachment,O=c.pin,null==a&&(a=""),f.call(a," ")>=0?(Q=a.split(" "),d=Q[0],u=Q[1]):u=d=a,p=n(this,P),("target"===d||"both"===d)&&(_p[3]&&"bottom"===A.top&&(_-=M,A.top="top")),"together"===d&&(_p[3]&&"bottom"===A.top&&("top"===m.top?(_-=M,A.top="top",_-=b,m.top="bottom"):"bottom"===m.top&&(_-=M,A.top="top",_+=b,m.top="top")),"middle"===A.top&&(_+b>p[3]&&"top"===m.top?(_-=b,m.top="bottom"):_p[2]&&"right"===A.left&&(v-=B,A.left="left")),"together"===u&&(vp[2]&&"right"===A.left?"left"===m.left?(v-=B,A.left="left",v-=F,m.left="right"):"right"===m.left&&(v-=B,A.left="left",v+=F,m.left="left"):"center"===A.left&&(v+F>p[2]&&"left"===m.left?(v-=F,m.left="right"):vp[3]&&"top"===m.top&&(_-=b,m.top="bottom")),("element"===u||"both"===u)&&(vp[2]&&"left"===m.left&&(v-=F,m.left="right")),"string"==typeof O?O=function(){var t,e,o,i;for(o=O.split(","),i=[],e=0,t=o.length;t>e;e++)C=o[e],i.push(C.trim());return i}():O===!0&&(O=["top","left","right","bottom"]),O||(O=[]),T=[],y=[],_=0?(_=p[1],T.push("top")):y.push("top")),_+b>p[3]&&(f.call(O,"bottom")>=0?(_=p[3]-b,T.push("bottom")):y.push("bottom")),v=0?(v=p[0],T.push("left")):y.push("left")),v+F>p[2]&&(f.call(O,"right")>=0?(v=p[2]-F,T.push("right")):y.push("right")),T.length)for(x=null!=(V=this.options.pinnedClass)?V:this.getClass("pinned"),l.push(x),D=0,q=T.length;q>D;D++)W=T[D],l.push(""+x+"-"+W);if(y.length)for(w=null!=(te=this.options.outOfBoundsClass)?te:this.getClass("out-of-bounds"),l.push(w),Z=0,k=y.length;k>Z;Z++)W=y[Z],l.push(""+w+"-"+W);(f.call(T,"left")>=0||f.call(T,"right")>=0)&&(m.left=A.left=!1),(f.call(T,"top")>=0||f.call(T,"bottom")>=0)&&(m.top=A.top=!1),(A.top!==S.top||A.left!==S.left||m.top!==this.attachment.top||m.left!==this.attachment.left)&&this.updateAttachClasses(m,A)}return o(function(){return h(ee.target,l,r),h(ee.element,l,r)}),{top:_,left:v}}})}.call(this),function(){var t,e,o,i;i=this.Tether.Utils,e=i.getBounds,o=i.updateClasses,t=i.defer,this.Tether.modules.push({position:function(i){var n,s,l,r,h,a,f,p,u,d,g,c,m,b,v,y,w,C,O,T,x,E,W,A,S,M=this;if(g=i.top,a=i.left,x=this.cache("element-bounds",function(){return e(M.element)}),h=x.height,c=x.width,d=this.getTargetBounds(),r=g+h,f=a+c,n=[],g<=d.bottom&&r>=d.top)for(E=["left","right"],m=0,w=E.length;w>m;m++)p=E[m],((W=d[p])===a||W===f)&&n.push(p);if(a<=d.right&&f>=d.left)for(A=["top","bottom"],b=0,C=A.length;C>b;b++)p=A[b],((S=d[p])===g||S===r)&&n.push(p);for(l=[],s=[],u=["left","top","right","bottom"],l.push(this.getClass("abutted")),v=0,O=u.length;O>v;v++)p=u[v],l.push(""+this.getClass("abutted")+"-"+p);for(n.length&&s.push(this.getClass("abutted")),y=0,T=n.length;T>y;y++)p=n[y],s.push(""+this.getClass("abutted")+"-"+p);return t(function(){return o(M.target,s,l),o(M.element,s,l)}),!0}})}.call(this),function(){this.Tether.modules.push({position:function(t){var e,o,i,n,s,l,r;return l=t.top,e=t.left,this.options.shift?(o=function(t){return"function"==typeof t?t.call(this,{top:l,left:e}):t},i=o(this.options.shift),"string"==typeof i?(i=i.split(" "),i[1]||(i[1]=i[0]),s=i[0],n=i[1],s=parseFloat(s,10),n=parseFloat(n,10)):(r=[i.top,i.left],s=r[0],n=r[1]),l+=s,e+=n,{top:l,left:e}):void 0}})}.call(this),this.Tether}); \ No newline at end of file From fd912c0a3119738ff947e0ad6cac78afabed6f19 Mon Sep 17 00:00:00 2001 From: Nick Hwang Date: Wed, 13 May 2015 10:22:11 -0400 Subject: [PATCH 06/40] Manually fix documentation for now... --- index.html | 8 +------- 1 file changed, 1 insertion(+), 7 deletions(-) diff --git a/index.html b/index.html index 28ac44d67..94aacb3e9 100644 --- a/index.html +++ b/index.html @@ -505,15 +505,9 @@

      Contributing

      To build Tether, you need:

      • Node.js
      • -
      • Ruby (for compass)

      Instructions

        -
      • Install compass (if you don't have it already)
      • -
      -
      gem update --system
      -gem install compass
      -
      • Install the build tool
      npm install -g gulp
      @@ -546,4 +540,4 @@

      Instructions

      ga('create', 'UA-45159009-1', 'auto'); ga('send', 'pageview'); - \ No newline at end of file + From 407f0a9fb55d6bd8d60057940a254f6c09fc4e6c Mon Sep 17 00:00:00 2001 From: Nick Hwang Date: Sun, 21 Feb 2016 15:48:29 -0500 Subject: [PATCH 07/40] Rebuild docs --- advanced/embedding_tether/index.html | 14 +- advanced/extending_tether/index.html | 49 +- .../css}/tether-theme-arrows-dark.css | 62 +- dist/css/tether-theme-arrows-dark.min.css | 1 + {css => dist/css}/tether-theme-arrows.css | 68 +- dist/css/tether-theme-arrows.min.css | 1 + {css => dist/css}/tether-theme-basic.css | 10 +- dist/css/tether-theme-basic.min.css | 1 + {css => dist/css}/tether.css | 2 - dist/css/tether.min.css | 1 + dist/js/tether.js | 1726 +++++++++++++++++ dist/js/tether.min.js | 1 + docs/css/intro.css | 29 +- docs/intro.html | 59 +- docs/js/markAttachment.js | 51 + docs/welcome/browser-demo.html | 12 +- docs/welcome/css/browser-demo.css | 19 +- docs/welcome/css/welcome.css | 65 +- docs/welcome/index.html | 26 +- docs/welcome/sass/_inline-block.sass | 6 + docs/welcome/sass/browser-demo.sass | 8 +- docs/welcome/sass/welcome.sass | 20 +- examples/content-visible/index.html | 2 +- examples/dolls/index.html | 2 +- examples/element-scroll/index.html | 2 +- examples/enable-disable/index.html | 2 +- examples/list_of_examples/index.html | 14 +- examples/out-of-bounds/index.html | 2 +- examples/pin/index.html | 2 +- examples/projects_using_tether/index.html | 22 +- examples/scroll/index.html | 2 +- examples/simple/index.html | 2 +- examples/testbed/index.html | 2 +- examples/viewport/index.html | 2 +- gulpfile.coffee | 65 - gulpfile.js | 2 - index.html | 55 +- js/abutment.js | 59 - js/constraint.js | 308 --- js/markAttachment.js | 46 - js/shift.js | 38 - js/tether.js | 686 ------- js/tether.min.js | 2 - js/utils.js | 331 ---- overview/repositioning/index.html | 33 +- overview/why_we_dont_support_ie_8/index.html | 14 +- overview/why_you_should_use_tether/index.html | 14 +- resources/templates/base.jade | 14 +- resources/templates/includes/footer.jade | 31 +- .../includes/navigation-and-content.jade | 4 +- resources/templates/includes/topbar.html | 8 +- tether.js | 1443 -------------- tether.min.js | 2 - 53 files changed, 2126 insertions(+), 3316 deletions(-) rename {css => dist/css}/tether-theme-arrows-dark.css (68%) create mode 100644 dist/css/tether-theme-arrows-dark.min.css rename {css => dist/css}/tether-theme-arrows.css (68%) create mode 100644 dist/css/tether-theme-arrows.min.css rename {css => dist/css}/tether-theme-basic.css (65%) create mode 100644 dist/css/tether-theme-basic.min.css rename {css => dist/css}/tether.css (80%) create mode 100644 dist/css/tether.min.css create mode 100644 dist/js/tether.js create mode 100644 dist/js/tether.min.js create mode 100644 docs/js/markAttachment.js create mode 100644 docs/welcome/sass/_inline-block.sass delete mode 100644 gulpfile.coffee delete mode 100644 gulpfile.js delete mode 100644 js/abutment.js delete mode 100644 js/constraint.js delete mode 100644 js/markAttachment.js delete mode 100644 js/shift.js delete mode 100644 js/tether.js delete mode 100644 js/tether.min.js delete mode 100644 js/utils.js delete mode 100644 tether.js delete mode 100644 tether.min.js diff --git a/advanced/embedding_tether/index.html b/advanced/embedding_tether/index.html index 9e8975cd2..feddf0302 100644 --- a/advanced/embedding_tether/index.html +++ b/advanced/embedding_tether/index.html @@ -1,12 +1,12 @@ -Tether -

      Embedding Tether

      +

      Embedding Tether

      Tether is designed to be embeddable in other libraries.

      There is one thing you should think about doing to create an embedded Tether:

        @@ -36,7 +36,7 @@ all of the classes. You can also disable classes you don't intend on using with the classes option.
      -
      +
      -

      Extending Tether

      +

      Extending Tether

      Tether has a module system which can be used to modify Tether's positioning, or just do something each time the Tether is moved.

      Tether has an array called Tether.modules, push onto it to add a module:

      Tether.modules.push
      -  position: ({top, left}) ->
      -    top += 10
      +  position: ({top, left}) ->
      +    top += 10
       
      -    {top, left}
      + {top, left} +

      Position

      Your position function can either return a new object with top and left, null/undefined to leave the coordinates unchanged, or false to cancel the positioning.

      The position function is passed an object with the following elements:

      {
      -  left, // The element's new position, from the top left corner of the page
      +  left, // The element's new position, from the top left corner of the page
         top,
      -  targetAttachment, // The targetAttachment, with 'auto' resolved to an actual attachment
      -  targetPos, // The coordinates of the target
      -  attachment, // The attachment, as passed in the option
      -  elementPos, // The coordinates of the element
      -  offset, // The offset, after it's converted into pixels and the manual offset is added
      -  targetOffset, // The attachment is converted into an offset and is included in these values
      -  manualOffset, // The manual offset, in pixels
      +  targetAttachment, // The targetAttachment, with 'auto' resolved to an actual attachment
      +  targetPos, // The coordinates of the target
      +  attachment, // The attachment, as passed in the option
      +  elementPos, // The coordinates of the element
      +  offset, // The offset, after it's converted into pixels and the manual offset is added
      +  targetOffset, // The attachment is converted into an offset and is included in these values
      +  manualOffset, // The manual offset, in pixels
         manualTargetOffset
      -}
      +} +

      It is called with the Tether instance as its context (this).

      Initialize

      Modules can also have an initialize function which will be called when a new tether is created. The initialize function is also called with the Tether instance as its context.

      Tether.modules.push
      -  initialize: ->
      -    console.log "New Tether Created!", @
      + initialize: -> + console.log "New Tether Created!", @ +

      Examples

      -

      Constraints and shift are both implemented as modules. -Mark Attachment is used by the docs.

      -
      +

      Constraints and shift are both implemented as modules. +Mark Attachment is used by the docs.

      +
      -
    -

    The syntax of the attachment properties is: "vertical-attachment horizontal-attachment"

    +

    The syntax of the attachment properties is: "vertical-attachment horizontal-attachment".

    You must always supply an attachment. If you don't supply a target-attachment, it is assumed to be the mirror image of attachment.

    Offset

    @@ -263,8 +263,7 @@

    Constraints

    ] });

    -

    You can also provide different settings for the horizontal -and vertical attachments:

    +

    You can also provide different settings for the vertical and horizontal attachments:

    new Tether({
       element: yellowBox,
       target: greenBox,
    @@ -455,25 +454,28 @@ 

    Classes

    You can change the prefix of the classes with the classPrefix option. It is 'tether' by default, but you could, for example, change it to be 'bill' if you were building the bill library and all the classes would be 'bill-*'.

    -
    new Tether({
    -  classPrefix: 'bill'
    -});
    +
    new Tether({
    +  classPrefix: 'bill'
    +});
    +

    The sass/css is similarily configurable, see tooltip for an example of how to make your own prefixed css file.

    All classes can be changed or disabled with the classes option. For example, to change the tether-element class to be my-box:

    -
    new Tether({
    +
    new Tether({
       classes: {
    -    element: 'my-box'
    +    element: 'my-box'
       }
    -});
    +}); +

    You can also disable classes you're not going to use:

    -
    new Tether({
    +
    new Tether({
       classes: {
    -    out-of-bounds: false
    +    out-of-bounds: false
       }
    -});
    +}); +
    • tether-element is added to the element
    • tether-target is added to the target
    • @@ -505,28 +507,25 @@

      Contributing

      To build Tether, you need:

      • Node.js
      • -
      • Ruby (for compass)

      Instructions

        -
      • Install compass (if you don't have it already)
      • -
      -
      gem update --system
      -gem install compass
      -
      • Install the build tool
      -
      npm install -g gulp
      +
      npm install -g gulp
      +
      • Install the project
      -
      # In the project directory
      -npm install
      +
      # In the project directory
      +npm install
      +
      • Build / Watch
      -
      gulp
      -
    +
    gulp
    +
    +
    - + - +
    @@ -66,11 +66,11 @@
    - + - - - + + + diff --git a/docs/welcome/css/browser-demo.css b/docs/welcome/css/browser-demo.css index c41b02012..0bd007b8f 100644 --- a/docs/welcome/css/browser-demo.css +++ b/docs/welcome/css/browser-demo.css @@ -5,17 +5,16 @@ html, body { .tether.tether-theme-arrows-dark .tether-content { -webkit-filter: none; - -moz-filter: none; - filter: none; - background: black; } + filter: none; + background: #000; } .tether.tether-theme-arrows-dark .tether-content ul { - color: white; + color: #fff; list-style: none; padding: 0; margin: 0; } .tether.tether-theme-arrows-dark.tether-element-attached-top.tether-element-attached-left.tether-target-attached-right .tether-content:before { - border-right-color: black; } + border-right-color: #000; } .browser-demo { position: absolute; @@ -24,8 +23,6 @@ html, body { bottom: 0; right: 0; } .browser-demo *, .browser-demo *:after, .browser-demo *:before { - -webkit-box-sizing: border-box; - -moz-box-sizing: border-box; box-sizing: border-box; } .browser-demo .top { position: absolute; @@ -51,7 +48,7 @@ html, body { cursor: pointer; } .browser-demo .bottom .left .item:hover, .browser-demo .bottom .left .item.tether-open { background: rgba(0, 0, 0, 0.1); - border-bottom: 1px solid rgba(0, 0, 0, 0); } + border-bottom: 1px solid transparent; } .browser-demo .bottom .left .item:last-child { border-bottom: 0; } .browser-demo .bottom .right { @@ -61,22 +58,20 @@ html, body { height: 100%; padding: 20px; } .browser-demo .title { - display: -moz-inline-stack; display: inline-block; vertical-align: middle; *vertical-align: auto; - zoom: 1; + *zoom: 1; *display: inline; background: rgba(0, 0, 0, 0.1); width: 150px; height: 15px; margin-bottom: 20px; } .browser-demo .word { - display: -moz-inline-stack; display: inline-block; vertical-align: middle; *vertical-align: auto; - zoom: 1; + *zoom: 1; *display: inline; background: rgba(0, 0, 0, 0.1); width: 50px; diff --git a/docs/welcome/css/welcome.css b/docs/welcome/css/welcome.css index 5dba90e8c..8b7a6ad89 100644 --- a/docs/welcome/css/welcome.css +++ b/docs/welcome/css/welcome.css @@ -7,8 +7,8 @@ body { .button { display: inline-block; - border: 2px solid #333333; - color: #333333; + border: 2px solid #333; + color: #333; padding: 1em 1.25em; font-weight: 500; text-transform: uppercase; @@ -16,7 +16,7 @@ body { text-decoration: none; cursor: pointer; width: 140px; - font-size: 0.8em; + font-size: .8em; line-height: 1.3em; text-align: center; } @@ -24,8 +24,8 @@ body { padding: 1em; font-size: 1.1em; } .tether-element.tether-theme-arrows-dark .tether-content .button { - border-color: white; - color: white; + border-color: #fff; + color: #fff; width: 170px; pointer-events: all; } @@ -36,8 +36,8 @@ body { display: block; } } .button.dark { - background: #333333; - color: white; } + background: #333; + color: #fff; } .hero-wrap { height: 100%; @@ -86,13 +86,12 @@ table.showcase { table.showcase.hero { text-align: center; } table.showcase.hero .tether-target-demo { - display: -moz-inline-stack; display: inline-block; vertical-align: middle; *vertical-align: auto; - zoom: 1; + *zoom: 1; *display: inline; - border: 2px dotted black; + border: 2px dotted #000; margin: 5rem auto; padding: 5rem; } @media (max-width: 567px) { @@ -124,10 +123,7 @@ table.showcase { table.showcase.projects-showcase .showcase-inner .projects-list p { font-size: 1.3rem; } table.showcase.browser-demo { - background-image: -webkit-gradient(linear, 0% 0%, 100% 100%, color-stop(0%, #723362), color-stop(100%, #9d223c)); background-image: -webkit-linear-gradient(top left, #723362 0%, #9d223c 100%); - background-image: -moz-linear-gradient(top left, #723362 0%, #9d223c 100%); - background-image: -o-linear-gradient(top left, #723362 0%, #9d223c 100%); background-image: linear-gradient(top left, #723362 0%, #9d223c 100%); background-color: #9d223c; position: absolute; @@ -141,9 +137,7 @@ table.showcase { z-index: 1; } table.showcase.browser-demo.fixed .browser-demo-inner { -webkit-transition: width 2s ease-in-out, height 2s ease-in-out; - -moz-transition: width 2s ease-in-out, height 2s ease-in-out; - -o-transition: width 2s ease-in-out, height 2s ease-in-out; - transition: width 2s ease-in-out, height 2s ease-in-out; } + transition: width 2s ease-in-out, height 2s ease-in-out; } table.showcase.browser-demo.fixed[data-section="what"] { box-shadow: 0 0 0 0; } table.showcase.browser-demo.fixed[data-section="why"] .browser-demo-inner { @@ -168,20 +162,16 @@ table.showcase { width: 100%; } table.showcase.browser-demo .section-copy { -webkit-transition: opacity 0.5s ease-in-out, top 0.5s ease-in-out; - -moz-transition: opacity 0.5s ease-in-out, top 0.5s ease-in-out; - -o-transition: opacity 0.5s ease-in-out, top 0.5s ease-in-out; - transition: opacity 0.5s ease-in-out, top 0.5s ease-in-out; - filter: progid:DXImageTransform.Microsoft.Alpha(Opacity=0); + transition: opacity 0.5s ease-in-out, top 0.5s ease-in-out; opacity: 0; position: absolute; top: 0; position: absolute; height: 200px; - color: white; + color: #fff; text-align: center; width: 100%; } table.showcase.browser-demo .section-copy.active { - filter: progid:DXImageTransform.Microsoft.Alpha(Opacity=100); opacity: 1; top: -150px; } @media (max-width: 567px) { @@ -196,12 +186,8 @@ table.showcase { table.showcase.browser-demo .section-copy h2 { font-size: 30px; } } table.showcase.browser-demo .browser-window { - -webkit-border-radius: 4px; - -moz-border-radius: 4px; - -ms-border-radius: 4px; - -o-border-radius: 4px; border-radius: 4px; - background: white; + background: #fff; position: relative; height: 100%; width: 100%; @@ -212,22 +198,17 @@ table.showcase { top: 0; left: 0; right: 0; - border-bottom: 1px solid #eeeeee; + border-bottom: 1px solid #eee; height: 55px; } table.showcase.browser-demo .browser-window .browser-titlebar .browser-dots { padding: 16px; } table.showcase.browser-demo .browser-window .browser-titlebar .browser-dots b { - -webkit-border-radius: 50%; - -moz-border-radius: 50%; - -ms-border-radius: 50%; - -o-border-radius: 50%; - border-radius: 50%; - display: -moz-inline-stack; display: inline-block; vertical-align: middle; *vertical-align: auto; - zoom: 1; + *zoom: 1; *display: inline; + border-radius: 50%; width: 10px; height: 10px; margin-right: 7px; @@ -239,10 +220,6 @@ table.showcase { right: 0; bottom: 0; } table.showcase.browser-demo .browser-window .browser-frame iframe { - -webkit-border-radius: 0 0 4px 4px; - -moz-border-radius: 0 0 4px 4px; - -ms-border-radius: 0 0 4px 4px; - -o-border-radius: 0 0 4px 4px; border-radius: 0 0 4px 4px; border: 0; width: 100%; @@ -250,24 +227,20 @@ table.showcase { table.showcase.browser-demo-section .section-scroll-copy { position: relative; z-index: 10; - color: white; + color: #fff; width: 100%; font-size: 22px; } table.showcase.browser-demo-section .section-scroll-copy .section-scroll-copy-inner { position: absolute; z-index: 10; - color: white; + color: #fff; right: 10%; width: 23%; } table.showcase.browser-demo-section .section-scroll-copy .section-scroll-copy-inner a { color: inherit; } table.showcase.browser-demo-section .section-scroll-copy .section-scroll-copy-inner .example-paragraph { - -webkit-border-radius: 4px; - -moz-border-radius: 4px; - -ms-border-radius: 4px; - -o-border-radius: 4px; border-radius: 4px; - background: black; + background: #000; padding: 1rem; } .browser-content { diff --git a/docs/welcome/index.html b/docs/welcome/index.html index f604763bb..d70d00d5e 100644 --- a/docs/welcome/index.html +++ b/docs/welcome/index.html @@ -10,11 +10,11 @@ - + - - + + @@ -105,7 +105,7 @@

    Play with Tether

    Interact with this demo.

     

    -

    To learn more, check out our documentation.

    +

    To learn more, check out our documentation.

    @@ -119,22 +119,22 @@

    Play with Tether

    Tether Family

    These projects are all powered by Tether's positioning engine.

    - +

    Drop

    Create dropdowns, popovers, and more.

    - +

    Tooltip

    Stylable tooltips built on Tether.

    - +

    Select

    Stylable select elements built on Tether.

    - +

    Shepherd

    Guide your users through a tour of your app.

    @@ -194,13 +194,13 @@

    Help us spread the word.

    - + - - - - + + + + + +
    diff --git a/examples/element-scroll/index.html b/examples/element-scroll/index.html index 1eb6f1e3d..e93181aed 100644 --- a/examples/element-scroll/index.html +++ b/examples/element-scroll/index.html @@ -441,7 +441,7 @@ } - + + -

    Examples

    +

    Examples

    It's our goal to create a wide variety of example of how Tether can be used. Here's what we have so far, please send a PR with any examples you might create.

    @@ -54,7 +54,7 @@

    Advanced

  • viewport: Demonstrates aligning an element with the viewport by using the 'visible' targetModifier when tethered to the body.
  • -
    +
    + + -

    Projects Using Tether

    +

    Projects Using Tether

    Here at HubSpot we have built a bunch of libraries on top of Tether, both because we wanted Tether-performance, and because we saw opportunities to improve on what was available in the client-side ecosystem.

    @@ -42,10 +42,14 @@

    Drop

    Where Tether does general-purpose positioning, Drop assumes that you are interested in making something which pops up next to something the user clicks or hovers on.

    -

    If your building something that fits that pattern, Drop can make things a little easier.

    +

    If you're building something that fits that pattern, Drop can make things a little easier.

    +

    React Datepicker

    +

    A simple and reusable datepicker component for React

    +

    ember-tether

    +

    An Ember.js-friendly interface for tether.

    Your Project Here

    -

    If you have a cool open-source library built on Tether, PR this doc, or get in touch.

    -
    +

    If you have a cool open-source library built on Tether, PR this doc.

    +
    + + + + -

    Tether

    A client-side library to make absolutely positioned elements attach to elements in the page efficiently.

    0.6.5

    -

    +

    Tether

    A client-side library to make absolutely positioned elements attach to elements in the page efficiently.

    1.2.0

    +

    @@ -106,7 +106,7 @@

    Attachment

  • middle
  • bottom
  • -

    The syntax of the attachment properties is: "vertical-attachment horizontal-attachment"

    +

    The syntax of the attachment properties is: "vertical-attachment horizontal-attachment".

    You must always supply an attachment. If you don't supply a target-attachment, it is assumed to be the mirror image of attachment.

    Offset

    @@ -263,8 +263,7 @@

    Constraints

    ] });

    -

    You can also provide different settings for the horizontal -and vertical attachments:

    +

    You can also provide different settings for the vertical and horizontal attachments:

    new Tether({
       element: yellowBox,
       target: greenBox,
    @@ -455,25 +454,28 @@ 

    Classes

    You can change the prefix of the classes with the classPrefix option. It is 'tether' by default, but you could, for example, change it to be 'bill' if you were building the bill library and all the classes would be 'bill-*'.

    -
    new Tether({
    -  classPrefix: 'bill'
    -});
    +
    new Tether({
    +  classPrefix: 'bill'
    +});
    +

    The sass/css is similarily configurable, see tooltip for an example of how to make your own prefixed css file.

    All classes can be changed or disabled with the classes option. For example, to change the tether-element class to be my-box:

    -
    new Tether({
    +
    new Tether({
       classes: {
    -    element: 'my-box'
    +    element: 'my-box'
       }
    -});
    +}); +

    You can also disable classes you're not going to use:

    -
    new Tether({
    +
    new Tether({
       classes: {
    -    out-of-bounds: false
    +    out-of-bounds: false
       }
    -});
    +}); +
    • tether-element is added to the element
    • tether-target is added to the target
    • @@ -510,17 +512,20 @@

      Instructions

      • Install the build tool
      -
      npm install -g gulp
      +
      npm install -g gulp
      +
      • Install the project
      -
      # In the project directory
      -npm install
      +
      # In the project directory
      +npm install
      +
      • Build / Watch
      -
      gulp
      -
    +
    gulp
    +
    +
    - + \ No newline at end of file diff --git a/js/abutment.js b/js/abutment.js deleted file mode 100644 index b3acaa047..000000000 --- a/js/abutment.js +++ /dev/null @@ -1,59 +0,0 @@ -(function() { - var defer, getBounds, updateClasses, _ref; - - _ref = this.Tether.Utils, getBounds = _ref.getBounds, updateClasses = _ref.updateClasses, defer = _ref.defer; - - this.Tether.modules.push({ - position: function(_arg) { - var abutted, addClasses, allClasses, bottom, height, left, right, side, sides, targetPos, top, width, _i, _j, _k, _l, _len, _len1, _len2, _len3, _ref1, _ref2, _ref3, _ref4, _ref5, - _this = this; - top = _arg.top, left = _arg.left; - _ref1 = this.cache('element-bounds', function() { - return getBounds(_this.element); - }), height = _ref1.height, width = _ref1.width; - targetPos = this.getTargetBounds(); - bottom = top + height; - right = left + width; - abutted = []; - if (top <= targetPos.bottom && bottom >= targetPos.top) { - _ref2 = ['left', 'right']; - for (_i = 0, _len = _ref2.length; _i < _len; _i++) { - side = _ref2[_i]; - if ((_ref3 = targetPos[side]) === left || _ref3 === right) { - abutted.push(side); - } - } - } - if (left <= targetPos.right && right >= targetPos.left) { - _ref4 = ['top', 'bottom']; - for (_j = 0, _len1 = _ref4.length; _j < _len1; _j++) { - side = _ref4[_j]; - if ((_ref5 = targetPos[side]) === top || _ref5 === bottom) { - abutted.push(side); - } - } - } - allClasses = []; - addClasses = []; - sides = ['left', 'top', 'right', 'bottom']; - allClasses.push(this.getClass('abutted')); - for (_k = 0, _len2 = sides.length; _k < _len2; _k++) { - side = sides[_k]; - allClasses.push("" + (this.getClass('abutted')) + "-" + side); - } - if (abutted.length) { - addClasses.push(this.getClass('abutted')); - } - for (_l = 0, _len3 = abutted.length; _l < _len3; _l++) { - side = abutted[_l]; - addClasses.push("" + (this.getClass('abutted')) + "-" + side); - } - defer(function() { - updateClasses(_this.target, addClasses, allClasses); - return updateClasses(_this.element, addClasses, allClasses); - }); - return true; - } - }); - -}).call(this); diff --git a/js/constraint.js b/js/constraint.js deleted file mode 100644 index 69a2bde45..000000000 --- a/js/constraint.js +++ /dev/null @@ -1,308 +0,0 @@ -(function() { - var BOUNDS_FORMAT, MIRROR_ATTACH, defer, extend, getBoundingRect, getBounds, getOuterSize, getSize, updateClasses, _ref, - __indexOf = [].indexOf || function(item) { for (var i = 0, l = this.length; i < l; i++) { if (i in this && this[i] === item) return i; } return -1; }; - - _ref = this.Tether.Utils, getOuterSize = _ref.getOuterSize, getBounds = _ref.getBounds, getSize = _ref.getSize, extend = _ref.extend, updateClasses = _ref.updateClasses, defer = _ref.defer; - - MIRROR_ATTACH = { - left: 'right', - right: 'left', - top: 'bottom', - bottom: 'top', - middle: 'middle' - }; - - BOUNDS_FORMAT = ['left', 'top', 'right', 'bottom']; - - getBoundingRect = function(tether, to) { - var i, pos, side, size, style, _i, _len; - if (to === 'scrollParent') { - to = tether.scrollParent; - } else if (to === 'window') { - to = [pageXOffset, pageYOffset, innerWidth + pageXOffset, innerHeight + pageYOffset]; - } - if (to === document) { - to = to.documentElement; - } - if (to.nodeType != null) { - pos = size = getBounds(to); - style = getComputedStyle(to); - to = [pos.left, pos.top, size.width + pos.left, size.height + pos.top]; - for (i = _i = 0, _len = BOUNDS_FORMAT.length; _i < _len; i = ++_i) { - side = BOUNDS_FORMAT[i]; - side = side[0].toUpperCase() + side.substr(1); - if (side === 'Top' || side === 'Left') { - to[i] += parseFloat(style["border" + side + "Width"]); - } else { - to[i] -= parseFloat(style["border" + side + "Width"]); - } - } - } - return to; - }; - - this.Tether.modules.push({ - position: function(_arg) { - var addClasses, allClasses, attachment, bounds, changeAttachX, changeAttachY, cls, constraint, eAttachment, height, left, oob, oobClass, p, pin, pinned, pinnedClass, removeClass, side, tAttachment, targetAttachment, targetHeight, targetSize, targetWidth, to, top, width, _i, _j, _k, _l, _len, _len1, _len2, _len3, _len4, _len5, _m, _n, _ref1, _ref2, _ref3, _ref4, _ref5, _ref6, _ref7, _ref8, - _this = this; - top = _arg.top, left = _arg.left, targetAttachment = _arg.targetAttachment; - if (!this.options.constraints) { - return true; - } - removeClass = function(prefix) { - var side, _i, _len, _results; - _this.removeClass(prefix); - _results = []; - for (_i = 0, _len = BOUNDS_FORMAT.length; _i < _len; _i++) { - side = BOUNDS_FORMAT[_i]; - _results.push(_this.removeClass("" + prefix + "-" + side)); - } - return _results; - }; - _ref1 = this.cache('element-bounds', function() { - return getBounds(_this.element); - }), height = _ref1.height, width = _ref1.width; - if (width === 0 && height === 0 && (this.lastSize != null)) { - _ref2 = this.lastSize, width = _ref2.width, height = _ref2.height; - } - targetSize = this.cache('target-bounds', function() { - return _this.getTargetBounds(); - }); - targetHeight = targetSize.height; - targetWidth = targetSize.width; - tAttachment = {}; - eAttachment = {}; - allClasses = [this.getClass('pinned'), this.getClass('out-of-bounds')]; - _ref3 = this.options.constraints; - for (_i = 0, _len = _ref3.length; _i < _len; _i++) { - constraint = _ref3[_i]; - if (constraint.outOfBoundsClass) { - allClasses.push(constraint.outOfBoundsClass); - } - if (constraint.pinnedClass) { - allClasses.push(constraint.pinnedClass); - } - } - for (_j = 0, _len1 = allClasses.length; _j < _len1; _j++) { - cls = allClasses[_j]; - _ref4 = ['left', 'top', 'right', 'bottom']; - for (_k = 0, _len2 = _ref4.length; _k < _len2; _k++) { - side = _ref4[_k]; - allClasses.push("" + cls + "-" + side); - } - } - addClasses = []; - tAttachment = extend({}, targetAttachment); - eAttachment = extend({}, this.attachment); - _ref5 = this.options.constraints; - for (_l = 0, _len3 = _ref5.length; _l < _len3; _l++) { - constraint = _ref5[_l]; - to = constraint.to, attachment = constraint.attachment, pin = constraint.pin; - if (attachment == null) { - attachment = ''; - } - if (__indexOf.call(attachment, ' ') >= 0) { - _ref6 = attachment.split(' '), changeAttachY = _ref6[0], changeAttachX = _ref6[1]; - } else { - changeAttachX = changeAttachY = attachment; - } - bounds = getBoundingRect(this, to); - if (changeAttachY === 'target' || changeAttachY === 'both') { - if (top < bounds[1] && tAttachment.top === 'top') { - top += targetHeight; - tAttachment.top = 'bottom'; - } - if (top + height > bounds[3] && tAttachment.top === 'bottom') { - top -= targetHeight; - tAttachment.top = 'top'; - } - } - if (changeAttachY === 'together') { - if (top < bounds[1] && tAttachment.top === 'top') { - if (eAttachment.top === 'bottom') { - top += targetHeight; - tAttachment.top = 'bottom'; - top += height; - eAttachment.top = 'top'; - } else if (eAttachment.top === 'top') { - top += targetHeight; - tAttachment.top = 'bottom'; - top -= height; - eAttachment.top = 'bottom'; - } - } - if (top + height > bounds[3] && tAttachment.top === 'bottom') { - if (eAttachment.top === 'top') { - top -= targetHeight; - tAttachment.top = 'top'; - top -= height; - eAttachment.top = 'bottom'; - } else if (eAttachment.top === 'bottom') { - top -= targetHeight; - tAttachment.top = 'top'; - top += height; - eAttachment.top = 'top'; - } - } - if (tAttachment.top === 'middle') { - if (top + height > bounds[3] && eAttachment.top === 'top') { - top -= height; - eAttachment.top = 'bottom'; - } else if (top < bounds[1] && eAttachment.top === 'bottom') { - top += height; - eAttachment.top = 'top'; - } - } - } - if (changeAttachX === 'target' || changeAttachX === 'both') { - if (left < bounds[0] && tAttachment.left === 'left') { - left += targetWidth; - tAttachment.left = 'right'; - } - if (left + width > bounds[2] && tAttachment.left === 'right') { - left -= targetWidth; - tAttachment.left = 'left'; - } - } - if (changeAttachX === 'together') { - if (left < bounds[0] && tAttachment.left === 'left') { - if (eAttachment.left === 'right') { - left += targetWidth; - tAttachment.left = 'right'; - left += width; - eAttachment.left = 'left'; - } else if (eAttachment.left === 'left') { - left += targetWidth; - tAttachment.left = 'right'; - left -= width; - eAttachment.left = 'right'; - } - } else if (left + width > bounds[2] && tAttachment.left === 'right') { - if (eAttachment.left === 'left') { - left -= targetWidth; - tAttachment.left = 'left'; - left -= width; - eAttachment.left = 'right'; - } else if (eAttachment.left === 'right') { - left -= targetWidth; - tAttachment.left = 'left'; - left += width; - eAttachment.left = 'left'; - } - } else if (tAttachment.left === 'center') { - if (left + width > bounds[2] && eAttachment.left === 'left') { - left -= width; - eAttachment.left = 'right'; - } else if (left < bounds[0] && eAttachment.left === 'right') { - left += width; - eAttachment.left = 'left'; - } - } - } - if (changeAttachY === 'element' || changeAttachY === 'both') { - if (top < bounds[1] && eAttachment.top === 'bottom') { - top += height; - eAttachment.top = 'top'; - } - if (top + height > bounds[3] && eAttachment.top === 'top') { - top -= height; - eAttachment.top = 'bottom'; - } - } - if (changeAttachX === 'element' || changeAttachX === 'both') { - if (left < bounds[0] && eAttachment.left === 'right') { - left += width; - eAttachment.left = 'left'; - } - if (left + width > bounds[2] && eAttachment.left === 'left') { - left -= width; - eAttachment.left = 'right'; - } - } - if (typeof pin === 'string') { - pin = (function() { - var _len4, _m, _ref7, _results; - _ref7 = pin.split(','); - _results = []; - for (_m = 0, _len4 = _ref7.length; _m < _len4; _m++) { - p = _ref7[_m]; - _results.push(p.trim()); - } - return _results; - })(); - } else if (pin === true) { - pin = ['top', 'left', 'right', 'bottom']; - } - pin || (pin = []); - pinned = []; - oob = []; - if (top < bounds[1]) { - if (__indexOf.call(pin, 'top') >= 0) { - top = bounds[1]; - pinned.push('top'); - } else { - oob.push('top'); - } - } - if (top + height > bounds[3]) { - if (__indexOf.call(pin, 'bottom') >= 0) { - top = bounds[3] - height; - pinned.push('bottom'); - } else { - oob.push('bottom'); - } - } - if (left < bounds[0]) { - if (__indexOf.call(pin, 'left') >= 0) { - left = bounds[0]; - pinned.push('left'); - } else { - oob.push('left'); - } - } - if (left + width > bounds[2]) { - if (__indexOf.call(pin, 'right') >= 0) { - left = bounds[2] - width; - pinned.push('right'); - } else { - oob.push('right'); - } - } - if (pinned.length) { - pinnedClass = (_ref7 = this.options.pinnedClass) != null ? _ref7 : this.getClass('pinned'); - addClasses.push(pinnedClass); - for (_m = 0, _len4 = pinned.length; _m < _len4; _m++) { - side = pinned[_m]; - addClasses.push("" + pinnedClass + "-" + side); - } - } - if (oob.length) { - oobClass = (_ref8 = this.options.outOfBoundsClass) != null ? _ref8 : this.getClass('out-of-bounds'); - addClasses.push(oobClass); - for (_n = 0, _len5 = oob.length; _n < _len5; _n++) { - side = oob[_n]; - addClasses.push("" + oobClass + "-" + side); - } - } - if (__indexOf.call(pinned, 'left') >= 0 || __indexOf.call(pinned, 'right') >= 0) { - eAttachment.left = tAttachment.left = false; - } - if (__indexOf.call(pinned, 'top') >= 0 || __indexOf.call(pinned, 'bottom') >= 0) { - eAttachment.top = tAttachment.top = false; - } - if (tAttachment.top !== targetAttachment.top || tAttachment.left !== targetAttachment.left || eAttachment.top !== this.attachment.top || eAttachment.left !== this.attachment.left) { - this.updateAttachClasses(eAttachment, tAttachment); - } - } - defer(function() { - updateClasses(_this.target, addClasses, allClasses); - return updateClasses(_this.element, addClasses, allClasses); - }); - return { - top: top, - left: left - }; - } - }); - -}).call(this); diff --git a/js/markAttachment.js b/js/markAttachment.js deleted file mode 100644 index a6d8f80b5..000000000 --- a/js/markAttachment.js +++ /dev/null @@ -1,46 +0,0 @@ -(function() { - this.Tether.modules.push({ - initialize: function() { - var dot, el, type, _i, _len, _ref, _results; - this.markers = {}; - _ref = ['target', 'element']; - _results = []; - for (_i = 0, _len = _ref.length; _i < _len; _i++) { - type = _ref[_i]; - el = document.createElement('div'); - el.className = this.getClass("" + type + "-marker"); - dot = document.createElement('div'); - dot.className = this.getClass('marker-dot'); - el.appendChild(dot); - this[type].appendChild(el); - _results.push(this.markers[type] = { - dot: dot, - el: el - }); - } - return _results; - }, - position: function(_arg) { - var manualOffset, manualTargetOffset, offset, offsets, side, type, val; - manualOffset = _arg.manualOffset, manualTargetOffset = _arg.manualTargetOffset; - offsets = { - element: manualOffset, - target: manualTargetOffset - }; - for (type in offsets) { - offset = offsets[type]; - for (side in offset) { - val = offset[side]; - if (typeof val !== 'string' || (val.indexOf('%') === -1 && val.indexOf('px') === -1)) { - val += 'px'; - } - if (this.markers[type].dot.style[side] !== val) { - this.markers[type].dot.style[side] = val; - } - } - } - return true; - } - }); - -}).call(this); diff --git a/js/shift.js b/js/shift.js deleted file mode 100644 index 58b935f6b..000000000 --- a/js/shift.js +++ /dev/null @@ -1,38 +0,0 @@ -(function() { - this.Tether.modules.push({ - position: function(_arg) { - var left, result, shift, shiftLeft, shiftTop, top, _ref; - top = _arg.top, left = _arg.left; - if (!this.options.shift) { - return; - } - result = function(val) { - if (typeof val === 'function') { - return val.call(this, { - top: top, - left: left - }); - } else { - return val; - } - }; - shift = result(this.options.shift); - if (typeof shift === 'string') { - shift = shift.split(' '); - shift[1] || (shift[1] = shift[0]); - shiftTop = shift[0], shiftLeft = shift[1]; - shiftTop = parseFloat(shiftTop, 10); - shiftLeft = parseFloat(shiftLeft, 10); - } else { - _ref = [shift.top, shift.left], shiftTop = _ref[0], shiftLeft = _ref[1]; - } - top += shiftTop; - left += shiftLeft; - return { - top: top, - left: left - }; - } - }); - -}).call(this); diff --git a/js/tether.js b/js/tether.js deleted file mode 100644 index 92f64854a..000000000 --- a/js/tether.js +++ /dev/null @@ -1,686 +0,0 @@ -(function() { - var MIRROR_LR, MIRROR_TB, OFFSET_MAP, Tether, addClass, addOffset, attachmentToOffset, autoToFixedAttachment, defer, extend, flush, getBounds, getOffsetParent, getOuterSize, getScrollBarSize, getScrollParent, getSize, now, offsetToPx, parseAttachment, parseOffset, position, removeClass, tethers, transformKey, updateClasses, within, _Tether, _ref, - __slice = [].slice, - __bind = function(fn, me){ return function(){ return fn.apply(me, arguments); }; }; - - if (this.Tether == null) { - throw new Error("You must include the utils.js file before tether.js"); - } - - Tether = this.Tether; - - _ref = Tether.Utils, getScrollParent = _ref.getScrollParent, getSize = _ref.getSize, getOuterSize = _ref.getOuterSize, getBounds = _ref.getBounds, getOffsetParent = _ref.getOffsetParent, extend = _ref.extend, addClass = _ref.addClass, removeClass = _ref.removeClass, updateClasses = _ref.updateClasses, defer = _ref.defer, flush = _ref.flush, getScrollBarSize = _ref.getScrollBarSize; - - within = function(a, b, diff) { - if (diff == null) { - diff = 1; - } - return (a + diff >= b && b >= a - diff); - }; - - transformKey = (function() { - var el, key, _i, _len, _ref1; - el = document.createElement('div'); - _ref1 = ['transform', 'webkitTransform', 'OTransform', 'MozTransform', 'msTransform']; - for (_i = 0, _len = _ref1.length; _i < _len; _i++) { - key = _ref1[_i]; - if (el.style[key] !== void 0) { - return key; - } - } - })(); - - tethers = []; - - position = function() { - var tether, _i, _len; - for (_i = 0, _len = tethers.length; _i < _len; _i++) { - tether = tethers[_i]; - tether.position(false); - } - return flush(); - }; - - now = function() { - var _ref1; - return (_ref1 = typeof performance !== "undefined" && performance !== null ? typeof performance.now === "function" ? performance.now() : void 0 : void 0) != null ? _ref1 : +(new Date); - }; - - (function() { - var event, lastCall, lastDuration, pendingTimeout, tick, _i, _len, _ref1, _results; - lastCall = null; - lastDuration = null; - pendingTimeout = null; - tick = function() { - if ((lastDuration != null) && lastDuration > 16) { - lastDuration = Math.min(lastDuration - 16, 250); - pendingTimeout = setTimeout(tick, 250); - return; - } - if ((lastCall != null) && (now() - lastCall) < 10) { - return; - } - if (pendingTimeout != null) { - clearTimeout(pendingTimeout); - pendingTimeout = null; - } - lastCall = now(); - position(); - return lastDuration = now() - lastCall; - }; - _ref1 = ['resize', 'scroll', 'touchmove']; - _results = []; - for (_i = 0, _len = _ref1.length; _i < _len; _i++) { - event = _ref1[_i]; - _results.push(window.addEventListener(event, tick)); - } - return _results; - })(); - - MIRROR_LR = { - center: 'center', - left: 'right', - right: 'left' - }; - - MIRROR_TB = { - middle: 'middle', - top: 'bottom', - bottom: 'top' - }; - - OFFSET_MAP = { - top: 0, - left: 0, - middle: '50%', - center: '50%', - bottom: '100%', - right: '100%' - }; - - autoToFixedAttachment = function(attachment, relativeToAttachment) { - var left, top; - left = attachment.left, top = attachment.top; - if (left === 'auto') { - left = MIRROR_LR[relativeToAttachment.left]; - } - if (top === 'auto') { - top = MIRROR_TB[relativeToAttachment.top]; - } - return { - left: left, - top: top - }; - }; - - attachmentToOffset = function(attachment) { - var _ref1, _ref2; - return { - left: (_ref1 = OFFSET_MAP[attachment.left]) != null ? _ref1 : attachment.left, - top: (_ref2 = OFFSET_MAP[attachment.top]) != null ? _ref2 : attachment.top - }; - }; - - addOffset = function() { - var left, offsets, out, top, _i, _len, _ref1; - offsets = 1 <= arguments.length ? __slice.call(arguments, 0) : []; - out = { - top: 0, - left: 0 - }; - for (_i = 0, _len = offsets.length; _i < _len; _i++) { - _ref1 = offsets[_i], top = _ref1.top, left = _ref1.left; - if (typeof top === 'string') { - top = parseFloat(top, 10); - } - if (typeof left === 'string') { - left = parseFloat(left, 10); - } - out.top += top; - out.left += left; - } - return out; - }; - - offsetToPx = function(offset, size) { - if (typeof offset.left === 'string' && offset.left.indexOf('%') !== -1) { - offset.left = parseFloat(offset.left, 10) / 100 * size.width; - } - if (typeof offset.top === 'string' && offset.top.indexOf('%') !== -1) { - offset.top = parseFloat(offset.top, 10) / 100 * size.height; - } - return offset; - }; - - parseAttachment = parseOffset = function(value) { - var left, top, _ref1; - _ref1 = value.split(' '), top = _ref1[0], left = _ref1[1]; - return { - top: top, - left: left - }; - }; - - _Tether = (function() { - _Tether.modules = []; - - function _Tether(options) { - this.position = __bind(this.position, this); - var module, _i, _len, _ref1, _ref2; - tethers.push(this); - this.history = []; - this.setOptions(options, false); - _ref1 = Tether.modules; - for (_i = 0, _len = _ref1.length; _i < _len; _i++) { - module = _ref1[_i]; - if ((_ref2 = module.initialize) != null) { - _ref2.call(this); - } - } - this.position(); - } - - _Tether.prototype.getClass = function(key) { - var _ref1, _ref2; - if ((_ref1 = this.options.classes) != null ? _ref1[key] : void 0) { - return this.options.classes[key]; - } else if (((_ref2 = this.options.classes) != null ? _ref2[key] : void 0) !== false) { - if (this.options.classPrefix) { - return "" + this.options.classPrefix + "-" + key; - } else { - return key; - } - } else { - return ''; - } - }; - - _Tether.prototype.setOptions = function(options, position) { - var defaults, key, _i, _len, _ref1, _ref2; - this.options = options; - if (position == null) { - position = true; - } - defaults = { - offset: '0 0', - targetOffset: '0 0', - targetAttachment: 'auto auto', - classPrefix: 'tether' - }; - this.options = extend(defaults, this.options); - _ref1 = this.options, this.element = _ref1.element, this.target = _ref1.target, this.targetModifier = _ref1.targetModifier; - if (this.target === 'viewport') { - this.target = document.body; - this.targetModifier = 'visible'; - } else if (this.target === 'scroll-handle') { - this.target = document.body; - this.targetModifier = 'scroll-handle'; - } - _ref2 = ['element', 'target']; - for (_i = 0, _len = _ref2.length; _i < _len; _i++) { - key = _ref2[_i]; - if (this[key] == null) { - throw new Error("Tether Error: Both element and target must be defined"); - } - if (this[key].jquery != null) { - this[key] = this[key][0]; - } else if (typeof this[key] === 'string') { - this[key] = document.querySelector(this[key]); - } - } - addClass(this.element, this.getClass('element')); - addClass(this.target, this.getClass('target')); - if (!this.options.attachment) { - throw new Error("Tether Error: You must provide an attachment"); - } - this.targetAttachment = parseAttachment(this.options.targetAttachment); - this.attachment = parseAttachment(this.options.attachment); - this.offset = parseOffset(this.options.offset); - this.targetOffset = parseOffset(this.options.targetOffset); - if (this.scrollParent != null) { - this.disable(); - } - if (this.targetModifier === 'scroll-handle') { - this.scrollParent = this.target; - } else { - this.scrollParent = getScrollParent(this.target); - } - if (this.options.enabled !== false) { - return this.enable(position); - } - }; - - _Tether.prototype.getTargetBounds = function() { - var bounds, fitAdj, hasBottomScroll, height, out, scrollBottom, scrollPercentage, style, target; - if (this.targetModifier != null) { - switch (this.targetModifier) { - case 'visible': - if (this.target === document.body) { - return { - top: pageYOffset, - left: pageXOffset, - height: innerHeight, - width: innerWidth - }; - } else { - bounds = getBounds(this.target); - out = { - height: bounds.height, - width: bounds.width, - top: bounds.top, - left: bounds.left - }; - out.height = Math.min(out.height, bounds.height - (pageYOffset - bounds.top)); - out.height = Math.min(out.height, bounds.height - ((bounds.top + bounds.height) - (pageYOffset + innerHeight))); - out.height = Math.min(innerHeight, out.height); - out.height -= 2; - out.width = Math.min(out.width, bounds.width - (pageXOffset - bounds.left)); - out.width = Math.min(out.width, bounds.width - ((bounds.left + bounds.width) - (pageXOffset + innerWidth))); - out.width = Math.min(innerWidth, out.width); - out.width -= 2; - if (out.top < pageYOffset) { - out.top = pageYOffset; - } - if (out.left < pageXOffset) { - out.left = pageXOffset; - } - return out; - } - break; - case 'scroll-handle': - target = this.target; - if (target === document.body) { - target = document.documentElement; - bounds = { - left: pageXOffset, - top: pageYOffset, - height: innerHeight, - width: innerWidth - }; - } else { - bounds = getBounds(target); - } - style = getComputedStyle(target); - hasBottomScroll = target.scrollWidth > target.clientWidth || 'scroll' === [style.overflow, style.overflowX] || this.target !== document.body; - scrollBottom = 0; - if (hasBottomScroll) { - scrollBottom = 15; - } - height = bounds.height - parseFloat(style.borderTopWidth) - parseFloat(style.borderBottomWidth) - scrollBottom; - out = { - width: 15, - height: height * 0.975 * (height / target.scrollHeight), - left: bounds.left + bounds.width - parseFloat(style.borderLeftWidth) - 15 - }; - fitAdj = 0; - if (height < 408 && this.target === document.body) { - fitAdj = -0.00011 * Math.pow(height, 2) - 0.00727 * height + 22.58; - } - if (this.target !== document.body) { - out.height = Math.max(out.height, 24); - } - scrollPercentage = this.target.scrollTop / (target.scrollHeight - height); - out.top = scrollPercentage * (height - out.height - fitAdj) + bounds.top + parseFloat(style.borderTopWidth); - if (this.target === document.body) { - out.height = Math.max(out.height, 24); - } - return out; - } - } else { - return getBounds(this.target); - } - }; - - _Tether.prototype.clearCache = function() { - return this._cache = {}; - }; - - _Tether.prototype.cache = function(k, getter) { - if (this._cache == null) { - this._cache = {}; - } - if (this._cache[k] == null) { - this._cache[k] = getter.call(this); - } - return this._cache[k]; - }; - - _Tether.prototype.enable = function(position) { - if (position == null) { - position = true; - } - addClass(this.target, this.getClass('enabled')); - addClass(this.element, this.getClass('enabled')); - this.enabled = true; - if (this.scrollParent !== document) { - this.scrollParent.addEventListener('scroll', this.position); - } - if (position) { - return this.position(); - } - }; - - _Tether.prototype.disable = function() { - removeClass(this.target, this.getClass('enabled')); - removeClass(this.element, this.getClass('enabled')); - this.enabled = false; - if (this.scrollParent != null) { - return this.scrollParent.removeEventListener('scroll', this.position); - } - }; - - _Tether.prototype.destroy = function() { - var i, tether, _i, _len, _results; - this.disable(); - _results = []; - for (i = _i = 0, _len = tethers.length; _i < _len; i = ++_i) { - tether = tethers[i]; - if (tether === this) { - tethers.splice(i, 1); - break; - } else { - _results.push(void 0); - } - } - return _results; - }; - - _Tether.prototype.updateAttachClasses = function(elementAttach, targetAttach) { - var add, all, side, sides, _i, _j, _len, _len1, _ref1, - _this = this; - if (elementAttach == null) { - elementAttach = this.attachment; - } - if (targetAttach == null) { - targetAttach = this.targetAttachment; - } - sides = ['left', 'top', 'bottom', 'right', 'middle', 'center']; - if ((_ref1 = this._addAttachClasses) != null ? _ref1.length : void 0) { - this._addAttachClasses.splice(0, this._addAttachClasses.length); - } - add = this._addAttachClasses != null ? this._addAttachClasses : this._addAttachClasses = []; - if (elementAttach.top) { - add.push("" + (this.getClass('element-attached')) + "-" + elementAttach.top); - } - if (elementAttach.left) { - add.push("" + (this.getClass('element-attached')) + "-" + elementAttach.left); - } - if (targetAttach.top) { - add.push("" + (this.getClass('target-attached')) + "-" + targetAttach.top); - } - if (targetAttach.left) { - add.push("" + (this.getClass('target-attached')) + "-" + targetAttach.left); - } - all = []; - for (_i = 0, _len = sides.length; _i < _len; _i++) { - side = sides[_i]; - all.push("" + (this.getClass('element-attached')) + "-" + side); - } - for (_j = 0, _len1 = sides.length; _j < _len1; _j++) { - side = sides[_j]; - all.push("" + (this.getClass('target-attached')) + "-" + side); - } - return defer(function() { - if (_this._addAttachClasses == null) { - return; - } - updateClasses(_this.element, _this._addAttachClasses, all); - updateClasses(_this.target, _this._addAttachClasses, all); - return _this._addAttachClasses = void 0; - }); - }; - - _Tether.prototype.position = function(flushChanges) { - var elementPos, elementStyle, height, left, manualOffset, manualTargetOffset, module, next, offset, offsetBorder, offsetParent, offsetParentSize, offsetParentStyle, offsetPosition, ret, scrollLeft, scrollTop, scrollbarSize, side, targetAttachment, targetOffset, targetPos, targetSize, top, width, _i, _j, _len, _len1, _ref1, _ref2, _ref3, _ref4, _ref5, _ref6, - _this = this; - if (flushChanges == null) { - flushChanges = true; - } - if (!this.enabled) { - return; - } - this.clearCache(); - targetAttachment = autoToFixedAttachment(this.targetAttachment, this.attachment); - this.updateAttachClasses(this.attachment, targetAttachment); - elementPos = this.cache('element-bounds', function() { - return getBounds(_this.element); - }); - width = elementPos.width, height = elementPos.height; - if (width === 0 && height === 0 && (this.lastSize != null)) { - _ref1 = this.lastSize, width = _ref1.width, height = _ref1.height; - } else { - this.lastSize = { - width: width, - height: height - }; - } - targetSize = targetPos = this.cache('target-bounds', function() { - return _this.getTargetBounds(); - }); - offset = offsetToPx(attachmentToOffset(this.attachment), { - width: width, - height: height - }); - targetOffset = offsetToPx(attachmentToOffset(targetAttachment), targetSize); - manualOffset = offsetToPx(this.offset, { - width: width, - height: height - }); - manualTargetOffset = offsetToPx(this.targetOffset, targetSize); - offset = addOffset(offset, manualOffset); - targetOffset = addOffset(targetOffset, manualTargetOffset); - left = targetPos.left + targetOffset.left - offset.left; - top = targetPos.top + targetOffset.top - offset.top; - _ref2 = Tether.modules; - for (_i = 0, _len = _ref2.length; _i < _len; _i++) { - module = _ref2[_i]; - ret = module.position.call(this, { - left: left, - top: top, - targetAttachment: targetAttachment, - targetPos: targetPos, - attachment: this.attachment, - elementPos: elementPos, - offset: offset, - targetOffset: targetOffset, - manualOffset: manualOffset, - manualTargetOffset: manualTargetOffset, - scrollbarSize: scrollbarSize - }); - if ((ret == null) || typeof ret !== 'object') { - continue; - } else if (ret === false) { - return false; - } else { - top = ret.top, left = ret.left; - } - } - next = { - page: { - top: top, - left: left - }, - viewport: { - top: top - pageYOffset, - bottom: pageYOffset - top - height + innerHeight, - left: left - pageXOffset, - right: pageXOffset - left - width + innerWidth - } - }; - if (document.body.scrollWidth > window.innerWidth) { - scrollbarSize = this.cache('scrollbar-size', getScrollBarSize); - next.viewport.bottom -= scrollbarSize.height; - } - if (document.body.scrollHeight > window.innerHeight) { - scrollbarSize = this.cache('scrollbar-size', getScrollBarSize); - next.viewport.right -= scrollbarSize.width; - } - if (((_ref3 = document.body.style.position) !== '' && _ref3 !== 'static') || ((_ref4 = document.body.parentElement.style.position) !== '' && _ref4 !== 'static')) { - next.page.bottom = document.body.scrollHeight - top - height; - next.page.right = document.body.scrollWidth - left - width; - } - if (((_ref5 = this.options.optimizations) != null ? _ref5.moveElement : void 0) !== false && (this.targetModifier == null)) { - offsetParent = this.cache('target-offsetparent', function() { - return getOffsetParent(_this.target); - }); - offsetPosition = this.cache('target-offsetparent-bounds', function() { - return getBounds(offsetParent); - }); - offsetParentStyle = getComputedStyle(offsetParent); - elementStyle = getComputedStyle(this.element); - offsetParentSize = offsetPosition; - offsetBorder = {}; - _ref6 = ['Top', 'Left', 'Bottom', 'Right']; - for (_j = 0, _len1 = _ref6.length; _j < _len1; _j++) { - side = _ref6[_j]; - offsetBorder[side.toLowerCase()] = parseFloat(offsetParentStyle["border" + side + "Width"]); - } - offsetPosition.right = document.body.scrollWidth - offsetPosition.left - offsetParentSize.width + offsetBorder.right; - offsetPosition.bottom = document.body.scrollHeight - offsetPosition.top - offsetParentSize.height + offsetBorder.bottom; - if (next.page.top >= (offsetPosition.top + offsetBorder.top) && next.page.bottom >= offsetPosition.bottom) { - if (next.page.left >= (offsetPosition.left + offsetBorder.left) && next.page.right >= offsetPosition.right) { - scrollTop = offsetParent.scrollTop; - scrollLeft = offsetParent.scrollLeft; - next.offset = { - top: next.page.top - offsetPosition.top + scrollTop - offsetBorder.top, - left: next.page.left - offsetPosition.left + scrollLeft - offsetBorder.left - }; - } - } - } - this.move(next); - this.history.unshift(next); - if (this.history.length > 3) { - this.history.pop(); - } - if (flushChanges) { - flush(); - } - return true; - }; - - _Tether.prototype.move = function(position) { - var css, elVal, found, key, moved, offsetParent, point, same, transcribe, type, val, write, writeCSS, _i, _len, _ref1, _ref2, - _this = this; - if (this.element.parentNode == null) { - return; - } - same = {}; - for (type in position) { - same[type] = {}; - for (key in position[type]) { - found = false; - _ref1 = this.history; - for (_i = 0, _len = _ref1.length; _i < _len; _i++) { - point = _ref1[_i]; - if (!within((_ref2 = point[type]) != null ? _ref2[key] : void 0, position[type][key])) { - found = true; - break; - } - } - if (!found) { - same[type][key] = true; - } - } - } - css = { - top: '', - left: '', - right: '', - bottom: '' - }; - transcribe = function(same, pos) { - var xPos, yPos, _ref3; - if (((_ref3 = _this.options.optimizations) != null ? _ref3.gpu : void 0) !== false) { - if (same.top) { - css.top = 0; - yPos = pos.top; - } else { - css.bottom = 0; - yPos = -pos.bottom; - } - if (same.left) { - css.left = 0; - xPos = pos.left; - } else { - css.right = 0; - xPos = -pos.right; - } - css[transformKey] = "translateX(" + (Math.round(xPos)) + "px) translateY(" + (Math.round(yPos)) + "px)"; - if (transformKey !== 'msTransform') { - return css[transformKey] += " translateZ(0)"; - } - } else { - if (same.top) { - css.top = "" + pos.top + "px"; - } else { - css.bottom = "" + pos.bottom + "px"; - } - if (same.left) { - return css.left = "" + pos.left + "px"; - } else { - return css.right = "" + pos.right + "px"; - } - } - }; - moved = false; - if ((same.page.top || same.page.bottom) && (same.page.left || same.page.right)) { - css.position = 'absolute'; - transcribe(same.page, position.page); - } else if ((same.viewport.top || same.viewport.bottom) && (same.viewport.left || same.viewport.right)) { - css.position = 'fixed'; - transcribe(same.viewport, position.viewport); - } else if ((same.offset != null) && same.offset.top && same.offset.left) { - css.position = 'absolute'; - offsetParent = this.cache('target-offsetparent', function() { - return getOffsetParent(_this.target); - }); - if (getOffsetParent(this.element) !== offsetParent) { - defer(function() { - _this.element.parentNode.removeChild(_this.element); - return offsetParent.appendChild(_this.element); - }); - } - transcribe(same.offset, position.offset); - moved = true; - } else { - css.position = 'absolute'; - transcribe({ - top: true, - left: true - }, position.page); - } - if (!moved && this.element.parentNode.tagName !== 'BODY') { - this.element.parentNode.removeChild(this.element); - document.body.appendChild(this.element); - } - writeCSS = {}; - write = false; - for (key in css) { - val = css[key]; - elVal = this.element.style[key]; - if (elVal !== '' && val !== '' && (key === 'top' || key === 'left' || key === 'bottom' || key === 'right')) { - elVal = parseFloat(elVal); - val = parseFloat(val); - } - if (elVal !== val) { - write = true; - writeCSS[key] = css[key]; - } - } - if (write) { - return defer(function() { - return extend(_this.element.style, writeCSS); - }); - } - }; - - return _Tether; - - })(); - - Tether.position = position; - - this.Tether = extend(_Tether, Tether); - -}).call(this); diff --git a/js/tether.min.js b/js/tether.min.js deleted file mode 100644 index e8993a1a7..000000000 --- a/js/tether.min.js +++ /dev/null @@ -1,2 +0,0 @@ -/*! tether.js 0.2.9 */ -(function(){var a,b,c,d,e,f,g,h,i={}.hasOwnProperty,j=[].slice;null==window.Tether&&(window.Tether={}),f=function(a){var b,c,d,e,f;if(c=getComputedStyle(a).position,"fixed"===c)return a;for(d=void 0,b=a;b=b.parentNode;){if(!(e=getComputedStyle(b)))return b;if(/(auto|scroll)/.test(e.overflow+e["overflow-y"]+e["overflow-x"])&&("absolute"!==c||"relative"===(f=e.position)||"absolute"===f||"fixed"===f))return b}return document.body},d=function(a){var b,d,e,f;return d=a.ownerDocument,e=d.documentElement,b=c({},a.getBoundingClientRect()),b.top=b.top+window.pageYOffset-e.clientTop,b.left=b.left+window.pageXOffset-e.clientLeft,b.right=d.body.clientWidth-b.width-b.left,b.bottom=d.body.clientHeight-b.height-b.top,b.height&&b.width||(f=getComputedStyle(a),b.height||(b.height=parseFloat(f.height)),b.width||(b.width=parseFloat(f.width))),b},e=function(a){return a.offsetParent||document.documentElement},c=function(a){var b,c,d,e,f,g,h;for(null==a&&(a={}),b=[],Array.prototype.push.apply(b,arguments),h=b.slice(1),f=0,g=h.length;g>f;f++)if(d=h[f])for(c in d)i.call(d,c)&&(e=d[c],a[c]=e);return a},h=function(a,b){var c,d,e,f,g;if(null!=a.classList){for(f=b.split(" "),g=[],d=0,e=f.length;e>d;d++)c=f[d],g.push(a.classList.remove(c));return g}return a.className=a.className.replace(new RegExp("(^| )"+b.split(" ").join("|")+"( |$)","gi")," ")},b=function(a,b){var c,d,e,f,g;if(null!=a.classList){for(f=b.split(" "),g=[],d=0,e=f.length;e>d;d++)c=f[d],g.push(a.classList.add(c));return g}return h(a,b),a.className+=" "+b},g=function(a,b){return null!=a.classList?a.classList.contains(b):new RegExp("(^| )"+b+"( |$)","gi").test(a.className)},a=function(){function a(){}return a.prototype.on=function(a,b,c,d){var e;return null==d&&(d=!1),null==this.bindings&&(this.bindings={}),null==(e=this.bindings)[a]&&(e[a]=[]),this.bindings[a].push({handler:b,ctx:c,once:d})},a.prototype.once=function(a,b,c){return this.on(a,b,c,!0)},a.prototype.off=function(a,b){var c,d,e;if(null!=(null!=(d=this.bindings)?d[a]:void 0)){if(null==b)return delete this.bindings[a];for(c=0,e=[];cb;b++)a=v[b],d.push(a.position());return d},p=null,A=["resize","scroll"],x=0,y=A.length;y>x;x++)i=A[x],window.addEventListener(i,function(){return null==p||new Date-p>16?(p=+new Date,t()):void 0});a={center:"center",left:"right",right:"left"},b={middle:"middle",top:"bottom",bottom:"top"},c={top:0,left:0,middle:"50%",center:"50%",bottom:"100%",right:"100%"},g=function(c,d){var e,f;return e=c.left,f=c.top,"auto"===e&&(e=a[d.left]),"auto"===f&&(f=b[d.top]),{left:e,top:f}},f=function(a){var b,d;return{left:null!=(b=c[a.left])?b:a.left,top:null!=(d=c[a.top])?d:a.top}},e=function(){var a,b,c,d,e,f,g;for(b=1<=arguments.length?B.call(arguments,0):[],c={top:0,left:0},e=0,f=b.length;f>e;e++)g=b[e],d=g.top,a=g.left,"string"==typeof d&&(d=parseFloat(d,10)),"string"==typeof a&&(a=parseFloat(a,10)),c.top+=d,c.left+=a;return c},q=function(a,b){return"string"==typeof a.left&&-1!==a.left.indexOf("%")&&(a.left=parseFloat(a.left,10)/100*b.width),"string"==typeof a.top&&-1!==a.top.indexOf("%")&&(a.top=parseFloat(a.top,10)/100*b.height),a},r=s=function(a){var b,c,d;return d=a.split(" "),c=d[0],b=d[1],{top:c,left:b}},w=function(){function a(a){this.position=C(this.position,this);var b,c,d,e,f;for(v.push(this),this.history=[],this.setOptions(a,!1),e=Tether.modules,c=0,d=e.length;d>c;c++)b=e[c],null!=(f=b.initialize)&&f.call(this);this.position()}return a.modules=[],a.prototype.getClass=function(a){var b,c;return(null!=(b=this.options.classes)?b[a]:void 0)?this.options.classes[a]:(null!=(c=this.options.classes)?c[a]:void 0)!==!1?this.options.classPrefix?""+this.options.classPrefix+"-"+a:a:""},a.prototype.setOptions=function(a,b){var c,e,f,g,h,i;for(this.options=a,null==b&&(b=!0),c={offset:"0 0",targetOffset:"0 0",targetAttachment:"auto auto",classPrefix:"tether"},this.options=j(c,this.options),h=this.options,this.element=h.element,this.target=h.target,this.targetModifier=h.targetModifier,"viewport"===this.target?(this.target=document.body,this.targetModifier="visible"):"scroll-handle"===this.target&&(this.target=document.body,this.targetModifier="scroll-handle"),i=["element","target"],f=0,g=i.length;g>f;f++)if(e=i[f],null!=this[e].jquery?this[e]=this[e][0]:"string"==typeof this[e]&&(this[e]=document.querySelector(this[e])),null==this[e])throw new Error("Tether Error: Both element and target must be defined");if(d(this.element,this.getClass("element")),d(this.target,this.getClass("target")),!this.options.attachment)throw new Error("Tether Error: You must provide an attachment");return this.targetAttachment=r(this.options.targetAttachment),this.attachment=r(this.options.attachment),this.offset=s(this.options.offset),this.targetOffset=s(this.options.targetOffset),null!=this.scrollParent&&this.disable(),this.scrollParent=n(this.target),this.options.enabled!==!1?this.enable(b):void 0},a.prototype.getTargetBounds=function(){if(null==this.targetModifier)return k(this.target);switch(this.targetModifier){case"visible":return{top:pageYOffset,left:pageXOffset,height:innerHeight,width:innerWidth};case"scroll-handle":return{top:pageYOffset+innerHeight*(pageYOffset/document.body.scrollHeight),left:innerWidth-15,height:.98*innerHeight*(innerHeight/document.body.scrollHeight),width:15}}},a.prototype.clearCache=function(){return this._cache={}},a.prototype.cache=function(a,b){return null==this._cache&&(this._cache={}),null==this._cache[a]&&(this._cache[a]=b.call(this)),this._cache[a]},a.prototype.enable=function(a){var b=this;return null==a&&(a=!0),this.addClass(this.getClass("enabled")),this.enabled=!0,this.scrollParent.addEventListener("scroll",this.position),a?setTimeout(function(){return b.position()}):void 0},a.prototype.disable=function(){return this.removeClass(this.getClass("enabled")),this.enabled=!1,null!=this.scrollParent?this.scrollParent.removeEventListener("scroll",this.position):void 0},a.prototype.destroy=function(){var a,b,c,d,e;for(this.disable(),e=[],a=c=0,d=v.length;d>c;a=++c){if(b=v[a],b===this){v.splice(a,1);break}e.push(void 0)}return e},a.prototype.updateAttachClasses=function(a,b){var c,d,e,f,g,h;for(null==a&&(a=this.attachment),null==b&&(b=this.targetAttachment),d=["left","top","bottom","right","middle","center"],e=0,g=d.length;g>e;e++)c=d[e],this.removeClass(""+this.getClass("element-attached")+"-"+c);for(a.top&&this.addClass(""+this.getClass("element-attached")+"-"+a.top),a.left&&this.addClass(""+this.getClass("element-attached")+"-"+a.left),f=0,h=d.length;h>f;f++)c=d[f],this.removeClass(""+this.getClass("target-attached")+"-"+c);return b.top&&this.addClass(""+this.getClass("target-attached")+"-"+b.top),b.left?this.addClass(""+this.getClass("target-attached")+"-"+b.left):void 0},a.prototype.addClass=function(a){return d(this.element,a),d(this.target,a)},a.prototype.removeClass=function(a){return u(this.element,a),u(this.target,a)},a.prototype.position=function(){var a,b,c,d,h,i,j,m,n,o,p,r,s,t,u,v,w,x,y,z,A,B,C,D,E,F,G,H,I,J,K=this;if(this.enabled){for(this.clearCache(),x=g(this.targetAttachment,this.attachment),this.updateAttachClasses(this.attachment,x),a=this.cache("element-bounds",function(){return k(K.element)}),C=a.width,b=a.height,A=z=this.cache("target-bounds",function(){return K.getTargetBounds()}),m=q(f(this.attachment),{width:C,height:b}),y=q(f(x),A),d=q(this.offset,{width:C,height:b}),h=q(this.targetOffset,A),m=e(m,d),c=z.left+y.left-m.left,B=z.top+y.top-m.top,H=Tether.modules,D=0,F=H.length;F>D;D++)if(i=H[D],t=i.position.call(this,{left:c,top:B,targetAttachment:x,targetPos:z,elementPos:a,offset:m,targetOffset:y,manualOffset:d,manualTargetOffset:h}),null!=t&&"object"==typeof t){if(t===!1)return!1;B=t.top,c=t.left}if(j={page:{top:B,bottom:document.body.scrollHeight-B-b,left:c,right:document.body.scrollWidth-c-C},viewport:{top:B-pageYOffset,bottom:pageYOffset-B-b+innerHeight,left:c-pageXOffset,right:pageXOffset-c-C+innerWidth}},(null!=(I=this.options.optimizations)?I.moveElement:void 0)!==!1&&null==this.targetModifier){for(o=this.cache("target-offsetparent",function(){return l(K.target)}),s=this.cache("target-offsetparent-bounds",function(){return k(o)}),r=getComputedStyle(o),p=s,n={},J=["top","left","bottom","right"],E=0,G=J.length;G>E;E++)w=J[E],n[w]=parseFloat(r["border-"+w+"-width"]);s.left+=n.left,s.top+=n.top,s.right=document.body.scrollWidth-s.left-p.width,s.bottom=document.body.scrollHeight-s.top-p.height,j.page.top>=s.top&&j.page.bottom>=s.bottom&&j.page.left>=s.left&&j.page.right>=s.right&&(v=o.scrollTop,u=o.scrollLeft,j.offset={top:j.page.top-s.top+v+n.top,left:j.page.left-s.left+u+n.left,right:j.page.right-s.right+o.scrollWidth-u+n.right,bottom:j.page.bottom-s.bottom+o.scrollHeight-v+n.bottom})}return this.move(j),this.history.unshift(j),this.history.length>3&&this.history.pop(),!0}},a.prototype.move=function(a){var b,c,d,e,f,g,h,i,k,m,n,o,p,q,r,s,t,u,v,w,x,y=this;if(null!=this.element.parentNode){k={};for(o in a){k[o]={};for(d in a[o]){for(c=!1,v=this.history,r=0,t=v.length;t>r;r++)if(i=v[r],(null!=(w=i[o])?w[d]:void 0)!==a[o][d]){c=!0;break}c||(k[o][d]=!0)}}if(b={top:"",left:"",right:"",bottom:""},n=function(a,c){return a.top?b.top=""+c.top+"px":b.bottom=""+c.bottom+"px",a.left?b.left=""+c.left+"px":b.right=""+c.right+"px"},e=!1,(k.page.top||k.page.bottom)&&(k.page.left||k.page.right))b.position="absolute",n(k.page,a.page);else if((k.viewport.top||k.viewport.bottom)&&(k.viewport.left||k.viewport.right))b.position="fixed",n(k.viewport,a.viewport);else if(null!=k.offset&&(k.offset.top||k.offset.bottom)&&(k.offset.left||k.offset.right)){for(b.position="absolute",g=this.cache("target-offsetparent",function(){return l(y.target)}),l(this.element)!==g&&(this.element.parentNode.removeChild(this.element),g.appendChild(this.element)),h=getComputedStyle(g),f=j({},a.offset),x=["top","left","bottom","right"],s=0,u=x.length;u>s;s++)m=x[s],f[m]-=parseFloat(h["border-"+m+"-width"]);n(k.offset,f),e=!0}else b.position="absolute",b.top=""+a.page.top+"px",b.left=""+a.page.left+"px";e||"BODY"===this.element.parentNode.tagName||(this.element.parentNode.removeChild(this.element),document.body.appendChild(this.element)),q=!1;for(d in b)if(p=b[d],this.element.style[d]!==p){q=!0;break}return q?j(this.element.style,b):void 0}},a}(),window.Tether=j(w,Tether)}.call(this),function(){var a,b,c,d,e,f,g,h,i=[].indexOf||function(a){for(var b=0,c=this.length;c>b;b++)if(b in this&&this[b]===a)return b;return-1};h=Tether.Utils,f=h.getOuterSize,e=h.getBounds,g=h.getSize,c=h.extend,b={left:"right",right:"left",top:"bottom",bottom:"top",middle:"middle"},a=["left","top","right","bottom"],d=function(b,c){var d,f,g,h,i,j,k;if("scrollParent"===c?c=b.scrollParent:"window"===c&&(c=[pageXOffset,pageYOffset,innerWidth+pageXOffset,innerHeight+pageYOffset]),null!=c.nodeType)for(f=h=e(c),i=getComputedStyle(c),c=[f.left,f.top,h.width+f.left,h.height+f.top],d=j=0,k=a.length;k>j;d=++j)g=a[d],"top"===g||"left"===g?c[d]+=parseFloat(i["border-"+g+"-width"]):c[d]-=parseFloat(i["border-"+g+"-width"]);return c},Tether.modules.push({position:function(b){var f,g,h,j,k,l,m,n,o,p,q,r,s,t,u,v,w,x,y,z,A,B,C,D,E,F,G,H,I,J,K,L,M,N,O,P,Q,R,S,T,U,V,W=this;if(E=b.top,o=b.left,z=b.targetAttachment,!this.options.constraints)return!0;for(v=function(b){var c,d,e,f;for(W.removeClass(b),f=[],d=0,e=a.length;e>d;d++)c=a[d],f.push(W.removeClass(""+b+"-"+c));return f},Q=this.cache("element-bounds",function(){return e(W.element)}),n=Q.height,F=Q.width,B=this.cache("target-bounds",function(){return W.getTargetBounds()}),A=B.height,C=B.width,y={},m={},w=[this.getClass("pinned"),this.getClass("out-of-bounds")],R=this.options.constraints,G=0,K=R.length;K>G;G++)l=R[G],l.outOfBoundsClass&&w.push(l.outOfBoundsClass),l.pinnedClass&&w.push(l.pinnedClass);for(H=0,L=w.length;L>H;H++)k=w[H],v(k);for(y=c({},z),m=c({},this.attachment),S=this.options.constraints,I=0,M=S.length;M>I;I++){if(l=S[I],D=l.to,f=l.attachment,s=l.pin,null==f&&(f=""),i.call(f," ")>=0?(T=f.split(" "),j=T[0],h=T[1]):h=j=f,g=d(this,D),("target"===j||"both"===j)&&(Eg[3]&&"bottom"===y.top&&(E-=A,y.top="top")),"together"===j&&(Eg[3]&&"bottom"===y.top&&("top"===m.top?(E-=A,y.top="top",E-=n,m.top="bottom"):"bottom"===m.top&&(E-=A,y.top="top",E+=n,m.top="top"))),("target"===h||"both"===h)&&(og[2]&&"right"===y.left&&(o-=C,y.left="left")),"together"===h&&(og[2]&&"right"===y.left&&("left"===m.left?(o-=C,y.left="left",o-=F,m.left="right"):"right"===m.left&&(o-=C,y.left="left",o+=F,m.left="left"))),("element"===j||"both"===j)&&(Eg[3]&&"top"===m.top&&(E-=n,m.top="bottom")),("element"===h||"both"===h)&&(og[2]&&"left"===m.left&&(o-=F,m.left="right")),"string"==typeof s?s=function(){var a,b,c,d;for(c=s.split(","),d=[],a=0,b=c.length;b>a;a++)r=c[a],d.push(r.trim());return d}():s===!0&&(s=["top","left","right","bottom"]),s||(s=[]),t=[],p=[],E=0?(E=g[1],t.push("top")):p.push("top")),E+n>g[3]&&(i.call(s,"bottom")>=0?(E=g[3]-n,t.push("bottom")):p.push("bottom")),o=0?(o=g[0],t.push("left")):p.push("left")),o+F>g[2]&&(i.call(s,"right")>=0?(o=g[2]-F,t.push("right")):p.push("right")),t.length)for(u=null!=(U=this.options.pinnedClass)?U:this.getClass("pinned"),this.addClass(u),J=0,N=t.length;N>J;J++)x=t[J],this.addClass(""+u+"-"+x);if(p.length)for(q=null!=(V=this.options.outOfBoundsClass)?V:this.getClass("out-of-bounds"),this.addClass(q),P=0,O=p.length;O>P;P++)x=p[P],this.addClass(""+q+"-"+x);(i.call(t,"left")>=0||i.call(t,"right")>=0)&&(m.left=y.left=!1),(i.call(t,"top")>=0||i.call(t,"bottom")>=0)&&(m.top=y.top=!1),(y.top!==z.top||y.left!==z.left||m.top!==this.attachment.top||m.left!==this.attachment.left)&&this.updateAttachClasses(m,y)}return{top:E,left:o}}})}.call(this),function(){var a;a=Tether.Utils.getBounds,Tether.modules.push({position:function(b){var c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u,v,w,x,y,z=this;if(k=b.top,f=b.left,u=this.cache("element-bounds",function(){return a(z.element)}),e=u.height,l=u.width,j=this.getTargetBounds(),d=k+e,g=f+l,c=[],k<=j.bottom&&d>=j.top)for(v=["left","right"],m=0,q=v.length;q>m;m++)h=v[m],((w=j[h])===f||w===g)&&c.push(h);if(f<=j.right&&g>=j.left)for(x=["top","bottom"],n=0,r=x.length;r>n;n++)h=x[n],((y=j[h])===k||y===d)&&c.push(h);for(i=["left","top","right","bottom"],this.removeClass(this.getClass("abutted")),o=0,s=i.length;s>o;o++)h=i[o],this.removeClass(""+this.getClass("abutted")+"-"+h);for(c.length&&this.addClass(this.getClass("abutted")),p=0,t=c.length;t>p;p++)h=c[p],this.addClass(""+this.getClass("abutted")+"-"+h);return!0}})}.call(this),function(){Tether.modules.push({position:function(a){var b,c,d,e,f,g,h;return g=a.top,b=a.left,this.options.shift?(c=function(a){return"function"==typeof a?a.call(this,{top:g,left:b}):a},d=c(this.options.shift),"string"==typeof d?(d=d.split(" "),d[1]||(d[1]=d[0]),f=d[0],e=d[1],f=parseFloat(f,10),e=parseFloat(e,10)):(h=[d.top,d.left],f=h[0],e=h[1]),g+=f,b+=e,{top:g,left:b}):void 0}})}.call(this); \ No newline at end of file diff --git a/js/utils.js b/js/utils.js deleted file mode 100644 index b25510395..000000000 --- a/js/utils.js +++ /dev/null @@ -1,331 +0,0 @@ -(function() { - var Evented, addClass, defer, deferred, extend, flush, getBounds, getOffsetParent, getOrigin, getScrollBarSize, getScrollParent, hasClass, node, removeClass, uniqueId, updateClasses, zeroPosCache, - __hasProp = {}.hasOwnProperty, - __indexOf = [].indexOf || function(item) { for (var i = 0, l = this.length; i < l; i++) { if (i in this && this[i] === item) return i; } return -1; }, - __slice = [].slice; - - if (this.Tether == null) { - this.Tether = { - modules: [] - }; - } - - getScrollParent = function(el) { - var parent, position, scrollParent, style, _ref; - position = getComputedStyle(el).position; - if (position === 'fixed') { - return el; - } - scrollParent = void 0; - parent = el; - while (parent = parent.parentNode) { - try { - style = getComputedStyle(parent); - } catch (_error) {} - if (style == null) { - return parent; - } - if (/(auto|scroll)/.test(style['overflow'] + style['overflow-y'] + style['overflow-x'])) { - if (position !== 'absolute' || ((_ref = style['position']) === 'relative' || _ref === 'absolute' || _ref === 'fixed')) { - return parent; - } - } - } - return document.body; - }; - - uniqueId = (function() { - var id; - id = 0; - return function() { - return id++; - }; - })(); - - zeroPosCache = {}; - - getOrigin = function(doc) { - var id, k, node, v, _ref; - node = doc._tetherZeroElement; - if (node == null) { - node = doc.createElement('div'); - node.setAttribute('data-tether-id', uniqueId()); - extend(node.style, { - top: 0, - left: 0, - position: 'absolute' - }); - doc.body.appendChild(node); - doc._tetherZeroElement = node; - } - id = node.getAttribute('data-tether-id'); - if (zeroPosCache[id] == null) { - zeroPosCache[id] = {}; - _ref = node.getBoundingClientRect(); - for (k in _ref) { - v = _ref[k]; - zeroPosCache[id][k] = v; - } - defer(function() { - return zeroPosCache[id] = void 0; - }); - } - return zeroPosCache[id]; - }; - - node = null; - - getBounds = function(el) { - var box, doc, docEl, k, origin, v, _ref; - if (el === document) { - doc = document; - el = document.documentElement; - } else { - doc = el.ownerDocument; - } - docEl = doc.documentElement; - box = {}; - _ref = el.getBoundingClientRect(); - for (k in _ref) { - v = _ref[k]; - box[k] = v; - } - origin = getOrigin(doc); - box.top -= origin.top; - box.left -= origin.left; - if (box.width == null) { - box.width = document.body.scrollWidth - box.left - box.right; - } - if (box.height == null) { - box.height = document.body.scrollHeight - box.top - box.bottom; - } - box.top = box.top - docEl.clientTop; - box.left = box.left - docEl.clientLeft; - box.right = doc.body.clientWidth - box.width - box.left; - box.bottom = doc.body.clientHeight - box.height - box.top; - return box; - }; - - getOffsetParent = function(el) { - return el.offsetParent || document.documentElement; - }; - - getScrollBarSize = function() { - var inner, outer, width, widthContained, widthScroll; - inner = document.createElement('div'); - inner.style.width = '100%'; - inner.style.height = '200px'; - outer = document.createElement('div'); - extend(outer.style, { - position: 'absolute', - top: 0, - left: 0, - pointerEvents: 'none', - visibility: 'hidden', - width: '200px', - height: '150px', - overflow: 'hidden' - }); - outer.appendChild(inner); - document.body.appendChild(outer); - widthContained = inner.offsetWidth; - outer.style.overflow = 'scroll'; - widthScroll = inner.offsetWidth; - if (widthContained === widthScroll) { - widthScroll = outer.clientWidth; - } - document.body.removeChild(outer); - width = widthContained - widthScroll; - return { - width: width, - height: width - }; - }; - - extend = function(out) { - var args, key, obj, val, _i, _len, _ref; - if (out == null) { - out = {}; - } - args = []; - Array.prototype.push.apply(args, arguments); - _ref = args.slice(1); - for (_i = 0, _len = _ref.length; _i < _len; _i++) { - obj = _ref[_i]; - if (obj) { - for (key in obj) { - if (!__hasProp.call(obj, key)) continue; - val = obj[key]; - out[key] = val; - } - } - } - return out; - }; - - removeClass = function(el, name) { - var cls, _i, _len, _ref, _results; - if (el.classList != null) { - _ref = name.split(' '); - _results = []; - for (_i = 0, _len = _ref.length; _i < _len; _i++) { - cls = _ref[_i]; - if (cls.trim()) { - _results.push(el.classList.remove(cls)); - } - } - return _results; - } else { - return el.className = el.className.replace(new RegExp("(^| )" + (name.split(' ').join('|')) + "( |$)", 'gi'), ' '); - } - }; - - addClass = function(el, name) { - var cls, _i, _len, _ref, _results; - if (el.classList != null) { - _ref = name.split(' '); - _results = []; - for (_i = 0, _len = _ref.length; _i < _len; _i++) { - cls = _ref[_i]; - if (cls.trim()) { - _results.push(el.classList.add(cls)); - } - } - return _results; - } else { - removeClass(el, name); - return el.className += " " + name; - } - }; - - hasClass = function(el, name) { - if (el.classList != null) { - return el.classList.contains(name); - } else { - return new RegExp("(^| )" + name + "( |$)", 'gi').test(el.className); - } - }; - - updateClasses = function(el, add, all) { - var cls, _i, _j, _len, _len1, _results; - for (_i = 0, _len = all.length; _i < _len; _i++) { - cls = all[_i]; - if (__indexOf.call(add, cls) < 0) { - if (hasClass(el, cls)) { - removeClass(el, cls); - } - } - } - _results = []; - for (_j = 0, _len1 = add.length; _j < _len1; _j++) { - cls = add[_j]; - if (!hasClass(el, cls)) { - _results.push(addClass(el, cls)); - } else { - _results.push(void 0); - } - } - return _results; - }; - - deferred = []; - - defer = function(fn) { - return deferred.push(fn); - }; - - flush = function() { - var fn, _results; - _results = []; - while (fn = deferred.pop()) { - _results.push(fn()); - } - return _results; - }; - - Evented = (function() { - function Evented() {} - - Evented.prototype.on = function(event, handler, ctx, once) { - var _base; - if (once == null) { - once = false; - } - if (this.bindings == null) { - this.bindings = {}; - } - if ((_base = this.bindings)[event] == null) { - _base[event] = []; - } - return this.bindings[event].push({ - handler: handler, - ctx: ctx, - once: once - }); - }; - - Evented.prototype.once = function(event, handler, ctx) { - return this.on(event, handler, ctx, true); - }; - - Evented.prototype.off = function(event, handler) { - var i, _ref, _results; - if (((_ref = this.bindings) != null ? _ref[event] : void 0) == null) { - return; - } - if (handler == null) { - return delete this.bindings[event]; - } else { - i = 0; - _results = []; - while (i < this.bindings[event].length) { - if (this.bindings[event][i].handler === handler) { - _results.push(this.bindings[event].splice(i, 1)); - } else { - _results.push(i++); - } - } - return _results; - } - }; - - Evented.prototype.trigger = function() { - var args, ctx, event, handler, i, once, _ref, _ref1, _results; - event = arguments[0], args = 2 <= arguments.length ? __slice.call(arguments, 1) : []; - if ((_ref = this.bindings) != null ? _ref[event] : void 0) { - i = 0; - _results = []; - while (i < this.bindings[event].length) { - _ref1 = this.bindings[event][i], handler = _ref1.handler, ctx = _ref1.ctx, once = _ref1.once; - handler.apply(ctx != null ? ctx : this, args); - if (once) { - _results.push(this.bindings[event].splice(i, 1)); - } else { - _results.push(i++); - } - } - return _results; - } - }; - - return Evented; - - })(); - - this.Tether.Utils = { - getScrollParent: getScrollParent, - getBounds: getBounds, - getOffsetParent: getOffsetParent, - extend: extend, - addClass: addClass, - removeClass: removeClass, - hasClass: hasClass, - updateClasses: updateClasses, - defer: defer, - flush: flush, - uniqueId: uniqueId, - Evented: Evented, - getScrollBarSize: getScrollBarSize - }; - -}).call(this); diff --git a/overview/repositioning/index.html b/overview/repositioning/index.html index d0c3c22aa..adb9b2505 100644 --- a/overview/repositioning/index.html +++ b/overview/repositioning/index.html @@ -1,12 +1,12 @@ -Tether -

    Repositioning

    +

    Repositioning

    Tethers will be automatically repositioned when the page is resized, and when any element containing the Tether is scrolled. If the element moves for some other reason (e.g. with JavaScript), Tether won't know to reposition the element.

    Manually Repositioning

    The simplest way to reposition every Tether on the page is to call Tether.position(). It will efficiently reposition every Tether in a single repaint, making it more efficient than manually repositioning many Tethers individually.

    -
    Tether.position()
    +
    Tether.position()
    +

    Repositioning a Single Tether

    If you have many Tethers on screen, it may be more efficient to just reposition the tether that needs it. You can do this by calling the .position method on the Tether instance:

    -
    tether = new Tether({ ... })
    +
    tether = new Tether({ ... })
     
    -// Later:
    -tether.position()
    +// Later: +tether.position() +

    Tethering Hidden Elements

    If you are creating a tether involving elements which are display: none, or not actually in the DOM, your Tether may not be able to position itself properly. One way around this is to ensure that a position call happens after all layouts have finished:

    -
    myElement.style.display = 'block'
    +
    myElement.style.display = 'block'
     
    -tether = new Tether({ ... })
    +tether = new Tether({ ... })
     
    -setTimeout(function(){
    +setTimeout(function(){
       tether.position();
    -})
    +}) +

    In general however, you shouldn't have any trouble if both the element and the target are visible and in the DOM when you create the Tether. If that is not the case, create the Tether disabled (option enabled: false), and enable it when the elements are ready.

    -
    +
    -

    Why we don't support IE 8

    +

    Why we don't support IE 8

    We've been living in 2007 for a while now, pretending that new browser features don't exist because they aren't in IE8. You might not even know about some of these features, or think they are only enabled by jQuery or underscore, simply because it hasn't @@ -66,7 +66,7 @@

    China uses XP

    The Future

    We are skating towards where the puck will be, and we hope that as you decide to drop IE 8 support, you choose to add Tether to the list of awesome things you can do.

    -
    +
    -

    Why You Should Use Tether

    +

    Why You Should Use Tether

    Virtually every app includes some sort of overlay attached to an element on the page. Things like tooltips, dropdowns, hover-activated info boxes, etc.

    @@ -63,7 +63,7 @@

    tl;dr

  • Support for repositioning or pinning the element when it would be offscreen
  • Designed to be embeddable in other libraries
  • -
    +
    -

    Embedding Tether

    +

    Embedding Tether

    Tether is designed to be embeddable in other libraries.

    There is one thing you should think about doing to create an embedded Tether:

      diff --git a/advanced/extending_tether/index.html b/advanced/extending_tether/index.html index 05c271065..165d8bcdd 100644 --- a/advanced/extending_tether/index.html +++ b/advanced/extending_tether/index.html @@ -1,4 +1,4 @@ -Tether -

      Extending Tether

      +

      Extending Tether

      Tether has a module system which can be used to modify Tether's positioning, or just do something each time the Tether is moved.

      Tether has an array called Tether.modules, push onto it to add a module:

      Tether.modules.push
      diff --git a/dist/js/tether.js b/dist/js/tether.js
      index a670e63d6..39539a1c1 100644
      --- a/dist/js/tether.js
      +++ b/dist/js/tether.js
      @@ -1,4 +1,4 @@
      -/*! tether 1.2.0 */
      +/*! tether 1.3.0 */
       
       (function(root, factory) {
         if (typeof define === 'function' && define.amd) {
      @@ -21,25 +21,27 @@ if (typeof TetherBase === 'undefined') {
         TetherBase = { modules: [] };
       }
       
      -function getScrollParent(el) {
      +function getScrollParents(el) {
         // In firefox if the el is inside an iframe with display: none; window.getComputedStyle() will return null;
         // https://bugzilla.mozilla.org/show_bug.cgi?id=548397
         var computedStyle = getComputedStyle(el) || {};
         var position = computedStyle.position;
      +  var parents = [];
       
         if (position === 'fixed') {
      -    return el;
      +    return [el];
         }
       
         var parent = el;
      -  while (parent = parent.parentNode) {
      +  while ((parent = parent.parentNode) && parent.nodeType === 1) {
           var style = undefined;
           try {
             style = getComputedStyle(parent);
           } catch (err) {}
       
           if (typeof style === 'undefined' || style === null) {
      -      return parent;
      +      parents.push(parent);
      +      return parents;
           }
       
           var _style = style;
      @@ -49,12 +51,13 @@ function getScrollParent(el) {
       
           if (/(auto|scroll)/.test(overflow + overflowY + overflowX)) {
             if (position !== 'absolute' || ['relative', 'absolute', 'fixed'].indexOf(style.position) >= 0) {
      -        return parent;
      +        parents.push(parent);
             }
           }
         }
       
      -  return document.body;
      +  parents.push(document.body);
      +  return parents;
       }
       
       var uniqueId = (function () {
      @@ -359,7 +362,7 @@ var Evented = (function () {
       })();
       
       TetherBase.Utils = {
      -  getScrollParent: getScrollParent,
      +  getScrollParents: getScrollParents,
         getBounds: getBounds,
         getOffsetParent: getOffsetParent,
         extend: extend,
      @@ -381,14 +384,18 @@ var _slicedToArray = (function () { function sliceIterator(arr, i) { var _arr =
       
       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; }; })();
       
      +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); } } };
      +
       function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError('Cannot call a class as a function'); } }
       
      +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; }
      +
       if (typeof TetherBase === 'undefined') {
         throw new Error('You must include the utils.js file before tether.js');
       }
       
       var _TetherBase$Utils = TetherBase.Utils;
      -var getScrollParent = _TetherBase$Utils.getScrollParent;
      +var getScrollParents = _TetherBase$Utils.getScrollParents;
       var getBounds = _TetherBase$Utils.getBounds;
       var getOffsetParent = _TetherBase$Utils.getOffsetParent;
       var extend = _TetherBase$Utils.extend;
      @@ -466,7 +473,7 @@ function now() {
           lastDuration = now() - lastCall;
         };
       
      -  if (typeof window !== 'undefined') {
      +  if (typeof window !== 'undefined' && typeof window.addEventListener !== 'undefined') {
           ['resize', 'scroll', 'touchmove'].forEach(function (event) {
             window.addEventListener(event, tick);
           });
      @@ -572,12 +579,15 @@ var parseOffset = function parseOffset(value) {
       };
       var parseAttachment = parseOffset;
       
      -var TetherClass = (function () {
      +var TetherClass = (function (_Evented) {
      +  _inherits(TetherClass, _Evented);
      +
         function TetherClass(options) {
           var _this = this;
       
           _classCallCheck(this, TetherClass);
       
      +    _get(Object.getPrototypeOf(TetherClass.prototype), 'constructor', this).call(this);
           this.position = this.position.bind(this);
       
           tethers.push(this);
      @@ -673,9 +683,9 @@ var TetherClass = (function () {
             }
       
             if (this.targetModifier === 'scroll-handle') {
      -        this.scrollParent = this.target;
      +        this.scrollParents = [this.target];
             } else {
      -        this.scrollParent = getScrollParent(this.target);
      +        this.scrollParents = getScrollParents(this.target);
             }
       
             if (!(this.options.enabled === false)) {
      @@ -796,6 +806,8 @@ var TetherClass = (function () {
         }, {
           key: 'enable',
           value: function enable() {
      +      var _this3 = this;
      +
             var pos = arguments.length <= 0 || arguments[0] === undefined ? true : arguments[0];
       
             if (!(this.options.addTargetClasses === false)) {
      @@ -804,9 +816,11 @@ var TetherClass = (function () {
             addClass(this.element, this.getClass('enabled'));
             this.enabled = true;
       
      -      if (this.scrollParent !== document) {
      -        this.scrollParent.addEventListener('scroll', this.position);
      -      }
      +      this.scrollParents.forEach(function (parent) {
      +        if (parent !== document) {
      +          parent.addEventListener('scroll', _this3.position);
      +        }
      +      });
       
             if (pos) {
               this.position();
      @@ -815,23 +829,27 @@ var TetherClass = (function () {
         }, {
           key: 'disable',
           value: function disable() {
      +      var _this4 = this;
      +
             removeClass(this.target, this.getClass('enabled'));
             removeClass(this.element, this.getClass('enabled'));
             this.enabled = false;
       
      -      if (typeof this.scrollParent !== 'undefined') {
      -        this.scrollParent.removeEventListener('scroll', this.position);
      +      if (typeof this.scrollParents !== 'undefined') {
      +        this.scrollParents.forEach(function (parent) {
      +          parent.removeEventListener('scroll', _this4.position);
      +        });
             }
           }
         }, {
           key: 'destroy',
           value: function destroy() {
      -      var _this3 = this;
      +      var _this5 = this;
       
             this.disable();
       
             tethers.forEach(function (tether, i) {
      -        if (tether === _this3) {
      +        if (tether === _this5) {
                 tethers.splice(i, 1);
                 return;
               }
      @@ -840,7 +858,7 @@ var TetherClass = (function () {
         }, {
           key: 'updateAttachClasses',
           value: function updateAttachClasses(elementAttach, targetAttach) {
      -      var _this4 = this;
      +      var _this6 = this;
       
             elementAttach = elementAttach || this.attachment;
             targetAttach = targetAttach || this.targetAttachment;
      @@ -873,27 +891,27 @@ var TetherClass = (function () {
       
             var all = [];
             sides.forEach(function (side) {
      -        all.push(_this4.getClass('element-attached') + '-' + side);
      -        all.push(_this4.getClass('target-attached') + '-' + side);
      +        all.push(_this6.getClass('element-attached') + '-' + side);
      +        all.push(_this6.getClass('target-attached') + '-' + side);
             });
       
             defer(function () {
      -        if (!(typeof _this4._addAttachClasses !== 'undefined')) {
      +        if (!(typeof _this6._addAttachClasses !== 'undefined')) {
                 return;
               }
       
      -        updateClasses(_this4.element, _this4._addAttachClasses, all);
      -        if (!(_this4.options.addTargetClasses === false)) {
      -          updateClasses(_this4.target, _this4._addAttachClasses, all);
      +        updateClasses(_this6.element, _this6._addAttachClasses, all);
      +        if (!(_this6.options.addTargetClasses === false)) {
      +          updateClasses(_this6.target, _this6._addAttachClasses, all);
               }
       
      -        delete _this4._addAttachClasses;
      +        delete _this6._addAttachClasses;
             });
           }
         }, {
           key: 'position',
           value: function position() {
      -      var _this5 = this;
      +      var _this7 = this;
       
             var flushChanges = arguments.length <= 0 || arguments[0] === undefined ? true : arguments[0];
       
      @@ -912,7 +930,7 @@ var TetherClass = (function () {
             this.updateAttachClasses(this.attachment, targetAttachment);
       
             var elementPos = this.cache('element-bounds', function () {
      -        return getBounds(_this5.element);
      +        return getBounds(_this7.element);
             });
       
             var width = elementPos.width;
      @@ -930,7 +948,7 @@ var TetherClass = (function () {
             }
       
             var targetPos = this.cache('target-bounds', function () {
      -        return _this5.getTargetBounds();
      +        return _this7.getTargetBounds();
             });
             var targetSize = targetPos;
       
      @@ -1014,10 +1032,10 @@ var TetherClass = (function () {
       
             if (typeof this.options.optimizations !== 'undefined' && this.options.optimizations.moveElement !== false && !(typeof this.targetModifier !== 'undefined')) {
               (function () {
      -          var offsetParent = _this5.cache('target-offsetparent', function () {
      -            return getOffsetParent(_this5.target);
      +          var offsetParent = _this7.cache('target-offsetparent', function () {
      +            return getOffsetParent(_this7.target);
                 });
      -          var offsetPosition = _this5.cache('target-offsetparent-bounds', function () {
      +          var offsetPosition = _this7.cache('target-offsetparent-bounds', function () {
                   return getBounds(offsetParent);
                 });
                 var offsetParentStyle = getComputedStyle(offsetParent);
      @@ -1070,7 +1088,7 @@ var TetherClass = (function () {
         }, {
           key: 'move',
           value: function move(pos) {
      -      var _this6 = this;
      +      var _this8 = this;
       
             if (!(typeof this.element.parentNode !== 'undefined')) {
               return;
      @@ -1101,8 +1119,8 @@ var TetherClass = (function () {
             var css = { top: '', left: '', right: '', bottom: '' };
       
             var transcribe = function transcribe(_same, _pos) {
      -        var hasOptimizations = typeof _this6.options.optimizations !== 'undefined';
      -        var gpu = hasOptimizations ? _this6.options.optimizations.gpu : null;
      +        var hasOptimizations = typeof _this8.options.optimizations !== 'undefined';
      +        var gpu = hasOptimizations ? _this8.options.optimizations.gpu : null;
               if (gpu !== false) {
                 var yPos = undefined,
                     xPos = undefined;
      @@ -1154,14 +1172,14 @@ var TetherClass = (function () {
             } else if (typeof same.offset !== 'undefined' && same.offset.top && same.offset.left) {
               (function () {
                 css.position = 'absolute';
      -          var offsetParent = _this6.cache('target-offsetparent', function () {
      -            return getOffsetParent(_this6.target);
      +          var offsetParent = _this8.cache('target-offsetparent', function () {
      +            return getOffsetParent(_this8.target);
                 });
       
      -          if (getOffsetParent(_this6.element) !== offsetParent) {
      +          if (getOffsetParent(_this8.element) !== offsetParent) {
                   defer(function () {
      -              _this6.element.parentNode.removeChild(_this6.element);
      -              offsetParent.appendChild(_this6.element);
      +              _this8.element.parentNode.removeChild(_this8.element);
      +              offsetParent.appendChild(_this8.element);
                   });
                 }
       
      @@ -1176,7 +1194,7 @@ var TetherClass = (function () {
             if (!moved) {
               var offsetParentIsBody = true;
               var currentNode = this.element.parentNode;
      -        while (currentNode && currentNode.tagName !== 'BODY') {
      +        while (currentNode && currentNode.nodeType === 1 && currentNode.tagName !== 'BODY') {
                 if (getComputedStyle(currentNode).position !== 'static') {
                   offsetParentIsBody = false;
                   break;
      @@ -1198,11 +1216,6 @@ var TetherClass = (function () {
               var val = css[key];
               var elVal = this.element.style[key];
       
      -        if (elVal !== '' && val !== '' && ['top', 'left', 'bottom', 'right'].indexOf(key) >= 0) {
      -          elVal = parseFloat(elVal);
      -          val = parseFloat(val);
      -        }
      -
               if (elVal !== val) {
                 write = true;
                 writeCSS[key] = val;
      @@ -1211,14 +1224,14 @@ var TetherClass = (function () {
       
             if (write) {
               defer(function () {
      -          extend(_this6.element.style, writeCSS);
      +          extend(_this8.element.style, writeCSS);
               });
             }
           }
         }]);
       
         return TetherClass;
      -})();
      +})(Evented);
       
       TetherClass.modules = [];
       
      @@ -1369,34 +1382,32 @@ TetherBase.modules.push({
             }
       
             if (changeAttachY === 'together') {
      -        if (top < bounds[1] && tAttachment.top === 'top') {
      -          if (eAttachment.top === 'bottom') {
      +        if (tAttachment.top === 'top') {
      +          if (eAttachment.top === 'bottom' && top < bounds[1]) {
                   top += targetHeight;
                   tAttachment.top = 'bottom';
       
                   top += height;
                   eAttachment.top = 'top';
      -          } else if (eAttachment.top === 'top') {
      -            top += targetHeight;
      +          } else if (eAttachment.top === 'top' && top + height > bounds[3] && top - (height - targetHeight) >= bounds[1]) {
      +            top -= height - targetHeight;
                   tAttachment.top = 'bottom';
       
      -            top -= height;
                   eAttachment.top = 'bottom';
                 }
               }
       
      -        if (top + height > bounds[3] && tAttachment.top === 'bottom') {
      -          if (eAttachment.top === 'top') {
      +        if (tAttachment.top === 'bottom') {
      +          if (eAttachment.top === 'top' && top + height > bounds[3]) {
                   top -= targetHeight;
                   tAttachment.top = 'top';
       
                   top -= height;
                   eAttachment.top = 'bottom';
      -          } else if (eAttachment.top === 'bottom') {
      -            top -= targetHeight;
      +          } else if (eAttachment.top === 'bottom' && top < bounds[1] && top + (height * 2 - targetHeight) <= bounds[3]) {
      +            top += height - targetHeight;
                   tAttachment.top = 'top';
       
      -            top += height;
                   eAttachment.top = 'top';
                 }
               }
      @@ -1588,6 +1599,10 @@ TetherBase.modules.push({
       
             if (tAttachment.top !== targetAttachment.top || tAttachment.left !== targetAttachment.left || eAttachment.top !== _this.attachment.top || eAttachment.left !== _this.attachment.left) {
               _this.updateAttachClasses(eAttachment, tAttachment);
      +        _this.trigger('update', {
      +          attachment: eAttachment,
      +          targetAttachment: tAttachment
      +        });
             }
           });
       
      diff --git a/dist/js/tether.min.js b/dist/js/tether.min.js
      index 9511798eb..71cebc778 100644
      --- a/dist/js/tether.min.js
      +++ b/dist/js/tether.min.js
      @@ -1 +1 @@
      -!function(t,e){"function"==typeof define&&define.amd?define(e):"object"==typeof exports?module.exports=e(require,exports,module):t.Tether=e()}(this,function(t,e,o){"use strict";function i(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}function n(t){var e=getComputedStyle(t)||{},o=e.position;if("fixed"===o)return t;for(var i=t;i=i.parentNode;){var n=void 0;try{n=getComputedStyle(i)}catch(r){}if("undefined"==typeof n||null===n)return i;var s=n,a=s.overflow,f=s.overflowX,h=s.overflowY;if(/(auto|scroll)/.test(a+h+f)&&("absolute"!==o||["relative","absolute","fixed"].indexOf(n.position)>=0))return i}return document.body}function r(t){var e=void 0;t===document?(e=document,t=document.documentElement):e=t.ownerDocument;var o=e.documentElement,i={},n=t.getBoundingClientRect();for(var r in n)i[r]=n[r];var s=x(e);return i.top-=s.top,i.left-=s.left,"undefined"==typeof i.width&&(i.width=document.body.scrollWidth-i.left-i.right),"undefined"==typeof i.height&&(i.height=document.body.scrollHeight-i.top-i.bottom),i.top=i.top-o.clientTop,i.left=i.left-o.clientLeft,i.right=e.body.clientWidth-i.width-i.left,i.bottom=e.body.clientHeight-i.height-i.top,i}function s(t){return t.offsetParent||document.documentElement}function a(){var t=document.createElement("div");t.style.width="100%",t.style.height="200px";var e=document.createElement("div");f(e.style,{position:"absolute",top:0,left:0,pointerEvents:"none",visibility:"hidden",width:"200px",height:"150px",overflow:"hidden"}),e.appendChild(t),document.body.appendChild(e);var o=t.offsetWidth;e.style.overflow="scroll";var i=t.offsetWidth;o===i&&(i=e.clientWidth),document.body.removeChild(e);var n=o-i;return{width:n,height:n}}function f(){var t=arguments.length<=0||void 0===arguments[0]?{}:arguments[0],e=[];return Array.prototype.push.apply(e,arguments),e.slice(1).forEach(function(e){if(e)for(var o in e)({}).hasOwnProperty.call(e,o)&&(t[o]=e[o])}),t}function h(t,e){if("undefined"!=typeof t.classList)e.split(" ").forEach(function(e){e.trim()&&t.classList.remove(e)});else{var o=new RegExp("(^| )"+e.split(" ").join("|")+"( |$)","gi"),i=u(t).replace(o," ");p(t,i)}}function l(t,e){if("undefined"!=typeof t.classList)e.split(" ").forEach(function(e){e.trim()&&t.classList.add(e)});else{h(t,e);var o=u(t)+(" "+e);p(t,o)}}function d(t,e){if("undefined"!=typeof t.classList)return t.classList.contains(e);var o=u(t);return new RegExp("(^| )"+e+"( |$)","gi").test(o)}function u(t){return t.className instanceof SVGAnimatedString?t.className.baseVal:t.className}function p(t,e){t.setAttribute("class",e)}function c(t,e,o){o.forEach(function(o){-1===e.indexOf(o)&&d(t,o)&&h(t,o)}),e.forEach(function(e){d(t,e)||l(t,e)})}function i(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}function g(t,e){var o=arguments.length<=2||void 0===arguments[2]?1:arguments[2];return t+o>=e&&e>=t-o}function m(){return"undefined"!=typeof performance&&"undefined"!=typeof performance.now?performance.now():+new Date}function v(){for(var t={top:0,left:0},e=arguments.length,o=Array(e),i=0;e>i;i++)o[i]=arguments[i];return o.forEach(function(e){var o=e.top,i=e.left;"string"==typeof o&&(o=parseFloat(o,10)),"string"==typeof i&&(i=parseFloat(i,10)),t.top+=o,t.left+=i}),t}function y(t,e){return"string"==typeof t.left&&-1!==t.left.indexOf("%")&&(t.left=parseFloat(t.left,10)/100*e.width),"string"==typeof t.top&&-1!==t.top.indexOf("%")&&(t.top=parseFloat(t.top,10)/100*e.height),t}function b(t,e){return"scrollParent"===e?e=t.scrollParent:"window"===e&&(e=[pageXOffset,pageYOffset,innerWidth+pageXOffset,innerHeight+pageYOffset]),e===document&&(e=e.documentElement),"undefined"!=typeof e.nodeType&&!function(){var t=r(e),o=t,i=getComputedStyle(e);e=[o.left,o.top,t.width+o.left,t.height+o.top],U.forEach(function(t,o){t=t[0].toUpperCase()+t.substr(1),"Top"===t||"Left"===t?e[o]+=parseFloat(i["border"+t+"Width"]):e[o]-=parseFloat(i["border"+t+"Width"])})}(),e}var w=function(){function t(t,e){for(var o=0;o1?o-1:0),n=1;o>n;n++)i[n-1]=arguments[n];for(;e16?(e=Math.min(e-16,250),void(o=setTimeout(n,250))):void("undefined"!=typeof t&&m()-t<10||("undefined"!=typeof o&&(clearTimeout(o),o=null),t=m(),_(),e=m()-t))};"undefined"!=typeof window&&["resize","scroll","touchmove"].forEach(function(t){window.addEventListener(t,i)})}();var z={center:"center",left:"right",right:"left"},F={middle:"middle",top:"bottom",bottom:"top"},L={top:0,left:0,middle:"50%",center:"50%",bottom:"100%",right:"100%"},Y=function(t,e){var o=t.left,i=t.top;return"auto"===o&&(o=z[e.left]),"auto"===i&&(i=F[e.top]),{left:o,top:i}},H=function(t){var e=t.left,o=t.top;return"undefined"!=typeof L[t.left]&&(e=L[t.left]),"undefined"!=typeof L[t.top]&&(o=L[t.top]),{left:e,top:o}},X=function(t){var e=t.split(" "),o=M(e,2),i=o[0],n=o[1];return{top:i,left:n}},j=X,N=function(){function t(e){var o=this;i(this,t),this.position=this.position.bind(this),B.push(this),this.history=[],this.setOptions(e,!1),C.modules.forEach(function(t){"undefined"!=typeof t.initialize&&t.initialize.call(o)}),this.position()}return w(t,[{key:"getClass",value:function(){var t=arguments.length<=0||void 0===arguments[0]?"":arguments[0],e=this.options.classes;return"undefined"!=typeof e&&e[t]?this.options.classes[t]:this.options.classPrefix?this.options.classPrefix+"-"+t:t}},{key:"setOptions",value:function(t){var e=this,o=arguments.length<=1||void 0===arguments[1]?!0:arguments[1],i={offset:"0 0",targetOffset:"0 0",targetAttachment:"auto auto",classPrefix:"tether"};this.options=f(i,t);var r=this.options,s=r.element,a=r.target,h=r.targetModifier;if(this.element=s,this.target=a,this.targetModifier=h,"viewport"===this.target?(this.target=document.body,this.targetModifier="visible"):"scroll-handle"===this.target&&(this.target=document.body,this.targetModifier="scroll-handle"),["element","target"].forEach(function(t){if("undefined"==typeof e[t])throw new Error("Tether Error: Both element and target must be defined");"undefined"!=typeof e[t].jquery?e[t]=e[t][0]:"string"==typeof e[t]&&(e[t]=document.querySelector(e[t]))}),l(this.element,this.getClass("element")),this.options.addTargetClasses!==!1&&l(this.target,this.getClass("target")),!this.options.attachment)throw new Error("Tether Error: You must provide an attachment");this.targetAttachment=j(this.options.targetAttachment),this.attachment=j(this.options.attachment),this.offset=X(this.options.offset),this.targetOffset=X(this.options.targetOffset),"undefined"!=typeof this.scrollParent&&this.disable(),"scroll-handle"===this.targetModifier?this.scrollParent=this.target:this.scrollParent=n(this.target),this.options.enabled!==!1&&this.enable(o)}},{key:"getTargetBounds",value:function(){if("undefined"==typeof this.targetModifier)return r(this.target);if("visible"===this.targetModifier){if(this.target===document.body)return{top:pageYOffset,left:pageXOffset,height:innerHeight,width:innerWidth};var t=r(this.target),e={height:t.height,width:t.width,top:t.top,left:t.left};return e.height=Math.min(e.height,t.height-(pageYOffset-t.top)),e.height=Math.min(e.height,t.height-(t.top+t.height-(pageYOffset+innerHeight))),e.height=Math.min(innerHeight,e.height),e.height-=2,e.width=Math.min(e.width,t.width-(pageXOffset-t.left)),e.width=Math.min(e.width,t.width-(t.left+t.width-(pageXOffset+innerWidth))),e.width=Math.min(innerWidth,e.width),e.width-=2,e.topo.clientWidth||[i.overflow,i.overflowX].indexOf("scroll")>=0||this.target!==document.body,s=0;n&&(s=15);var a=t.height-parseFloat(i.borderTopWidth)-parseFloat(i.borderBottomWidth)-s,e={width:15,height:.975*a*(a/o.scrollHeight),left:t.left+t.width-parseFloat(i.borderLeftWidth)-15},f=0;408>a&&this.target===document.body&&(f=-11e-5*Math.pow(a,2)-.00727*a+22.58),this.target!==document.body&&(e.height=Math.max(e.height,24));var h=this.target.scrollTop/(o.scrollHeight-a);return e.top=h*(a-e.height-f)+t.top+parseFloat(i.borderTopWidth),this.target===document.body&&(e.height=Math.max(e.height,24)),e}}},{key:"clearCache",value:function(){this._cache={}}},{key:"cache",value:function(t,e){return"undefined"==typeof this._cache&&(this._cache={}),"undefined"==typeof this._cache[t]&&(this._cache[t]=e.call(this)),this._cache[t]}},{key:"enable",value:function(){var t=arguments.length<=0||void 0===arguments[0]?!0:arguments[0];this.options.addTargetClasses!==!1&&l(this.target,this.getClass("enabled")),l(this.element,this.getClass("enabled")),this.enabled=!0,this.scrollParent!==document&&this.scrollParent.addEventListener("scroll",this.position),t&&this.position()}},{key:"disable",value:function(){h(this.target,this.getClass("enabled")),h(this.element,this.getClass("enabled")),this.enabled=!1,"undefined"!=typeof this.scrollParent&&this.scrollParent.removeEventListener("scroll",this.position)}},{key:"destroy",value:function(){var t=this;this.disable(),B.forEach(function(e,o){return e===t?void B.splice(o,1):void 0})}},{key:"updateAttachClasses",value:function(t,e){var o=this;t=t||this.attachment,e=e||this.targetAttachment;var i=["left","top","bottom","right","middle","center"];"undefined"!=typeof this._addAttachClasses&&this._addAttachClasses.length&&this._addAttachClasses.splice(0,this._addAttachClasses.length),"undefined"==typeof this._addAttachClasses&&(this._addAttachClasses=[]);var n=this._addAttachClasses;t.top&&n.push(this.getClass("element-attached")+"-"+t.top),t.left&&n.push(this.getClass("element-attached")+"-"+t.left),e.top&&n.push(this.getClass("target-attached")+"-"+e.top),e.left&&n.push(this.getClass("target-attached")+"-"+e.left);var r=[];i.forEach(function(t){r.push(o.getClass("element-attached")+"-"+t),r.push(o.getClass("target-attached")+"-"+t)}),T(function(){"undefined"!=typeof o._addAttachClasses&&(c(o.element,o._addAttachClasses,r),o.options.addTargetClasses!==!1&&c(o.target,o._addAttachClasses,r),delete o._addAttachClasses)})}},{key:"position",value:function(){var t=this,e=arguments.length<=0||void 0===arguments[0]?!0:arguments[0];if(this.enabled){this.clearCache();var o=Y(this.targetAttachment,this.attachment);this.updateAttachClasses(this.attachment,o);var i=this.cache("element-bounds",function(){return r(t.element)}),n=i.width,f=i.height;if(0===n&&0===f&&"undefined"!=typeof this.lastSize){var h=this.lastSize;n=h.width,f=h.height}else this.lastSize={width:n,height:f};var l=this.cache("target-bounds",function(){return t.getTargetBounds()}),d=l,u=y(H(this.attachment),{width:n,height:f}),p=y(H(o),d),c=y(this.offset,{width:n,height:f}),g=y(this.targetOffset,d);u=v(u,c),p=v(p,g);for(var m=l.left+p.left-u.left,b=l.top+p.top-u.top,w=0;wwindow.innerWidth&&(A=this.cache("scrollbar-size",a),x.viewport.bottom-=A.height),document.body.scrollHeight>window.innerHeight&&(A=this.cache("scrollbar-size",a),x.viewport.right-=A.width),(-1===["","static"].indexOf(document.body.style.position)||-1===["","static"].indexOf(document.body.parentElement.style.position))&&(x.page.bottom=document.body.scrollHeight-b-f,x.page.right=document.body.scrollWidth-m-n),"undefined"!=typeof this.options.optimizations&&this.options.optimizations.moveElement!==!1&&"undefined"==typeof this.targetModifier&&!function(){var e=t.cache("target-offsetparent",function(){return s(t.target)}),o=t.cache("target-offsetparent-bounds",function(){return r(e)}),i=getComputedStyle(e),n=o,a={};if(["Top","Left","Bottom","Right"].forEach(function(t){a[t.toLowerCase()]=parseFloat(i["border"+t+"Width"])}),o.right=document.body.scrollWidth-o.left-n.width+a.right,o.bottom=document.body.scrollHeight-o.top-n.height+a.bottom,x.page.top>=o.top+a.top&&x.page.bottom>=o.bottom&&x.page.left>=o.left+a.left&&x.page.right>=o.right){var f=e.scrollTop,h=e.scrollLeft;x.offset={top:x.page.top-o.top+f-a.top,left:x.page.left-o.left+h-a.left}}}(),this.move(x),this.history.unshift(x),this.history.length>3&&this.history.pop(),e&&S(),!0}}},{key:"move",value:function(t){var e=this;if("undefined"!=typeof this.element.parentNode){var o={};for(var i in t){o[i]={};for(var n in t[i]){for(var r=!1,a=0;a=0&&(b=parseFloat(b),y=parseFloat(y)),b!==y&&(v=!0,m[n]=y)}v&&T(function(){f(e.element.style,m)})}}}]),t}();N.modules=[],C.position=_;var R=f(N,C),M=function(){function t(t,e){var o=[],i=!0,n=!1,r=void 0;try{for(var s,a=t[Symbol.iterator]();!(i=(s=a.next()).done)&&(o.push(s.value),!e||o.length!==e);i=!0);}catch(f){n=!0,r=f}finally{try{!i&&a["return"]&&a["return"]()}finally{if(n)throw r}}return o}return function(e,o){if(Array.isArray(e))return e;if(Symbol.iterator in Object(e))return t(e,o);throw new TypeError("Invalid attempt to destructure non-iterable instance")}}(),P=C.Utils,r=P.getBounds,f=P.extend,c=P.updateClasses,T=P.defer,U=["left","top","right","bottom"];C.modules.push({position:function(t){var e=this,o=t.top,i=t.left,n=t.targetAttachment;if(!this.options.constraints)return!0;var s=this.cache("element-bounds",function(){return r(e.element)}),a=s.height,h=s.width;if(0===h&&0===a&&"undefined"!=typeof this.lastSize){var l=this.lastSize;h=l.width,a=l.height}var d=this.cache("target-bounds",function(){return e.getTargetBounds()}),u=d.height,p=d.width,g=[this.getClass("pinned"),this.getClass("out-of-bounds")];this.options.constraints.forEach(function(t){var e=t.outOfBoundsClass,o=t.pinnedClass;e&&g.push(e),o&&g.push(o)}),g.forEach(function(t){["left","top","right","bottom"].forEach(function(e){g.push(t+"-"+e)})});var m=[],v=f({},n),y=f({},this.attachment);return this.options.constraints.forEach(function(t){var r=t.to,s=t.attachment,f=t.pin;"undefined"==typeof s&&(s="");var l=void 0,d=void 0;if(s.indexOf(" ")>=0){var c=s.split(" "),g=M(c,2);d=g[0],l=g[1]}else l=d=s;var w=b(e,r);("target"===d||"both"===d)&&(ow[3]&&"bottom"===v.top&&(o-=u,v.top="top")),"together"===d&&(ow[3]&&"bottom"===v.top&&("top"===y.top?(o-=u,v.top="top",o-=a,y.top="bottom"):"bottom"===y.top&&(o-=u,v.top="top",o+=a,y.top="top")),"middle"===v.top&&(o+a>w[3]&&"top"===y.top?(o-=a,y.top="bottom"):ow[2]&&"right"===v.left&&(i-=p,v.left="left")),"together"===l&&(iw[2]&&"right"===v.left?"left"===y.left?(i-=p,v.left="left",i-=h,y.left="right"):"right"===y.left&&(i-=p,v.left="left",i+=h,y.left="left"):"center"===v.left&&(i+h>w[2]&&"left"===y.left?(i-=h,y.left="right"):iw[3]&&"top"===y.top&&(o-=a,y.top="bottom")),("element"===l||"both"===l)&&(iw[2]&&("left"===y.left?(i-=h,y.left="right"):"center"===y.left&&(i-=h/2,y.left="right"))),"string"==typeof f?f=f.split(",").map(function(t){return t.trim()}):f===!0&&(f=["top","left","right","bottom"]),f=f||[];var C=[],O=[];o=0?(o=w[1],C.push("top")):O.push("top")),o+a>w[3]&&(f.indexOf("bottom")>=0?(o=w[3]-a,C.push("bottom")):O.push("bottom")),i=0?(i=w[0],C.push("left")):O.push("left")),i+h>w[2]&&(f.indexOf("right")>=0?(i=w[2]-h,C.push("right")):O.push("right")),C.length&&!function(){var t=void 0;t="undefined"!=typeof e.options.pinnedClass?e.options.pinnedClass:e.getClass("pinned"),m.push(t),C.forEach(function(e){m.push(t+"-"+e)})}(),O.length&&!function(){var t=void 0;t="undefined"!=typeof e.options.outOfBoundsClass?e.options.outOfBoundsClass:e.getClass("out-of-bounds"),m.push(t),O.forEach(function(e){m.push(t+"-"+e)})}(),(C.indexOf("left")>=0||C.indexOf("right")>=0)&&(y.left=v.left=!1),(C.indexOf("top")>=0||C.indexOf("bottom")>=0)&&(y.top=v.top=!1),(v.top!==n.top||v.left!==n.left||y.top!==e.attachment.top||y.left!==e.attachment.left)&&e.updateAttachClasses(y,v)}),T(function(){e.options.addTargetClasses!==!1&&c(e.target,m,g),c(e.element,m,g)}),{top:o,left:i}}});var P=C.Utils,r=P.getBounds,c=P.updateClasses,T=P.defer;C.modules.push({position:function(t){var e=this,o=t.top,i=t.left,n=this.cache("element-bounds",function(){return r(e.element)}),s=n.height,a=n.width,f=this.getTargetBounds(),h=o+s,l=i+a,d=[];o<=f.bottom&&h>=f.top&&["left","right"].forEach(function(t){var e=f[t];(e===i||e===l)&&d.push(t)}),i<=f.right&&l>=f.left&&["top","bottom"].forEach(function(t){var e=f[t];(e===o||e===h)&&d.push(t)});var u=[],p=[],g=["left","top","right","bottom"];return u.push(this.getClass("abutted")),g.forEach(function(t){u.push(e.getClass("abutted")+"-"+t)}),d.length&&p.push(this.getClass("abutted")),d.forEach(function(t){p.push(e.getClass("abutted")+"-"+t)}),T(function(){e.options.addTargetClasses!==!1&&c(e.target,p,u),c(e.element,p,u)}),!0}});var M=function(){function t(t,e){var o=[],i=!0,n=!1,r=void 0;try{for(var s,a=t[Symbol.iterator]();!(i=(s=a.next()).done)&&(o.push(s.value),!e||o.length!==e);i=!0);}catch(f){n=!0,r=f}finally{try{!i&&a["return"]&&a["return"]()}finally{if(n)throw r}}return o}return function(e,o){if(Array.isArray(e))return e;if(Symbol.iterator in Object(e))return t(e,o);throw new TypeError("Invalid attempt to destructure non-iterable instance")}}();return C.modules.push({position:function(t){var e=t.top,o=t.left;if(this.options.shift){var i=this.options.shift;"function"==typeof this.options.shift&&(i=this.options.shift.call(this,{top:e,left:o}));var n=void 0,r=void 0;if("string"==typeof i){i=i.split(" "),i[1]=i[1]||i[0];var s=i,a=M(s,2);n=a[0],r=a[1],n=parseFloat(n,10),r=parseFloat(r,10)}else n=i.top,r=i.left;return e+=n,o+=r,{top:e,left:o}}}}),R});
      \ No newline at end of file
      +!function(t,e){"function"==typeof define&&define.amd?define(e):"object"==typeof exports?module.exports=e(require,exports,module):t.Tether=e()}(this,function(t,e,o){"use strict";function n(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}function i(t){var e=getComputedStyle(t)||{},o=e.position,n=[];if("fixed"===o)return[t];for(var i=t;(i=i.parentNode)&&1===i.nodeType;){var r=void 0;try{r=getComputedStyle(i)}catch(s){}if("undefined"==typeof r||null===r)return n.push(i),n;var a=r,f=a.overflow,h=a.overflowX,l=a.overflowY;/(auto|scroll)/.test(f+l+h)&&("absolute"!==o||["relative","absolute","fixed"].indexOf(r.position)>=0)&&n.push(i)}return n.push(document.body),n}function r(t){var e=void 0;t===document?(e=document,t=document.documentElement):e=t.ownerDocument;var o=e.documentElement,n={},i=t.getBoundingClientRect();for(var r in i)n[r]=i[r];var s=T(e);return n.top-=s.top,n.left-=s.left,"undefined"==typeof n.width&&(n.width=document.body.scrollWidth-n.left-n.right),"undefined"==typeof n.height&&(n.height=document.body.scrollHeight-n.top-n.bottom),n.top=n.top-o.clientTop,n.left=n.left-o.clientLeft,n.right=e.body.clientWidth-n.width-n.left,n.bottom=e.body.clientHeight-n.height-n.top,n}function s(t){return t.offsetParent||document.documentElement}function a(){var t=document.createElement("div");t.style.width="100%",t.style.height="200px";var e=document.createElement("div");f(e.style,{position:"absolute",top:0,left:0,pointerEvents:"none",visibility:"hidden",width:"200px",height:"150px",overflow:"hidden"}),e.appendChild(t),document.body.appendChild(e);var o=t.offsetWidth;e.style.overflow="scroll";var n=t.offsetWidth;o===n&&(n=e.clientWidth),document.body.removeChild(e);var i=o-n;return{width:i,height:i}}function f(){var t=arguments.length<=0||void 0===arguments[0]?{}:arguments[0],e=[];return Array.prototype.push.apply(e,arguments),e.slice(1).forEach(function(e){if(e)for(var o in e)({}).hasOwnProperty.call(e,o)&&(t[o]=e[o])}),t}function h(t,e){if("undefined"!=typeof t.classList)e.split(" ").forEach(function(e){e.trim()&&t.classList.remove(e)});else{var o=new RegExp("(^| )"+e.split(" ").join("|")+"( |$)","gi"),n=u(t).replace(o," ");p(t,n)}}function l(t,e){if("undefined"!=typeof t.classList)e.split(" ").forEach(function(e){e.trim()&&t.classList.add(e)});else{h(t,e);var o=u(t)+(" "+e);p(t,o)}}function d(t,e){if("undefined"!=typeof t.classList)return t.classList.contains(e);var o=u(t);return new RegExp("(^| )"+e+"( |$)","gi").test(o)}function u(t){return t.className instanceof SVGAnimatedString?t.className.baseVal:t.className}function p(t,e){t.setAttribute("class",e)}function c(t,e,o){o.forEach(function(o){-1===e.indexOf(o)&&d(t,o)&&h(t,o)}),e.forEach(function(e){d(t,e)||l(t,e)})}function n(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}function g(t,e){if("function"!=typeof e&&null!==e)throw new TypeError("Super expression must either be null or a function, not "+typeof e);t.prototype=Object.create(e&&e.prototype,{constructor:{value:t,enumerable:!1,writable:!0,configurable:!0}}),e&&(Object.setPrototypeOf?Object.setPrototypeOf(t,e):t.__proto__=e)}function m(t,e){var o=arguments.length<=2||void 0===arguments[2]?1:arguments[2];return t+o>=e&&e>=t-o}function v(){return"undefined"!=typeof performance&&"undefined"!=typeof performance.now?performance.now():+new Date}function y(){for(var t={top:0,left:0},e=arguments.length,o=Array(e),n=0;e>n;n++)o[n]=arguments[n];return o.forEach(function(e){var o=e.top,n=e.left;"string"==typeof o&&(o=parseFloat(o,10)),"string"==typeof n&&(n=parseFloat(n,10)),t.top+=o,t.left+=n}),t}function b(t,e){return"string"==typeof t.left&&-1!==t.left.indexOf("%")&&(t.left=parseFloat(t.left,10)/100*e.width),"string"==typeof t.top&&-1!==t.top.indexOf("%")&&(t.top=parseFloat(t.top,10)/100*e.height),t}function w(t,e){return"scrollParent"===e?e=t.scrollParent:"window"===e&&(e=[pageXOffset,pageYOffset,innerWidth+pageXOffset,innerHeight+pageYOffset]),e===document&&(e=e.documentElement),"undefined"!=typeof e.nodeType&&!function(){var t=r(e),o=t,n=getComputedStyle(e);e=[o.left,o.top,t.width+o.left,t.height+o.top],D.forEach(function(t,o){t=t[0].toUpperCase()+t.substr(1),"Top"===t||"Left"===t?e[o]+=parseFloat(n["border"+t+"Width"]):e[o]-=parseFloat(n["border"+t+"Width"])})}(),e}var C=function(){function t(t,e){for(var o=0;o1?o-1:0),i=1;o>i;i++)n[i-1]=arguments[i];for(;e16?(e=Math.min(e-16,250),void(o=setTimeout(i,250))):void("undefined"!=typeof t&&v()-t<10||("undefined"!=typeof o&&(clearTimeout(o),o=null),t=v(),j(),e=v()-t))};"undefined"!=typeof window&&"undefined"!=typeof window.addEventListener&&["resize","scroll","touchmove"].forEach(function(t){window.addEventListener(t,n)})}();var L={center:"center",left:"right",right:"left"},Y={middle:"middle",top:"bottom",bottom:"top"},F={top:0,left:0,middle:"50%",center:"50%",bottom:"100%",right:"100%"},H=function(t,e){var o=t.left,n=t.top;return"auto"===o&&(o=L[e.left]),"auto"===n&&(n=Y[e.top]),{left:o,top:n}},X=function(t){var e=t.left,o=t.top;return"undefined"!=typeof F[t.left]&&(e=F[t.left]),"undefined"!=typeof F[t.top]&&(o=F[t.top]),{left:e,top:o}},N=function(t){var e=t.split(" "),o=_(e,2),n=o[0],i=o[1];return{top:n,left:i}},R=N,U=function(t){function e(t){var o=this;n(this,e),M(Object.getPrototypeOf(e.prototype),"constructor",this).call(this),this.position=this.position.bind(this),z.push(this),this.history=[],this.setOptions(t,!1),O.modules.forEach(function(t){"undefined"!=typeof t.initialize&&t.initialize.call(o)}),this.position()}return g(e,t),C(e,[{key:"getClass",value:function(){var t=arguments.length<=0||void 0===arguments[0]?"":arguments[0],e=this.options.classes;return"undefined"!=typeof e&&e[t]?this.options.classes[t]:this.options.classPrefix?this.options.classPrefix+"-"+t:t}},{key:"setOptions",value:function(t){var e=this,o=arguments.length<=1||void 0===arguments[1]?!0:arguments[1],n={offset:"0 0",targetOffset:"0 0",targetAttachment:"auto auto",classPrefix:"tether"};this.options=f(n,t);var r=this.options,s=r.element,a=r.target,h=r.targetModifier;if(this.element=s,this.target=a,this.targetModifier=h,"viewport"===this.target?(this.target=document.body,this.targetModifier="visible"):"scroll-handle"===this.target&&(this.target=document.body,this.targetModifier="scroll-handle"),["element","target"].forEach(function(t){if("undefined"==typeof e[t])throw new Error("Tether Error: Both element and target must be defined");"undefined"!=typeof e[t].jquery?e[t]=e[t][0]:"string"==typeof e[t]&&(e[t]=document.querySelector(e[t]))}),l(this.element,this.getClass("element")),this.options.addTargetClasses!==!1&&l(this.target,this.getClass("target")),!this.options.attachment)throw new Error("Tether Error: You must provide an attachment");this.targetAttachment=R(this.options.targetAttachment),this.attachment=R(this.options.attachment),this.offset=N(this.options.offset),this.targetOffset=N(this.options.targetOffset),"undefined"!=typeof this.scrollParent&&this.disable(),"scroll-handle"===this.targetModifier?this.scrollParents=[this.target]:this.scrollParents=i(this.target),this.options.enabled!==!1&&this.enable(o)}},{key:"getTargetBounds",value:function(){if("undefined"==typeof this.targetModifier)return r(this.target);if("visible"===this.targetModifier){if(this.target===document.body)return{top:pageYOffset,left:pageXOffset,height:innerHeight,width:innerWidth};var t=r(this.target),e={height:t.height,width:t.width,top:t.top,left:t.left};return e.height=Math.min(e.height,t.height-(pageYOffset-t.top)),e.height=Math.min(e.height,t.height-(t.top+t.height-(pageYOffset+innerHeight))),e.height=Math.min(innerHeight,e.height),e.height-=2,e.width=Math.min(e.width,t.width-(pageXOffset-t.left)),e.width=Math.min(e.width,t.width-(t.left+t.width-(pageXOffset+innerWidth))),e.width=Math.min(innerWidth,e.width),e.width-=2,e.topo.clientWidth||[n.overflow,n.overflowX].indexOf("scroll")>=0||this.target!==document.body,s=0;i&&(s=15);var a=t.height-parseFloat(n.borderTopWidth)-parseFloat(n.borderBottomWidth)-s,e={width:15,height:.975*a*(a/o.scrollHeight),left:t.left+t.width-parseFloat(n.borderLeftWidth)-15},f=0;408>a&&this.target===document.body&&(f=-11e-5*Math.pow(a,2)-.00727*a+22.58),this.target!==document.body&&(e.height=Math.max(e.height,24));var h=this.target.scrollTop/(o.scrollHeight-a);return e.top=h*(a-e.height-f)+t.top+parseFloat(n.borderTopWidth),this.target===document.body&&(e.height=Math.max(e.height,24)),e}}},{key:"clearCache",value:function(){this._cache={}}},{key:"cache",value:function(t,e){return"undefined"==typeof this._cache&&(this._cache={}),"undefined"==typeof this._cache[t]&&(this._cache[t]=e.call(this)),this._cache[t]}},{key:"enable",value:function(){var t=this,e=arguments.length<=0||void 0===arguments[0]?!0:arguments[0];this.options.addTargetClasses!==!1&&l(this.target,this.getClass("enabled")),l(this.element,this.getClass("enabled")),this.enabled=!0,this.scrollParents.forEach(function(e){e!==document&&e.addEventListener("scroll",t.position)}),e&&this.position()}},{key:"disable",value:function(){var t=this;h(this.target,this.getClass("enabled")),h(this.element,this.getClass("enabled")),this.enabled=!1,"undefined"!=typeof this.scrollParents&&this.scrollParents.forEach(function(e){e.removeEventListener("scroll",t.position)})}},{key:"destroy",value:function(){var t=this;this.disable(),z.forEach(function(e,o){return e===t?void z.splice(o,1):void 0})}},{key:"updateAttachClasses",value:function(t,e){var o=this;t=t||this.attachment,e=e||this.targetAttachment;var n=["left","top","bottom","right","middle","center"];"undefined"!=typeof this._addAttachClasses&&this._addAttachClasses.length&&this._addAttachClasses.splice(0,this._addAttachClasses.length),"undefined"==typeof this._addAttachClasses&&(this._addAttachClasses=[]);var i=this._addAttachClasses;t.top&&i.push(this.getClass("element-attached")+"-"+t.top),t.left&&i.push(this.getClass("element-attached")+"-"+t.left),e.top&&i.push(this.getClass("target-attached")+"-"+e.top),e.left&&i.push(this.getClass("target-attached")+"-"+e.left);var r=[];n.forEach(function(t){r.push(o.getClass("element-attached")+"-"+t),r.push(o.getClass("target-attached")+"-"+t)}),S(function(){"undefined"!=typeof o._addAttachClasses&&(c(o.element,o._addAttachClasses,r),o.options.addTargetClasses!==!1&&c(o.target,o._addAttachClasses,r),delete o._addAttachClasses)})}},{key:"position",value:function(){var t=this,e=arguments.length<=0||void 0===arguments[0]?!0:arguments[0];if(this.enabled){this.clearCache();var o=H(this.targetAttachment,this.attachment);this.updateAttachClasses(this.attachment,o);var n=this.cache("element-bounds",function(){return r(t.element)}),i=n.width,f=n.height;if(0===i&&0===f&&"undefined"!=typeof this.lastSize){var h=this.lastSize;i=h.width,f=h.height}else this.lastSize={width:i,height:f};var l=this.cache("target-bounds",function(){return t.getTargetBounds()}),d=l,u=b(X(this.attachment),{width:i,height:f}),p=b(X(o),d),c=b(this.offset,{width:i,height:f}),g=b(this.targetOffset,d);u=y(u,c),p=y(p,g);for(var m=l.left+p.left-u.left,v=l.top+p.top-u.top,w=0;wwindow.innerWidth&&(T=this.cache("scrollbar-size",a),x.viewport.bottom-=T.height),document.body.scrollHeight>window.innerHeight&&(T=this.cache("scrollbar-size",a),x.viewport.right-=T.width),(-1===["","static"].indexOf(document.body.style.position)||-1===["","static"].indexOf(document.body.parentElement.style.position))&&(x.page.bottom=document.body.scrollHeight-v-f,x.page.right=document.body.scrollWidth-m-i),"undefined"!=typeof this.options.optimizations&&this.options.optimizations.moveElement!==!1&&"undefined"==typeof this.targetModifier&&!function(){var e=t.cache("target-offsetparent",function(){return s(t.target)}),o=t.cache("target-offsetparent-bounds",function(){return r(e)}),n=getComputedStyle(e),i=o,a={};if(["Top","Left","Bottom","Right"].forEach(function(t){a[t.toLowerCase()]=parseFloat(n["border"+t+"Width"])}),o.right=document.body.scrollWidth-o.left-i.width+a.right,o.bottom=document.body.scrollHeight-o.top-i.height+a.bottom,x.page.top>=o.top+a.top&&x.page.bottom>=o.bottom&&x.page.left>=o.left+a.left&&x.page.right>=o.right){var f=e.scrollTop,h=e.scrollLeft;x.offset={top:x.page.top-o.top+f-a.top,left:x.page.left-o.left+h-a.left}}}(),this.move(x),this.history.unshift(x),this.history.length>3&&this.history.pop(),e&&P(),!0}}},{key:"move",value:function(t){var e=this;if("undefined"!=typeof this.element.parentNode){var o={};for(var n in t){o[n]={};for(var i in t[n]){for(var r=!1,a=0;a=0){var c=s.split(" "),g=_(c,2);d=g[0],l=g[1]}else l=d=s;var b=w(e,r);("target"===d||"both"===d)&&(ob[3]&&"bottom"===v.top&&(o-=u,v.top="top")),"together"===d&&("top"===v.top&&("bottom"===y.top&&ob[3]&&o-(a-u)>=b[1]&&(o-=a-u,v.top="bottom",y.top="bottom")),"bottom"===v.top&&("top"===y.top&&o+a>b[3]?(o-=u,v.top="top",o-=a,y.top="bottom"):"bottom"===y.top&&ob[3]&&"top"===y.top?(o-=a,y.top="bottom"):ob[2]&&"right"===v.left&&(n-=p,v.left="left")),"together"===l&&(nb[2]&&"right"===v.left?"left"===y.left?(n-=p,v.left="left",n-=h,y.left="right"):"right"===y.left&&(n-=p,v.left="left",n+=h,y.left="left"):"center"===v.left&&(n+h>b[2]&&"left"===y.left?(n-=h,y.left="right"):nb[3]&&"top"===y.top&&(o-=a,y.top="bottom")),("element"===l||"both"===l)&&(nb[2]&&("left"===y.left?(n-=h,y.left="right"):"center"===y.left&&(n-=h/2,y.left="right"))),"string"==typeof f?f=f.split(",").map(function(t){return t.trim()}):f===!0&&(f=["top","left","right","bottom"]),f=f||[];var C=[],O=[];o=0?(o=b[1],C.push("top")):O.push("top")),o+a>b[3]&&(f.indexOf("bottom")>=0?(o=b[3]-a,C.push("bottom")):O.push("bottom")),n=0?(n=b[0],C.push("left")):O.push("left")),n+h>b[2]&&(f.indexOf("right")>=0?(n=b[2]-h,C.push("right")):O.push("right")),C.length&&!function(){var t=void 0;t="undefined"!=typeof e.options.pinnedClass?e.options.pinnedClass:e.getClass("pinned"),m.push(t),C.forEach(function(e){m.push(t+"-"+e)})}(),O.length&&!function(){var t=void 0;t="undefined"!=typeof e.options.outOfBoundsClass?e.options.outOfBoundsClass:e.getClass("out-of-bounds"),m.push(t),O.forEach(function(e){m.push(t+"-"+e)})}(),(C.indexOf("left")>=0||C.indexOf("right")>=0)&&(y.left=v.left=!1),(C.indexOf("top")>=0||C.indexOf("bottom")>=0)&&(y.top=v.top=!1),(v.top!==i.top||v.left!==i.left||y.top!==e.attachment.top||y.left!==e.attachment.left)&&(e.updateAttachClasses(y,v),e.trigger("update",{attachment:y,targetAttachment:v}))}),S(function(){e.options.addTargetClasses!==!1&&c(e.target,m,g),c(e.element,m,g)}),{top:o,left:n}}});var k=O.Utils,r=k.getBounds,c=k.updateClasses,S=k.defer;O.modules.push({position:function(t){var e=this,o=t.top,n=t.left,i=this.cache("element-bounds",function(){return r(e.element)}),s=i.height,a=i.width,f=this.getTargetBounds(),h=o+s,l=n+a,d=[];o<=f.bottom&&h>=f.top&&["left","right"].forEach(function(t){var e=f[t];(e===n||e===l)&&d.push(t)}),n<=f.right&&l>=f.left&&["top","bottom"].forEach(function(t){var e=f[t];(e===o||e===h)&&d.push(t)});var u=[],p=[],g=["left","top","right","bottom"];return u.push(this.getClass("abutted")),g.forEach(function(t){u.push(e.getClass("abutted")+"-"+t)}),d.length&&p.push(this.getClass("abutted")),d.forEach(function(t){p.push(e.getClass("abutted")+"-"+t)}),S(function(){e.options.addTargetClasses!==!1&&c(e.target,p,u),c(e.element,p,u)}),!0}});var _=function(){function t(t,e){var o=[],n=!0,i=!1,r=void 0;try{for(var s,a=t[Symbol.iterator]();!(n=(s=a.next()).done)&&(o.push(s.value),!e||o.length!==e);n=!0);}catch(f){i=!0,r=f}finally{try{!n&&a["return"]&&a["return"]()}finally{if(i)throw r}}return o}return function(e,o){if(Array.isArray(e))return e;if(Symbol.iterator in Object(e))return t(e,o);throw new TypeError("Invalid attempt to destructure non-iterable instance")}}();return O.modules.push({position:function(t){var e=t.top,o=t.left;if(this.options.shift){var n=this.options.shift;"function"==typeof this.options.shift&&(n=this.options.shift.call(this,{top:e,left:o}));var i=void 0,r=void 0;if("string"==typeof n){n=n.split(" "),n[1]=n[1]||n[0];var s=n,a=_(s,2);i=a[0],r=a[1],i=parseFloat(i,10),r=parseFloat(r,10)}else i=n.top,r=n.left;return e+=i,o+=r,{top:e,left:o}}}}),q});
      \ No newline at end of file
      diff --git a/docs/intro.html b/docs/intro.html
      index 58845af50..251868c14 100644
      --- a/docs/intro.html
      +++ b/docs/intro.html
      @@ -1,4 +1,4 @@
      -Tether
      -

      +

      diff --git a/examples/list_of_examples/index.html b/examples/list_of_examples/index.html index 758d90695..90d1b3b57 100644 --- a/examples/list_of_examples/index.html +++ b/examples/list_of_examples/index.html @@ -1,4 +1,4 @@ -Tether -

      Examples

      +

      Examples

      It's our goal to create a wide variety of example of how Tether can be used. Here's what we have so far, please send a PR with any examples you might create.

      diff --git a/examples/out-of-bounds/index.html b/examples/out-of-bounds/index.html index 29301e72b..c2a8c6d03 100644 --- a/examples/out-of-bounds/index.html +++ b/examples/out-of-bounds/index.html @@ -20,7 +20,7 @@ diff --git a/examples/projects_using_tether/index.html b/examples/projects_using_tether/index.html index b9caef001..e31e8553e 100644 --- a/examples/projects_using_tether/index.html +++ b/examples/projects_using_tether/index.html @@ -1,4 +1,4 @@ -Tether -

      Projects Using Tether

      +

      Projects Using Tether

      Here at HubSpot we have built a bunch of libraries on top of Tether, both because we wanted Tether-performance, and because we saw opportunities to improve on what was available in the client-side ecosystem.

      diff --git a/index.html b/index.html index 554afa64c..674252425 100644 --- a/index.html +++ b/index.html @@ -1,4 +1,4 @@ -Tether -

      Tether

      A client-side library to make absolutely positioned elements attach to elements in the page efficiently.

      1.2.0

      +

      Tether

      A client-side library to make absolutely positioned elements attach to elements in the page efficiently.

      1.3.0

      diff --git a/overview/repositioning/index.html b/overview/repositioning/index.html index adb9b2505..f3be63046 100644 --- a/overview/repositioning/index.html +++ b/overview/repositioning/index.html @@ -1,4 +1,4 @@ -Tether -

      Repositioning

      +

      Repositioning

      Tethers will be automatically repositioned when the page is resized, and when any element containing the Tether is scrolled. If the element moves for some other reason (e.g. with JavaScript), Tether won't know to reposition the element.

      Manually Repositioning

      diff --git a/overview/why_we_dont_support_ie_8/index.html b/overview/why_we_dont_support_ie_8/index.html index 4fef63cf2..4253154aa 100644 --- a/overview/why_we_dont_support_ie_8/index.html +++ b/overview/why_we_dont_support_ie_8/index.html @@ -1,4 +1,4 @@ -Tether -

      Why we don't support IE 8

      +

      Why we don't support IE 8

      We've been living in 2007 for a while now, pretending that new browser features don't exist because they aren't in IE8. You might not even know about some of these features, or think they are only enabled by jQuery or underscore, simply because it hasn't diff --git a/overview/why_you_should_use_tether/index.html b/overview/why_you_should_use_tether/index.html index 5a3f7cf93..faa96a403 100644 --- a/overview/why_you_should_use_tether/index.html +++ b/overview/why_you_should_use_tether/index.html @@ -1,4 +1,4 @@ -Tether

      -

      Why You Should Use Tether

      +

      Why You Should Use Tether

      Virtually every app includes some sort of overlay attached to an element on the page. Things like tooltips, dropdowns, hover-activated info boxes, etc.

      From 705882b28969e6951458625401628774eac200c7 Mon Sep 17 00:00:00 2001 From: Trevor Burnham Date: Tue, 19 Apr 2016 17:35:54 -0400 Subject: [PATCH 09/40] Revert "Rebuild docs for Tether 1.3.0" This reverts commit 466b95f1b37196fe92d5eef079006629953dbcb4. The Tether commit I used has a major bug in it. --- advanced/embedding_tether/index.html | 4 +- advanced/extending_tether/index.html | 4 +- dist/js/tether.js | 135 ++++++++---------- dist/js/tether.min.js | 2 +- docs/intro.html | 4 +- examples/list_of_examples/index.html | 4 +- examples/out-of-bounds/index.html | 5 +- examples/projects_using_tether/index.html | 4 +- index.html | 4 +- overview/repositioning/index.html | 4 +- overview/why_we_dont_support_ie_8/index.html | 4 +- overview/why_you_should_use_tether/index.html | 4 +- 12 files changed, 80 insertions(+), 98 deletions(-) diff --git a/advanced/embedding_tether/index.html b/advanced/embedding_tether/index.html index 5428b4426..feddf0302 100644 --- a/advanced/embedding_tether/index.html +++ b/advanced/embedding_tether/index.html @@ -1,4 +1,4 @@ -Tether -

      Embedding Tether

      +

      Embedding Tether

      Tether is designed to be embeddable in other libraries.

      There is one thing you should think about doing to create an embedded Tether:

        diff --git a/advanced/extending_tether/index.html b/advanced/extending_tether/index.html index 165d8bcdd..05c271065 100644 --- a/advanced/extending_tether/index.html +++ b/advanced/extending_tether/index.html @@ -1,4 +1,4 @@ -Tether -

        Extending Tether

        +

        Extending Tether

        Tether has a module system which can be used to modify Tether's positioning, or just do something each time the Tether is moved.

        Tether has an array called Tether.modules, push onto it to add a module:

        Tether.modules.push
        diff --git a/dist/js/tether.js b/dist/js/tether.js
        index 39539a1c1..a670e63d6 100644
        --- a/dist/js/tether.js
        +++ b/dist/js/tether.js
        @@ -1,4 +1,4 @@
        -/*! tether 1.3.0 */
        +/*! tether 1.2.0 */
         
         (function(root, factory) {
           if (typeof define === 'function' && define.amd) {
        @@ -21,27 +21,25 @@ if (typeof TetherBase === 'undefined') {
           TetherBase = { modules: [] };
         }
         
        -function getScrollParents(el) {
        +function getScrollParent(el) {
           // In firefox if the el is inside an iframe with display: none; window.getComputedStyle() will return null;
           // https://bugzilla.mozilla.org/show_bug.cgi?id=548397
           var computedStyle = getComputedStyle(el) || {};
           var position = computedStyle.position;
        -  var parents = [];
         
           if (position === 'fixed') {
        -    return [el];
        +    return el;
           }
         
           var parent = el;
        -  while ((parent = parent.parentNode) && parent.nodeType === 1) {
        +  while (parent = parent.parentNode) {
             var style = undefined;
             try {
               style = getComputedStyle(parent);
             } catch (err) {}
         
             if (typeof style === 'undefined' || style === null) {
        -      parents.push(parent);
        -      return parents;
        +      return parent;
             }
         
             var _style = style;
        @@ -51,13 +49,12 @@ function getScrollParents(el) {
         
             if (/(auto|scroll)/.test(overflow + overflowY + overflowX)) {
               if (position !== 'absolute' || ['relative', 'absolute', 'fixed'].indexOf(style.position) >= 0) {
        -        parents.push(parent);
        +        return parent;
               }
             }
           }
         
        -  parents.push(document.body);
        -  return parents;
        +  return document.body;
         }
         
         var uniqueId = (function () {
        @@ -362,7 +359,7 @@ var Evented = (function () {
         })();
         
         TetherBase.Utils = {
        -  getScrollParents: getScrollParents,
        +  getScrollParent: getScrollParent,
           getBounds: getBounds,
           getOffsetParent: getOffsetParent,
           extend: extend,
        @@ -384,18 +381,14 @@ var _slicedToArray = (function () { function sliceIterator(arr, i) { var _arr =
         
         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; }; })();
         
        -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); } } };
        -
         function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError('Cannot call a class as a function'); } }
         
        -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; }
        -
         if (typeof TetherBase === 'undefined') {
           throw new Error('You must include the utils.js file before tether.js');
         }
         
         var _TetherBase$Utils = TetherBase.Utils;
        -var getScrollParents = _TetherBase$Utils.getScrollParents;
        +var getScrollParent = _TetherBase$Utils.getScrollParent;
         var getBounds = _TetherBase$Utils.getBounds;
         var getOffsetParent = _TetherBase$Utils.getOffsetParent;
         var extend = _TetherBase$Utils.extend;
        @@ -473,7 +466,7 @@ function now() {
             lastDuration = now() - lastCall;
           };
         
        -  if (typeof window !== 'undefined' && typeof window.addEventListener !== 'undefined') {
        +  if (typeof window !== 'undefined') {
             ['resize', 'scroll', 'touchmove'].forEach(function (event) {
               window.addEventListener(event, tick);
             });
        @@ -579,15 +572,12 @@ var parseOffset = function parseOffset(value) {
         };
         var parseAttachment = parseOffset;
         
        -var TetherClass = (function (_Evented) {
        -  _inherits(TetherClass, _Evented);
        -
        +var TetherClass = (function () {
           function TetherClass(options) {
             var _this = this;
         
             _classCallCheck(this, TetherClass);
         
        -    _get(Object.getPrototypeOf(TetherClass.prototype), 'constructor', this).call(this);
             this.position = this.position.bind(this);
         
             tethers.push(this);
        @@ -683,9 +673,9 @@ var TetherClass = (function (_Evented) {
               }
         
               if (this.targetModifier === 'scroll-handle') {
        -        this.scrollParents = [this.target];
        +        this.scrollParent = this.target;
               } else {
        -        this.scrollParents = getScrollParents(this.target);
        +        this.scrollParent = getScrollParent(this.target);
               }
         
               if (!(this.options.enabled === false)) {
        @@ -806,8 +796,6 @@ var TetherClass = (function (_Evented) {
           }, {
             key: 'enable',
             value: function enable() {
        -      var _this3 = this;
        -
               var pos = arguments.length <= 0 || arguments[0] === undefined ? true : arguments[0];
         
               if (!(this.options.addTargetClasses === false)) {
        @@ -816,11 +804,9 @@ var TetherClass = (function (_Evented) {
               addClass(this.element, this.getClass('enabled'));
               this.enabled = true;
         
        -      this.scrollParents.forEach(function (parent) {
        -        if (parent !== document) {
        -          parent.addEventListener('scroll', _this3.position);
        -        }
        -      });
        +      if (this.scrollParent !== document) {
        +        this.scrollParent.addEventListener('scroll', this.position);
        +      }
         
               if (pos) {
                 this.position();
        @@ -829,27 +815,23 @@ var TetherClass = (function (_Evented) {
           }, {
             key: 'disable',
             value: function disable() {
        -      var _this4 = this;
        -
               removeClass(this.target, this.getClass('enabled'));
               removeClass(this.element, this.getClass('enabled'));
               this.enabled = false;
         
        -      if (typeof this.scrollParents !== 'undefined') {
        -        this.scrollParents.forEach(function (parent) {
        -          parent.removeEventListener('scroll', _this4.position);
        -        });
        +      if (typeof this.scrollParent !== 'undefined') {
        +        this.scrollParent.removeEventListener('scroll', this.position);
               }
             }
           }, {
             key: 'destroy',
             value: function destroy() {
        -      var _this5 = this;
        +      var _this3 = this;
         
               this.disable();
         
               tethers.forEach(function (tether, i) {
        -        if (tether === _this5) {
        +        if (tether === _this3) {
                   tethers.splice(i, 1);
                   return;
                 }
        @@ -858,7 +840,7 @@ var TetherClass = (function (_Evented) {
           }, {
             key: 'updateAttachClasses',
             value: function updateAttachClasses(elementAttach, targetAttach) {
        -      var _this6 = this;
        +      var _this4 = this;
         
               elementAttach = elementAttach || this.attachment;
               targetAttach = targetAttach || this.targetAttachment;
        @@ -891,27 +873,27 @@ var TetherClass = (function (_Evented) {
         
               var all = [];
               sides.forEach(function (side) {
        -        all.push(_this6.getClass('element-attached') + '-' + side);
        -        all.push(_this6.getClass('target-attached') + '-' + side);
        +        all.push(_this4.getClass('element-attached') + '-' + side);
        +        all.push(_this4.getClass('target-attached') + '-' + side);
               });
         
               defer(function () {
        -        if (!(typeof _this6._addAttachClasses !== 'undefined')) {
        +        if (!(typeof _this4._addAttachClasses !== 'undefined')) {
                   return;
                 }
         
        -        updateClasses(_this6.element, _this6._addAttachClasses, all);
        -        if (!(_this6.options.addTargetClasses === false)) {
        -          updateClasses(_this6.target, _this6._addAttachClasses, all);
        +        updateClasses(_this4.element, _this4._addAttachClasses, all);
        +        if (!(_this4.options.addTargetClasses === false)) {
        +          updateClasses(_this4.target, _this4._addAttachClasses, all);
                 }
         
        -        delete _this6._addAttachClasses;
        +        delete _this4._addAttachClasses;
               });
             }
           }, {
             key: 'position',
             value: function position() {
        -      var _this7 = this;
        +      var _this5 = this;
         
               var flushChanges = arguments.length <= 0 || arguments[0] === undefined ? true : arguments[0];
         
        @@ -930,7 +912,7 @@ var TetherClass = (function (_Evented) {
               this.updateAttachClasses(this.attachment, targetAttachment);
         
               var elementPos = this.cache('element-bounds', function () {
        -        return getBounds(_this7.element);
        +        return getBounds(_this5.element);
               });
         
               var width = elementPos.width;
        @@ -948,7 +930,7 @@ var TetherClass = (function (_Evented) {
               }
         
               var targetPos = this.cache('target-bounds', function () {
        -        return _this7.getTargetBounds();
        +        return _this5.getTargetBounds();
               });
               var targetSize = targetPos;
         
        @@ -1032,10 +1014,10 @@ var TetherClass = (function (_Evented) {
         
               if (typeof this.options.optimizations !== 'undefined' && this.options.optimizations.moveElement !== false && !(typeof this.targetModifier !== 'undefined')) {
                 (function () {
        -          var offsetParent = _this7.cache('target-offsetparent', function () {
        -            return getOffsetParent(_this7.target);
        +          var offsetParent = _this5.cache('target-offsetparent', function () {
        +            return getOffsetParent(_this5.target);
                   });
        -          var offsetPosition = _this7.cache('target-offsetparent-bounds', function () {
        +          var offsetPosition = _this5.cache('target-offsetparent-bounds', function () {
                     return getBounds(offsetParent);
                   });
                   var offsetParentStyle = getComputedStyle(offsetParent);
        @@ -1088,7 +1070,7 @@ var TetherClass = (function (_Evented) {
           }, {
             key: 'move',
             value: function move(pos) {
        -      var _this8 = this;
        +      var _this6 = this;
         
               if (!(typeof this.element.parentNode !== 'undefined')) {
                 return;
        @@ -1119,8 +1101,8 @@ var TetherClass = (function (_Evented) {
               var css = { top: '', left: '', right: '', bottom: '' };
         
               var transcribe = function transcribe(_same, _pos) {
        -        var hasOptimizations = typeof _this8.options.optimizations !== 'undefined';
        -        var gpu = hasOptimizations ? _this8.options.optimizations.gpu : null;
        +        var hasOptimizations = typeof _this6.options.optimizations !== 'undefined';
        +        var gpu = hasOptimizations ? _this6.options.optimizations.gpu : null;
                 if (gpu !== false) {
                   var yPos = undefined,
                       xPos = undefined;
        @@ -1172,14 +1154,14 @@ var TetherClass = (function (_Evented) {
               } else if (typeof same.offset !== 'undefined' && same.offset.top && same.offset.left) {
                 (function () {
                   css.position = 'absolute';
        -          var offsetParent = _this8.cache('target-offsetparent', function () {
        -            return getOffsetParent(_this8.target);
        +          var offsetParent = _this6.cache('target-offsetparent', function () {
        +            return getOffsetParent(_this6.target);
                   });
         
        -          if (getOffsetParent(_this8.element) !== offsetParent) {
        +          if (getOffsetParent(_this6.element) !== offsetParent) {
                     defer(function () {
        -              _this8.element.parentNode.removeChild(_this8.element);
        -              offsetParent.appendChild(_this8.element);
        +              _this6.element.parentNode.removeChild(_this6.element);
        +              offsetParent.appendChild(_this6.element);
                     });
                   }
         
        @@ -1194,7 +1176,7 @@ var TetherClass = (function (_Evented) {
               if (!moved) {
                 var offsetParentIsBody = true;
                 var currentNode = this.element.parentNode;
        -        while (currentNode && currentNode.nodeType === 1 && currentNode.tagName !== 'BODY') {
        +        while (currentNode && currentNode.tagName !== 'BODY') {
                   if (getComputedStyle(currentNode).position !== 'static') {
                     offsetParentIsBody = false;
                     break;
        @@ -1216,6 +1198,11 @@ var TetherClass = (function (_Evented) {
                 var val = css[key];
                 var elVal = this.element.style[key];
         
        +        if (elVal !== '' && val !== '' && ['top', 'left', 'bottom', 'right'].indexOf(key) >= 0) {
        +          elVal = parseFloat(elVal);
        +          val = parseFloat(val);
        +        }
        +
                 if (elVal !== val) {
                   write = true;
                   writeCSS[key] = val;
        @@ -1224,14 +1211,14 @@ var TetherClass = (function (_Evented) {
         
               if (write) {
                 defer(function () {
        -          extend(_this8.element.style, writeCSS);
        +          extend(_this6.element.style, writeCSS);
                 });
               }
             }
           }]);
         
           return TetherClass;
        -})(Evented);
        +})();
         
         TetherClass.modules = [];
         
        @@ -1382,32 +1369,34 @@ TetherBase.modules.push({
               }
         
               if (changeAttachY === 'together') {
        -        if (tAttachment.top === 'top') {
        -          if (eAttachment.top === 'bottom' && top < bounds[1]) {
        +        if (top < bounds[1] && tAttachment.top === 'top') {
        +          if (eAttachment.top === 'bottom') {
                     top += targetHeight;
                     tAttachment.top = 'bottom';
         
                     top += height;
                     eAttachment.top = 'top';
        -          } else if (eAttachment.top === 'top' && top + height > bounds[3] && top - (height - targetHeight) >= bounds[1]) {
        -            top -= height - targetHeight;
        +          } else if (eAttachment.top === 'top') {
        +            top += targetHeight;
                     tAttachment.top = 'bottom';
         
        +            top -= height;
                     eAttachment.top = 'bottom';
                   }
                 }
         
        -        if (tAttachment.top === 'bottom') {
        -          if (eAttachment.top === 'top' && top + height > bounds[3]) {
        +        if (top + height > bounds[3] && tAttachment.top === 'bottom') {
        +          if (eAttachment.top === 'top') {
                     top -= targetHeight;
                     tAttachment.top = 'top';
         
                     top -= height;
                     eAttachment.top = 'bottom';
        -          } else if (eAttachment.top === 'bottom' && top < bounds[1] && top + (height * 2 - targetHeight) <= bounds[3]) {
        -            top += height - targetHeight;
        +          } else if (eAttachment.top === 'bottom') {
        +            top -= targetHeight;
                     tAttachment.top = 'top';
         
        +            top += height;
                     eAttachment.top = 'top';
                   }
                 }
        @@ -1599,10 +1588,6 @@ TetherBase.modules.push({
         
               if (tAttachment.top !== targetAttachment.top || tAttachment.left !== targetAttachment.left || eAttachment.top !== _this.attachment.top || eAttachment.left !== _this.attachment.left) {
                 _this.updateAttachClasses(eAttachment, tAttachment);
        -        _this.trigger('update', {
        -          attachment: eAttachment,
        -          targetAttachment: tAttachment
        -        });
               }
             });
         
        diff --git a/dist/js/tether.min.js b/dist/js/tether.min.js
        index 71cebc778..9511798eb 100644
        --- a/dist/js/tether.min.js
        +++ b/dist/js/tether.min.js
        @@ -1 +1 @@
        -!function(t,e){"function"==typeof define&&define.amd?define(e):"object"==typeof exports?module.exports=e(require,exports,module):t.Tether=e()}(this,function(t,e,o){"use strict";function n(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}function i(t){var e=getComputedStyle(t)||{},o=e.position,n=[];if("fixed"===o)return[t];for(var i=t;(i=i.parentNode)&&1===i.nodeType;){var r=void 0;try{r=getComputedStyle(i)}catch(s){}if("undefined"==typeof r||null===r)return n.push(i),n;var a=r,f=a.overflow,h=a.overflowX,l=a.overflowY;/(auto|scroll)/.test(f+l+h)&&("absolute"!==o||["relative","absolute","fixed"].indexOf(r.position)>=0)&&n.push(i)}return n.push(document.body),n}function r(t){var e=void 0;t===document?(e=document,t=document.documentElement):e=t.ownerDocument;var o=e.documentElement,n={},i=t.getBoundingClientRect();for(var r in i)n[r]=i[r];var s=T(e);return n.top-=s.top,n.left-=s.left,"undefined"==typeof n.width&&(n.width=document.body.scrollWidth-n.left-n.right),"undefined"==typeof n.height&&(n.height=document.body.scrollHeight-n.top-n.bottom),n.top=n.top-o.clientTop,n.left=n.left-o.clientLeft,n.right=e.body.clientWidth-n.width-n.left,n.bottom=e.body.clientHeight-n.height-n.top,n}function s(t){return t.offsetParent||document.documentElement}function a(){var t=document.createElement("div");t.style.width="100%",t.style.height="200px";var e=document.createElement("div");f(e.style,{position:"absolute",top:0,left:0,pointerEvents:"none",visibility:"hidden",width:"200px",height:"150px",overflow:"hidden"}),e.appendChild(t),document.body.appendChild(e);var o=t.offsetWidth;e.style.overflow="scroll";var n=t.offsetWidth;o===n&&(n=e.clientWidth),document.body.removeChild(e);var i=o-n;return{width:i,height:i}}function f(){var t=arguments.length<=0||void 0===arguments[0]?{}:arguments[0],e=[];return Array.prototype.push.apply(e,arguments),e.slice(1).forEach(function(e){if(e)for(var o in e)({}).hasOwnProperty.call(e,o)&&(t[o]=e[o])}),t}function h(t,e){if("undefined"!=typeof t.classList)e.split(" ").forEach(function(e){e.trim()&&t.classList.remove(e)});else{var o=new RegExp("(^| )"+e.split(" ").join("|")+"( |$)","gi"),n=u(t).replace(o," ");p(t,n)}}function l(t,e){if("undefined"!=typeof t.classList)e.split(" ").forEach(function(e){e.trim()&&t.classList.add(e)});else{h(t,e);var o=u(t)+(" "+e);p(t,o)}}function d(t,e){if("undefined"!=typeof t.classList)return t.classList.contains(e);var o=u(t);return new RegExp("(^| )"+e+"( |$)","gi").test(o)}function u(t){return t.className instanceof SVGAnimatedString?t.className.baseVal:t.className}function p(t,e){t.setAttribute("class",e)}function c(t,e,o){o.forEach(function(o){-1===e.indexOf(o)&&d(t,o)&&h(t,o)}),e.forEach(function(e){d(t,e)||l(t,e)})}function n(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}function g(t,e){if("function"!=typeof e&&null!==e)throw new TypeError("Super expression must either be null or a function, not "+typeof e);t.prototype=Object.create(e&&e.prototype,{constructor:{value:t,enumerable:!1,writable:!0,configurable:!0}}),e&&(Object.setPrototypeOf?Object.setPrototypeOf(t,e):t.__proto__=e)}function m(t,e){var o=arguments.length<=2||void 0===arguments[2]?1:arguments[2];return t+o>=e&&e>=t-o}function v(){return"undefined"!=typeof performance&&"undefined"!=typeof performance.now?performance.now():+new Date}function y(){for(var t={top:0,left:0},e=arguments.length,o=Array(e),n=0;e>n;n++)o[n]=arguments[n];return o.forEach(function(e){var o=e.top,n=e.left;"string"==typeof o&&(o=parseFloat(o,10)),"string"==typeof n&&(n=parseFloat(n,10)),t.top+=o,t.left+=n}),t}function b(t,e){return"string"==typeof t.left&&-1!==t.left.indexOf("%")&&(t.left=parseFloat(t.left,10)/100*e.width),"string"==typeof t.top&&-1!==t.top.indexOf("%")&&(t.top=parseFloat(t.top,10)/100*e.height),t}function w(t,e){return"scrollParent"===e?e=t.scrollParent:"window"===e&&(e=[pageXOffset,pageYOffset,innerWidth+pageXOffset,innerHeight+pageYOffset]),e===document&&(e=e.documentElement),"undefined"!=typeof e.nodeType&&!function(){var t=r(e),o=t,n=getComputedStyle(e);e=[o.left,o.top,t.width+o.left,t.height+o.top],D.forEach(function(t,o){t=t[0].toUpperCase()+t.substr(1),"Top"===t||"Left"===t?e[o]+=parseFloat(n["border"+t+"Width"]):e[o]-=parseFloat(n["border"+t+"Width"])})}(),e}var C=function(){function t(t,e){for(var o=0;o1?o-1:0),i=1;o>i;i++)n[i-1]=arguments[i];for(;e16?(e=Math.min(e-16,250),void(o=setTimeout(i,250))):void("undefined"!=typeof t&&v()-t<10||("undefined"!=typeof o&&(clearTimeout(o),o=null),t=v(),j(),e=v()-t))};"undefined"!=typeof window&&"undefined"!=typeof window.addEventListener&&["resize","scroll","touchmove"].forEach(function(t){window.addEventListener(t,n)})}();var L={center:"center",left:"right",right:"left"},Y={middle:"middle",top:"bottom",bottom:"top"},F={top:0,left:0,middle:"50%",center:"50%",bottom:"100%",right:"100%"},H=function(t,e){var o=t.left,n=t.top;return"auto"===o&&(o=L[e.left]),"auto"===n&&(n=Y[e.top]),{left:o,top:n}},X=function(t){var e=t.left,o=t.top;return"undefined"!=typeof F[t.left]&&(e=F[t.left]),"undefined"!=typeof F[t.top]&&(o=F[t.top]),{left:e,top:o}},N=function(t){var e=t.split(" "),o=_(e,2),n=o[0],i=o[1];return{top:n,left:i}},R=N,U=function(t){function e(t){var o=this;n(this,e),M(Object.getPrototypeOf(e.prototype),"constructor",this).call(this),this.position=this.position.bind(this),z.push(this),this.history=[],this.setOptions(t,!1),O.modules.forEach(function(t){"undefined"!=typeof t.initialize&&t.initialize.call(o)}),this.position()}return g(e,t),C(e,[{key:"getClass",value:function(){var t=arguments.length<=0||void 0===arguments[0]?"":arguments[0],e=this.options.classes;return"undefined"!=typeof e&&e[t]?this.options.classes[t]:this.options.classPrefix?this.options.classPrefix+"-"+t:t}},{key:"setOptions",value:function(t){var e=this,o=arguments.length<=1||void 0===arguments[1]?!0:arguments[1],n={offset:"0 0",targetOffset:"0 0",targetAttachment:"auto auto",classPrefix:"tether"};this.options=f(n,t);var r=this.options,s=r.element,a=r.target,h=r.targetModifier;if(this.element=s,this.target=a,this.targetModifier=h,"viewport"===this.target?(this.target=document.body,this.targetModifier="visible"):"scroll-handle"===this.target&&(this.target=document.body,this.targetModifier="scroll-handle"),["element","target"].forEach(function(t){if("undefined"==typeof e[t])throw new Error("Tether Error: Both element and target must be defined");"undefined"!=typeof e[t].jquery?e[t]=e[t][0]:"string"==typeof e[t]&&(e[t]=document.querySelector(e[t]))}),l(this.element,this.getClass("element")),this.options.addTargetClasses!==!1&&l(this.target,this.getClass("target")),!this.options.attachment)throw new Error("Tether Error: You must provide an attachment");this.targetAttachment=R(this.options.targetAttachment),this.attachment=R(this.options.attachment),this.offset=N(this.options.offset),this.targetOffset=N(this.options.targetOffset),"undefined"!=typeof this.scrollParent&&this.disable(),"scroll-handle"===this.targetModifier?this.scrollParents=[this.target]:this.scrollParents=i(this.target),this.options.enabled!==!1&&this.enable(o)}},{key:"getTargetBounds",value:function(){if("undefined"==typeof this.targetModifier)return r(this.target);if("visible"===this.targetModifier){if(this.target===document.body)return{top:pageYOffset,left:pageXOffset,height:innerHeight,width:innerWidth};var t=r(this.target),e={height:t.height,width:t.width,top:t.top,left:t.left};return e.height=Math.min(e.height,t.height-(pageYOffset-t.top)),e.height=Math.min(e.height,t.height-(t.top+t.height-(pageYOffset+innerHeight))),e.height=Math.min(innerHeight,e.height),e.height-=2,e.width=Math.min(e.width,t.width-(pageXOffset-t.left)),e.width=Math.min(e.width,t.width-(t.left+t.width-(pageXOffset+innerWidth))),e.width=Math.min(innerWidth,e.width),e.width-=2,e.topo.clientWidth||[n.overflow,n.overflowX].indexOf("scroll")>=0||this.target!==document.body,s=0;i&&(s=15);var a=t.height-parseFloat(n.borderTopWidth)-parseFloat(n.borderBottomWidth)-s,e={width:15,height:.975*a*(a/o.scrollHeight),left:t.left+t.width-parseFloat(n.borderLeftWidth)-15},f=0;408>a&&this.target===document.body&&(f=-11e-5*Math.pow(a,2)-.00727*a+22.58),this.target!==document.body&&(e.height=Math.max(e.height,24));var h=this.target.scrollTop/(o.scrollHeight-a);return e.top=h*(a-e.height-f)+t.top+parseFloat(n.borderTopWidth),this.target===document.body&&(e.height=Math.max(e.height,24)),e}}},{key:"clearCache",value:function(){this._cache={}}},{key:"cache",value:function(t,e){return"undefined"==typeof this._cache&&(this._cache={}),"undefined"==typeof this._cache[t]&&(this._cache[t]=e.call(this)),this._cache[t]}},{key:"enable",value:function(){var t=this,e=arguments.length<=0||void 0===arguments[0]?!0:arguments[0];this.options.addTargetClasses!==!1&&l(this.target,this.getClass("enabled")),l(this.element,this.getClass("enabled")),this.enabled=!0,this.scrollParents.forEach(function(e){e!==document&&e.addEventListener("scroll",t.position)}),e&&this.position()}},{key:"disable",value:function(){var t=this;h(this.target,this.getClass("enabled")),h(this.element,this.getClass("enabled")),this.enabled=!1,"undefined"!=typeof this.scrollParents&&this.scrollParents.forEach(function(e){e.removeEventListener("scroll",t.position)})}},{key:"destroy",value:function(){var t=this;this.disable(),z.forEach(function(e,o){return e===t?void z.splice(o,1):void 0})}},{key:"updateAttachClasses",value:function(t,e){var o=this;t=t||this.attachment,e=e||this.targetAttachment;var n=["left","top","bottom","right","middle","center"];"undefined"!=typeof this._addAttachClasses&&this._addAttachClasses.length&&this._addAttachClasses.splice(0,this._addAttachClasses.length),"undefined"==typeof this._addAttachClasses&&(this._addAttachClasses=[]);var i=this._addAttachClasses;t.top&&i.push(this.getClass("element-attached")+"-"+t.top),t.left&&i.push(this.getClass("element-attached")+"-"+t.left),e.top&&i.push(this.getClass("target-attached")+"-"+e.top),e.left&&i.push(this.getClass("target-attached")+"-"+e.left);var r=[];n.forEach(function(t){r.push(o.getClass("element-attached")+"-"+t),r.push(o.getClass("target-attached")+"-"+t)}),S(function(){"undefined"!=typeof o._addAttachClasses&&(c(o.element,o._addAttachClasses,r),o.options.addTargetClasses!==!1&&c(o.target,o._addAttachClasses,r),delete o._addAttachClasses)})}},{key:"position",value:function(){var t=this,e=arguments.length<=0||void 0===arguments[0]?!0:arguments[0];if(this.enabled){this.clearCache();var o=H(this.targetAttachment,this.attachment);this.updateAttachClasses(this.attachment,o);var n=this.cache("element-bounds",function(){return r(t.element)}),i=n.width,f=n.height;if(0===i&&0===f&&"undefined"!=typeof this.lastSize){var h=this.lastSize;i=h.width,f=h.height}else this.lastSize={width:i,height:f};var l=this.cache("target-bounds",function(){return t.getTargetBounds()}),d=l,u=b(X(this.attachment),{width:i,height:f}),p=b(X(o),d),c=b(this.offset,{width:i,height:f}),g=b(this.targetOffset,d);u=y(u,c),p=y(p,g);for(var m=l.left+p.left-u.left,v=l.top+p.top-u.top,w=0;wwindow.innerWidth&&(T=this.cache("scrollbar-size",a),x.viewport.bottom-=T.height),document.body.scrollHeight>window.innerHeight&&(T=this.cache("scrollbar-size",a),x.viewport.right-=T.width),(-1===["","static"].indexOf(document.body.style.position)||-1===["","static"].indexOf(document.body.parentElement.style.position))&&(x.page.bottom=document.body.scrollHeight-v-f,x.page.right=document.body.scrollWidth-m-i),"undefined"!=typeof this.options.optimizations&&this.options.optimizations.moveElement!==!1&&"undefined"==typeof this.targetModifier&&!function(){var e=t.cache("target-offsetparent",function(){return s(t.target)}),o=t.cache("target-offsetparent-bounds",function(){return r(e)}),n=getComputedStyle(e),i=o,a={};if(["Top","Left","Bottom","Right"].forEach(function(t){a[t.toLowerCase()]=parseFloat(n["border"+t+"Width"])}),o.right=document.body.scrollWidth-o.left-i.width+a.right,o.bottom=document.body.scrollHeight-o.top-i.height+a.bottom,x.page.top>=o.top+a.top&&x.page.bottom>=o.bottom&&x.page.left>=o.left+a.left&&x.page.right>=o.right){var f=e.scrollTop,h=e.scrollLeft;x.offset={top:x.page.top-o.top+f-a.top,left:x.page.left-o.left+h-a.left}}}(),this.move(x),this.history.unshift(x),this.history.length>3&&this.history.pop(),e&&P(),!0}}},{key:"move",value:function(t){var e=this;if("undefined"!=typeof this.element.parentNode){var o={};for(var n in t){o[n]={};for(var i in t[n]){for(var r=!1,a=0;a=0){var c=s.split(" "),g=_(c,2);d=g[0],l=g[1]}else l=d=s;var b=w(e,r);("target"===d||"both"===d)&&(ob[3]&&"bottom"===v.top&&(o-=u,v.top="top")),"together"===d&&("top"===v.top&&("bottom"===y.top&&ob[3]&&o-(a-u)>=b[1]&&(o-=a-u,v.top="bottom",y.top="bottom")),"bottom"===v.top&&("top"===y.top&&o+a>b[3]?(o-=u,v.top="top",o-=a,y.top="bottom"):"bottom"===y.top&&ob[3]&&"top"===y.top?(o-=a,y.top="bottom"):ob[2]&&"right"===v.left&&(n-=p,v.left="left")),"together"===l&&(nb[2]&&"right"===v.left?"left"===y.left?(n-=p,v.left="left",n-=h,y.left="right"):"right"===y.left&&(n-=p,v.left="left",n+=h,y.left="left"):"center"===v.left&&(n+h>b[2]&&"left"===y.left?(n-=h,y.left="right"):nb[3]&&"top"===y.top&&(o-=a,y.top="bottom")),("element"===l||"both"===l)&&(nb[2]&&("left"===y.left?(n-=h,y.left="right"):"center"===y.left&&(n-=h/2,y.left="right"))),"string"==typeof f?f=f.split(",").map(function(t){return t.trim()}):f===!0&&(f=["top","left","right","bottom"]),f=f||[];var C=[],O=[];o=0?(o=b[1],C.push("top")):O.push("top")),o+a>b[3]&&(f.indexOf("bottom")>=0?(o=b[3]-a,C.push("bottom")):O.push("bottom")),n=0?(n=b[0],C.push("left")):O.push("left")),n+h>b[2]&&(f.indexOf("right")>=0?(n=b[2]-h,C.push("right")):O.push("right")),C.length&&!function(){var t=void 0;t="undefined"!=typeof e.options.pinnedClass?e.options.pinnedClass:e.getClass("pinned"),m.push(t),C.forEach(function(e){m.push(t+"-"+e)})}(),O.length&&!function(){var t=void 0;t="undefined"!=typeof e.options.outOfBoundsClass?e.options.outOfBoundsClass:e.getClass("out-of-bounds"),m.push(t),O.forEach(function(e){m.push(t+"-"+e)})}(),(C.indexOf("left")>=0||C.indexOf("right")>=0)&&(y.left=v.left=!1),(C.indexOf("top")>=0||C.indexOf("bottom")>=0)&&(y.top=v.top=!1),(v.top!==i.top||v.left!==i.left||y.top!==e.attachment.top||y.left!==e.attachment.left)&&(e.updateAttachClasses(y,v),e.trigger("update",{attachment:y,targetAttachment:v}))}),S(function(){e.options.addTargetClasses!==!1&&c(e.target,m,g),c(e.element,m,g)}),{top:o,left:n}}});var k=O.Utils,r=k.getBounds,c=k.updateClasses,S=k.defer;O.modules.push({position:function(t){var e=this,o=t.top,n=t.left,i=this.cache("element-bounds",function(){return r(e.element)}),s=i.height,a=i.width,f=this.getTargetBounds(),h=o+s,l=n+a,d=[];o<=f.bottom&&h>=f.top&&["left","right"].forEach(function(t){var e=f[t];(e===n||e===l)&&d.push(t)}),n<=f.right&&l>=f.left&&["top","bottom"].forEach(function(t){var e=f[t];(e===o||e===h)&&d.push(t)});var u=[],p=[],g=["left","top","right","bottom"];return u.push(this.getClass("abutted")),g.forEach(function(t){u.push(e.getClass("abutted")+"-"+t)}),d.length&&p.push(this.getClass("abutted")),d.forEach(function(t){p.push(e.getClass("abutted")+"-"+t)}),S(function(){e.options.addTargetClasses!==!1&&c(e.target,p,u),c(e.element,p,u)}),!0}});var _=function(){function t(t,e){var o=[],n=!0,i=!1,r=void 0;try{for(var s,a=t[Symbol.iterator]();!(n=(s=a.next()).done)&&(o.push(s.value),!e||o.length!==e);n=!0);}catch(f){i=!0,r=f}finally{try{!n&&a["return"]&&a["return"]()}finally{if(i)throw r}}return o}return function(e,o){if(Array.isArray(e))return e;if(Symbol.iterator in Object(e))return t(e,o);throw new TypeError("Invalid attempt to destructure non-iterable instance")}}();return O.modules.push({position:function(t){var e=t.top,o=t.left;if(this.options.shift){var n=this.options.shift;"function"==typeof this.options.shift&&(n=this.options.shift.call(this,{top:e,left:o}));var i=void 0,r=void 0;if("string"==typeof n){n=n.split(" "),n[1]=n[1]||n[0];var s=n,a=_(s,2);i=a[0],r=a[1],i=parseFloat(i,10),r=parseFloat(r,10)}else i=n.top,r=n.left;return e+=i,o+=r,{top:e,left:o}}}}),q});
        \ No newline at end of file
        +!function(t,e){"function"==typeof define&&define.amd?define(e):"object"==typeof exports?module.exports=e(require,exports,module):t.Tether=e()}(this,function(t,e,o){"use strict";function i(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}function n(t){var e=getComputedStyle(t)||{},o=e.position;if("fixed"===o)return t;for(var i=t;i=i.parentNode;){var n=void 0;try{n=getComputedStyle(i)}catch(r){}if("undefined"==typeof n||null===n)return i;var s=n,a=s.overflow,f=s.overflowX,h=s.overflowY;if(/(auto|scroll)/.test(a+h+f)&&("absolute"!==o||["relative","absolute","fixed"].indexOf(n.position)>=0))return i}return document.body}function r(t){var e=void 0;t===document?(e=document,t=document.documentElement):e=t.ownerDocument;var o=e.documentElement,i={},n=t.getBoundingClientRect();for(var r in n)i[r]=n[r];var s=x(e);return i.top-=s.top,i.left-=s.left,"undefined"==typeof i.width&&(i.width=document.body.scrollWidth-i.left-i.right),"undefined"==typeof i.height&&(i.height=document.body.scrollHeight-i.top-i.bottom),i.top=i.top-o.clientTop,i.left=i.left-o.clientLeft,i.right=e.body.clientWidth-i.width-i.left,i.bottom=e.body.clientHeight-i.height-i.top,i}function s(t){return t.offsetParent||document.documentElement}function a(){var t=document.createElement("div");t.style.width="100%",t.style.height="200px";var e=document.createElement("div");f(e.style,{position:"absolute",top:0,left:0,pointerEvents:"none",visibility:"hidden",width:"200px",height:"150px",overflow:"hidden"}),e.appendChild(t),document.body.appendChild(e);var o=t.offsetWidth;e.style.overflow="scroll";var i=t.offsetWidth;o===i&&(i=e.clientWidth),document.body.removeChild(e);var n=o-i;return{width:n,height:n}}function f(){var t=arguments.length<=0||void 0===arguments[0]?{}:arguments[0],e=[];return Array.prototype.push.apply(e,arguments),e.slice(1).forEach(function(e){if(e)for(var o in e)({}).hasOwnProperty.call(e,o)&&(t[o]=e[o])}),t}function h(t,e){if("undefined"!=typeof t.classList)e.split(" ").forEach(function(e){e.trim()&&t.classList.remove(e)});else{var o=new RegExp("(^| )"+e.split(" ").join("|")+"( |$)","gi"),i=u(t).replace(o," ");p(t,i)}}function l(t,e){if("undefined"!=typeof t.classList)e.split(" ").forEach(function(e){e.trim()&&t.classList.add(e)});else{h(t,e);var o=u(t)+(" "+e);p(t,o)}}function d(t,e){if("undefined"!=typeof t.classList)return t.classList.contains(e);var o=u(t);return new RegExp("(^| )"+e+"( |$)","gi").test(o)}function u(t){return t.className instanceof SVGAnimatedString?t.className.baseVal:t.className}function p(t,e){t.setAttribute("class",e)}function c(t,e,o){o.forEach(function(o){-1===e.indexOf(o)&&d(t,o)&&h(t,o)}),e.forEach(function(e){d(t,e)||l(t,e)})}function i(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}function g(t,e){var o=arguments.length<=2||void 0===arguments[2]?1:arguments[2];return t+o>=e&&e>=t-o}function m(){return"undefined"!=typeof performance&&"undefined"!=typeof performance.now?performance.now():+new Date}function v(){for(var t={top:0,left:0},e=arguments.length,o=Array(e),i=0;e>i;i++)o[i]=arguments[i];return o.forEach(function(e){var o=e.top,i=e.left;"string"==typeof o&&(o=parseFloat(o,10)),"string"==typeof i&&(i=parseFloat(i,10)),t.top+=o,t.left+=i}),t}function y(t,e){return"string"==typeof t.left&&-1!==t.left.indexOf("%")&&(t.left=parseFloat(t.left,10)/100*e.width),"string"==typeof t.top&&-1!==t.top.indexOf("%")&&(t.top=parseFloat(t.top,10)/100*e.height),t}function b(t,e){return"scrollParent"===e?e=t.scrollParent:"window"===e&&(e=[pageXOffset,pageYOffset,innerWidth+pageXOffset,innerHeight+pageYOffset]),e===document&&(e=e.documentElement),"undefined"!=typeof e.nodeType&&!function(){var t=r(e),o=t,i=getComputedStyle(e);e=[o.left,o.top,t.width+o.left,t.height+o.top],U.forEach(function(t,o){t=t[0].toUpperCase()+t.substr(1),"Top"===t||"Left"===t?e[o]+=parseFloat(i["border"+t+"Width"]):e[o]-=parseFloat(i["border"+t+"Width"])})}(),e}var w=function(){function t(t,e){for(var o=0;o1?o-1:0),n=1;o>n;n++)i[n-1]=arguments[n];for(;e16?(e=Math.min(e-16,250),void(o=setTimeout(n,250))):void("undefined"!=typeof t&&m()-t<10||("undefined"!=typeof o&&(clearTimeout(o),o=null),t=m(),_(),e=m()-t))};"undefined"!=typeof window&&["resize","scroll","touchmove"].forEach(function(t){window.addEventListener(t,i)})}();var z={center:"center",left:"right",right:"left"},F={middle:"middle",top:"bottom",bottom:"top"},L={top:0,left:0,middle:"50%",center:"50%",bottom:"100%",right:"100%"},Y=function(t,e){var o=t.left,i=t.top;return"auto"===o&&(o=z[e.left]),"auto"===i&&(i=F[e.top]),{left:o,top:i}},H=function(t){var e=t.left,o=t.top;return"undefined"!=typeof L[t.left]&&(e=L[t.left]),"undefined"!=typeof L[t.top]&&(o=L[t.top]),{left:e,top:o}},X=function(t){var e=t.split(" "),o=M(e,2),i=o[0],n=o[1];return{top:i,left:n}},j=X,N=function(){function t(e){var o=this;i(this,t),this.position=this.position.bind(this),B.push(this),this.history=[],this.setOptions(e,!1),C.modules.forEach(function(t){"undefined"!=typeof t.initialize&&t.initialize.call(o)}),this.position()}return w(t,[{key:"getClass",value:function(){var t=arguments.length<=0||void 0===arguments[0]?"":arguments[0],e=this.options.classes;return"undefined"!=typeof e&&e[t]?this.options.classes[t]:this.options.classPrefix?this.options.classPrefix+"-"+t:t}},{key:"setOptions",value:function(t){var e=this,o=arguments.length<=1||void 0===arguments[1]?!0:arguments[1],i={offset:"0 0",targetOffset:"0 0",targetAttachment:"auto auto",classPrefix:"tether"};this.options=f(i,t);var r=this.options,s=r.element,a=r.target,h=r.targetModifier;if(this.element=s,this.target=a,this.targetModifier=h,"viewport"===this.target?(this.target=document.body,this.targetModifier="visible"):"scroll-handle"===this.target&&(this.target=document.body,this.targetModifier="scroll-handle"),["element","target"].forEach(function(t){if("undefined"==typeof e[t])throw new Error("Tether Error: Both element and target must be defined");"undefined"!=typeof e[t].jquery?e[t]=e[t][0]:"string"==typeof e[t]&&(e[t]=document.querySelector(e[t]))}),l(this.element,this.getClass("element")),this.options.addTargetClasses!==!1&&l(this.target,this.getClass("target")),!this.options.attachment)throw new Error("Tether Error: You must provide an attachment");this.targetAttachment=j(this.options.targetAttachment),this.attachment=j(this.options.attachment),this.offset=X(this.options.offset),this.targetOffset=X(this.options.targetOffset),"undefined"!=typeof this.scrollParent&&this.disable(),"scroll-handle"===this.targetModifier?this.scrollParent=this.target:this.scrollParent=n(this.target),this.options.enabled!==!1&&this.enable(o)}},{key:"getTargetBounds",value:function(){if("undefined"==typeof this.targetModifier)return r(this.target);if("visible"===this.targetModifier){if(this.target===document.body)return{top:pageYOffset,left:pageXOffset,height:innerHeight,width:innerWidth};var t=r(this.target),e={height:t.height,width:t.width,top:t.top,left:t.left};return e.height=Math.min(e.height,t.height-(pageYOffset-t.top)),e.height=Math.min(e.height,t.height-(t.top+t.height-(pageYOffset+innerHeight))),e.height=Math.min(innerHeight,e.height),e.height-=2,e.width=Math.min(e.width,t.width-(pageXOffset-t.left)),e.width=Math.min(e.width,t.width-(t.left+t.width-(pageXOffset+innerWidth))),e.width=Math.min(innerWidth,e.width),e.width-=2,e.topo.clientWidth||[i.overflow,i.overflowX].indexOf("scroll")>=0||this.target!==document.body,s=0;n&&(s=15);var a=t.height-parseFloat(i.borderTopWidth)-parseFloat(i.borderBottomWidth)-s,e={width:15,height:.975*a*(a/o.scrollHeight),left:t.left+t.width-parseFloat(i.borderLeftWidth)-15},f=0;408>a&&this.target===document.body&&(f=-11e-5*Math.pow(a,2)-.00727*a+22.58),this.target!==document.body&&(e.height=Math.max(e.height,24));var h=this.target.scrollTop/(o.scrollHeight-a);return e.top=h*(a-e.height-f)+t.top+parseFloat(i.borderTopWidth),this.target===document.body&&(e.height=Math.max(e.height,24)),e}}},{key:"clearCache",value:function(){this._cache={}}},{key:"cache",value:function(t,e){return"undefined"==typeof this._cache&&(this._cache={}),"undefined"==typeof this._cache[t]&&(this._cache[t]=e.call(this)),this._cache[t]}},{key:"enable",value:function(){var t=arguments.length<=0||void 0===arguments[0]?!0:arguments[0];this.options.addTargetClasses!==!1&&l(this.target,this.getClass("enabled")),l(this.element,this.getClass("enabled")),this.enabled=!0,this.scrollParent!==document&&this.scrollParent.addEventListener("scroll",this.position),t&&this.position()}},{key:"disable",value:function(){h(this.target,this.getClass("enabled")),h(this.element,this.getClass("enabled")),this.enabled=!1,"undefined"!=typeof this.scrollParent&&this.scrollParent.removeEventListener("scroll",this.position)}},{key:"destroy",value:function(){var t=this;this.disable(),B.forEach(function(e,o){return e===t?void B.splice(o,1):void 0})}},{key:"updateAttachClasses",value:function(t,e){var o=this;t=t||this.attachment,e=e||this.targetAttachment;var i=["left","top","bottom","right","middle","center"];"undefined"!=typeof this._addAttachClasses&&this._addAttachClasses.length&&this._addAttachClasses.splice(0,this._addAttachClasses.length),"undefined"==typeof this._addAttachClasses&&(this._addAttachClasses=[]);var n=this._addAttachClasses;t.top&&n.push(this.getClass("element-attached")+"-"+t.top),t.left&&n.push(this.getClass("element-attached")+"-"+t.left),e.top&&n.push(this.getClass("target-attached")+"-"+e.top),e.left&&n.push(this.getClass("target-attached")+"-"+e.left);var r=[];i.forEach(function(t){r.push(o.getClass("element-attached")+"-"+t),r.push(o.getClass("target-attached")+"-"+t)}),T(function(){"undefined"!=typeof o._addAttachClasses&&(c(o.element,o._addAttachClasses,r),o.options.addTargetClasses!==!1&&c(o.target,o._addAttachClasses,r),delete o._addAttachClasses)})}},{key:"position",value:function(){var t=this,e=arguments.length<=0||void 0===arguments[0]?!0:arguments[0];if(this.enabled){this.clearCache();var o=Y(this.targetAttachment,this.attachment);this.updateAttachClasses(this.attachment,o);var i=this.cache("element-bounds",function(){return r(t.element)}),n=i.width,f=i.height;if(0===n&&0===f&&"undefined"!=typeof this.lastSize){var h=this.lastSize;n=h.width,f=h.height}else this.lastSize={width:n,height:f};var l=this.cache("target-bounds",function(){return t.getTargetBounds()}),d=l,u=y(H(this.attachment),{width:n,height:f}),p=y(H(o),d),c=y(this.offset,{width:n,height:f}),g=y(this.targetOffset,d);u=v(u,c),p=v(p,g);for(var m=l.left+p.left-u.left,b=l.top+p.top-u.top,w=0;wwindow.innerWidth&&(A=this.cache("scrollbar-size",a),x.viewport.bottom-=A.height),document.body.scrollHeight>window.innerHeight&&(A=this.cache("scrollbar-size",a),x.viewport.right-=A.width),(-1===["","static"].indexOf(document.body.style.position)||-1===["","static"].indexOf(document.body.parentElement.style.position))&&(x.page.bottom=document.body.scrollHeight-b-f,x.page.right=document.body.scrollWidth-m-n),"undefined"!=typeof this.options.optimizations&&this.options.optimizations.moveElement!==!1&&"undefined"==typeof this.targetModifier&&!function(){var e=t.cache("target-offsetparent",function(){return s(t.target)}),o=t.cache("target-offsetparent-bounds",function(){return r(e)}),i=getComputedStyle(e),n=o,a={};if(["Top","Left","Bottom","Right"].forEach(function(t){a[t.toLowerCase()]=parseFloat(i["border"+t+"Width"])}),o.right=document.body.scrollWidth-o.left-n.width+a.right,o.bottom=document.body.scrollHeight-o.top-n.height+a.bottom,x.page.top>=o.top+a.top&&x.page.bottom>=o.bottom&&x.page.left>=o.left+a.left&&x.page.right>=o.right){var f=e.scrollTop,h=e.scrollLeft;x.offset={top:x.page.top-o.top+f-a.top,left:x.page.left-o.left+h-a.left}}}(),this.move(x),this.history.unshift(x),this.history.length>3&&this.history.pop(),e&&S(),!0}}},{key:"move",value:function(t){var e=this;if("undefined"!=typeof this.element.parentNode){var o={};for(var i in t){o[i]={};for(var n in t[i]){for(var r=!1,a=0;a=0&&(b=parseFloat(b),y=parseFloat(y)),b!==y&&(v=!0,m[n]=y)}v&&T(function(){f(e.element.style,m)})}}}]),t}();N.modules=[],C.position=_;var R=f(N,C),M=function(){function t(t,e){var o=[],i=!0,n=!1,r=void 0;try{for(var s,a=t[Symbol.iterator]();!(i=(s=a.next()).done)&&(o.push(s.value),!e||o.length!==e);i=!0);}catch(f){n=!0,r=f}finally{try{!i&&a["return"]&&a["return"]()}finally{if(n)throw r}}return o}return function(e,o){if(Array.isArray(e))return e;if(Symbol.iterator in Object(e))return t(e,o);throw new TypeError("Invalid attempt to destructure non-iterable instance")}}(),P=C.Utils,r=P.getBounds,f=P.extend,c=P.updateClasses,T=P.defer,U=["left","top","right","bottom"];C.modules.push({position:function(t){var e=this,o=t.top,i=t.left,n=t.targetAttachment;if(!this.options.constraints)return!0;var s=this.cache("element-bounds",function(){return r(e.element)}),a=s.height,h=s.width;if(0===h&&0===a&&"undefined"!=typeof this.lastSize){var l=this.lastSize;h=l.width,a=l.height}var d=this.cache("target-bounds",function(){return e.getTargetBounds()}),u=d.height,p=d.width,g=[this.getClass("pinned"),this.getClass("out-of-bounds")];this.options.constraints.forEach(function(t){var e=t.outOfBoundsClass,o=t.pinnedClass;e&&g.push(e),o&&g.push(o)}),g.forEach(function(t){["left","top","right","bottom"].forEach(function(e){g.push(t+"-"+e)})});var m=[],v=f({},n),y=f({},this.attachment);return this.options.constraints.forEach(function(t){var r=t.to,s=t.attachment,f=t.pin;"undefined"==typeof s&&(s="");var l=void 0,d=void 0;if(s.indexOf(" ")>=0){var c=s.split(" "),g=M(c,2);d=g[0],l=g[1]}else l=d=s;var w=b(e,r);("target"===d||"both"===d)&&(ow[3]&&"bottom"===v.top&&(o-=u,v.top="top")),"together"===d&&(ow[3]&&"bottom"===v.top&&("top"===y.top?(o-=u,v.top="top",o-=a,y.top="bottom"):"bottom"===y.top&&(o-=u,v.top="top",o+=a,y.top="top")),"middle"===v.top&&(o+a>w[3]&&"top"===y.top?(o-=a,y.top="bottom"):ow[2]&&"right"===v.left&&(i-=p,v.left="left")),"together"===l&&(iw[2]&&"right"===v.left?"left"===y.left?(i-=p,v.left="left",i-=h,y.left="right"):"right"===y.left&&(i-=p,v.left="left",i+=h,y.left="left"):"center"===v.left&&(i+h>w[2]&&"left"===y.left?(i-=h,y.left="right"):iw[3]&&"top"===y.top&&(o-=a,y.top="bottom")),("element"===l||"both"===l)&&(iw[2]&&("left"===y.left?(i-=h,y.left="right"):"center"===y.left&&(i-=h/2,y.left="right"))),"string"==typeof f?f=f.split(",").map(function(t){return t.trim()}):f===!0&&(f=["top","left","right","bottom"]),f=f||[];var C=[],O=[];o=0?(o=w[1],C.push("top")):O.push("top")),o+a>w[3]&&(f.indexOf("bottom")>=0?(o=w[3]-a,C.push("bottom")):O.push("bottom")),i=0?(i=w[0],C.push("left")):O.push("left")),i+h>w[2]&&(f.indexOf("right")>=0?(i=w[2]-h,C.push("right")):O.push("right")),C.length&&!function(){var t=void 0;t="undefined"!=typeof e.options.pinnedClass?e.options.pinnedClass:e.getClass("pinned"),m.push(t),C.forEach(function(e){m.push(t+"-"+e)})}(),O.length&&!function(){var t=void 0;t="undefined"!=typeof e.options.outOfBoundsClass?e.options.outOfBoundsClass:e.getClass("out-of-bounds"),m.push(t),O.forEach(function(e){m.push(t+"-"+e)})}(),(C.indexOf("left")>=0||C.indexOf("right")>=0)&&(y.left=v.left=!1),(C.indexOf("top")>=0||C.indexOf("bottom")>=0)&&(y.top=v.top=!1),(v.top!==n.top||v.left!==n.left||y.top!==e.attachment.top||y.left!==e.attachment.left)&&e.updateAttachClasses(y,v)}),T(function(){e.options.addTargetClasses!==!1&&c(e.target,m,g),c(e.element,m,g)}),{top:o,left:i}}});var P=C.Utils,r=P.getBounds,c=P.updateClasses,T=P.defer;C.modules.push({position:function(t){var e=this,o=t.top,i=t.left,n=this.cache("element-bounds",function(){return r(e.element)}),s=n.height,a=n.width,f=this.getTargetBounds(),h=o+s,l=i+a,d=[];o<=f.bottom&&h>=f.top&&["left","right"].forEach(function(t){var e=f[t];(e===i||e===l)&&d.push(t)}),i<=f.right&&l>=f.left&&["top","bottom"].forEach(function(t){var e=f[t];(e===o||e===h)&&d.push(t)});var u=[],p=[],g=["left","top","right","bottom"];return u.push(this.getClass("abutted")),g.forEach(function(t){u.push(e.getClass("abutted")+"-"+t)}),d.length&&p.push(this.getClass("abutted")),d.forEach(function(t){p.push(e.getClass("abutted")+"-"+t)}),T(function(){e.options.addTargetClasses!==!1&&c(e.target,p,u),c(e.element,p,u)}),!0}});var M=function(){function t(t,e){var o=[],i=!0,n=!1,r=void 0;try{for(var s,a=t[Symbol.iterator]();!(i=(s=a.next()).done)&&(o.push(s.value),!e||o.length!==e);i=!0);}catch(f){n=!0,r=f}finally{try{!i&&a["return"]&&a["return"]()}finally{if(n)throw r}}return o}return function(e,o){if(Array.isArray(e))return e;if(Symbol.iterator in Object(e))return t(e,o);throw new TypeError("Invalid attempt to destructure non-iterable instance")}}();return C.modules.push({position:function(t){var e=t.top,o=t.left;if(this.options.shift){var i=this.options.shift;"function"==typeof this.options.shift&&(i=this.options.shift.call(this,{top:e,left:o}));var n=void 0,r=void 0;if("string"==typeof i){i=i.split(" "),i[1]=i[1]||i[0];var s=i,a=M(s,2);n=a[0],r=a[1],n=parseFloat(n,10),r=parseFloat(r,10)}else n=i.top,r=i.left;return e+=n,o+=r,{top:e,left:o}}}}),R});
        \ No newline at end of file
        diff --git a/docs/intro.html b/docs/intro.html
        index 251868c14..58845af50 100644
        --- a/docs/intro.html
        +++ b/docs/intro.html
        @@ -1,4 +1,4 @@
        -Tether
        -

        +

        diff --git a/examples/list_of_examples/index.html b/examples/list_of_examples/index.html index 90d1b3b57..758d90695 100644 --- a/examples/list_of_examples/index.html +++ b/examples/list_of_examples/index.html @@ -1,4 +1,4 @@ -Tether -

        Examples

        +

        Examples

        It's our goal to create a wide variety of example of how Tether can be used. Here's what we have so far, please send a PR with any examples you might create.

        diff --git a/examples/out-of-bounds/index.html b/examples/out-of-bounds/index.html index c2a8c6d03..29301e72b 100644 --- a/examples/out-of-bounds/index.html +++ b/examples/out-of-bounds/index.html @@ -20,7 +20,7 @@ diff --git a/examples/projects_using_tether/index.html b/examples/projects_using_tether/index.html index e31e8553e..b9caef001 100644 --- a/examples/projects_using_tether/index.html +++ b/examples/projects_using_tether/index.html @@ -1,4 +1,4 @@ -Tether -

        Projects Using Tether

        +

        Projects Using Tether

        Here at HubSpot we have built a bunch of libraries on top of Tether, both because we wanted Tether-performance, and because we saw opportunities to improve on what was available in the client-side ecosystem.

        diff --git a/index.html b/index.html index 674252425..554afa64c 100644 --- a/index.html +++ b/index.html @@ -1,4 +1,4 @@ -Tether -

        Tether

        A client-side library to make absolutely positioned elements attach to elements in the page efficiently.

        1.3.0

        +

        Tether

        A client-side library to make absolutely positioned elements attach to elements in the page efficiently.

        1.2.0

        diff --git a/overview/repositioning/index.html b/overview/repositioning/index.html index f3be63046..adb9b2505 100644 --- a/overview/repositioning/index.html +++ b/overview/repositioning/index.html @@ -1,4 +1,4 @@ -Tether -

        Repositioning

        +

        Repositioning

        Tethers will be automatically repositioned when the page is resized, and when any element containing the Tether is scrolled. If the element moves for some other reason (e.g. with JavaScript), Tether won't know to reposition the element.

        Manually Repositioning

        diff --git a/overview/why_we_dont_support_ie_8/index.html b/overview/why_we_dont_support_ie_8/index.html index 4253154aa..4fef63cf2 100644 --- a/overview/why_we_dont_support_ie_8/index.html +++ b/overview/why_we_dont_support_ie_8/index.html @@ -1,4 +1,4 @@ -Tether -

        Why we don't support IE 8

        +

        Why we don't support IE 8

        We've been living in 2007 for a while now, pretending that new browser features don't exist because they aren't in IE8. You might not even know about some of these features, or think they are only enabled by jQuery or underscore, simply because it hasn't diff --git a/overview/why_you_should_use_tether/index.html b/overview/why_you_should_use_tether/index.html index faa96a403..5a3f7cf93 100644 --- a/overview/why_you_should_use_tether/index.html +++ b/overview/why_you_should_use_tether/index.html @@ -1,4 +1,4 @@ -Tether

        -

        Why You Should Use Tether

        +

        Why You Should Use Tether

        Virtually every app includes some sort of overlay attached to an element on the page. Things like tooltips, dropdowns, hover-activated info boxes, etc.

        From 8d6dd26d4e7b631e6cbe76bfcbe6d340a6427a3f Mon Sep 17 00:00:00 2001 From: Trevor Burnham Date: Tue, 19 Apr 2016 17:38:26 -0400 Subject: [PATCH 10/40] Rebuild docs for Tether 1.3.0, take two --- advanced/embedding_tether/index.html | 4 +- advanced/extending_tether/index.html | 4 +- dist/js/tether.js | 135 ++++++++++-------- dist/js/tether.min.js | 2 +- docs/intro.html | 4 +- examples/list_of_examples/index.html | 4 +- examples/out-of-bounds/index.html | 5 +- examples/projects_using_tether/index.html | 4 +- index.html | 4 +- overview/repositioning/index.html | 4 +- overview/why_we_dont_support_ie_8/index.html | 4 +- overview/why_you_should_use_tether/index.html | 4 +- 12 files changed, 98 insertions(+), 80 deletions(-) diff --git a/advanced/embedding_tether/index.html b/advanced/embedding_tether/index.html index feddf0302..5428b4426 100644 --- a/advanced/embedding_tether/index.html +++ b/advanced/embedding_tether/index.html @@ -1,4 +1,4 @@ -Tether -

        Embedding Tether

        +

        Embedding Tether

        Tether is designed to be embeddable in other libraries.

        There is one thing you should think about doing to create an embedded Tether:

          diff --git a/advanced/extending_tether/index.html b/advanced/extending_tether/index.html index 05c271065..165d8bcdd 100644 --- a/advanced/extending_tether/index.html +++ b/advanced/extending_tether/index.html @@ -1,4 +1,4 @@ -Tether -

          Extending Tether

          +

          Extending Tether

          Tether has a module system which can be used to modify Tether's positioning, or just do something each time the Tether is moved.

          Tether has an array called Tether.modules, push onto it to add a module:

          Tether.modules.push
          diff --git a/dist/js/tether.js b/dist/js/tether.js
          index a670e63d6..ca253480d 100644
          --- a/dist/js/tether.js
          +++ b/dist/js/tether.js
          @@ -1,4 +1,4 @@
          -/*! tether 1.2.0 */
          +/*! tether 1.3.0 */
           
           (function(root, factory) {
             if (typeof define === 'function' && define.amd) {
          @@ -21,25 +21,27 @@ if (typeof TetherBase === 'undefined') {
             TetherBase = { modules: [] };
           }
           
          -function getScrollParent(el) {
          +function getScrollParents(el) {
             // In firefox if the el is inside an iframe with display: none; window.getComputedStyle() will return null;
             // https://bugzilla.mozilla.org/show_bug.cgi?id=548397
             var computedStyle = getComputedStyle(el) || {};
             var position = computedStyle.position;
          +  var parents = [];
           
             if (position === 'fixed') {
          -    return el;
          +    return [el];
             }
           
             var parent = el;
          -  while (parent = parent.parentNode) {
          +  while ((parent = parent.parentNode) && parent && parent.nodeType === 1) {
               var style = undefined;
               try {
                 style = getComputedStyle(parent);
               } catch (err) {}
           
               if (typeof style === 'undefined' || style === null) {
          -      return parent;
          +      parents.push(parent);
          +      return parents;
               }
           
               var _style = style;
          @@ -49,12 +51,13 @@ function getScrollParent(el) {
           
               if (/(auto|scroll)/.test(overflow + overflowY + overflowX)) {
                 if (position !== 'absolute' || ['relative', 'absolute', 'fixed'].indexOf(style.position) >= 0) {
          -        return parent;
          +        parents.push(parent);
                 }
               }
             }
           
          -  return document.body;
          +  parents.push(document.body);
          +  return parents;
           }
           
           var uniqueId = (function () {
          @@ -359,7 +362,7 @@ var Evented = (function () {
           })();
           
           TetherBase.Utils = {
          -  getScrollParent: getScrollParent,
          +  getScrollParents: getScrollParents,
             getBounds: getBounds,
             getOffsetParent: getOffsetParent,
             extend: extend,
          @@ -381,14 +384,18 @@ var _slicedToArray = (function () { function sliceIterator(arr, i) { var _arr =
           
           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; }; })();
           
          +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); } } };
          +
           function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError('Cannot call a class as a function'); } }
           
          +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; }
          +
           if (typeof TetherBase === 'undefined') {
             throw new Error('You must include the utils.js file before tether.js');
           }
           
           var _TetherBase$Utils = TetherBase.Utils;
          -var getScrollParent = _TetherBase$Utils.getScrollParent;
          +var getScrollParents = _TetherBase$Utils.getScrollParents;
           var getBounds = _TetherBase$Utils.getBounds;
           var getOffsetParent = _TetherBase$Utils.getOffsetParent;
           var extend = _TetherBase$Utils.extend;
          @@ -466,7 +473,7 @@ function now() {
               lastDuration = now() - lastCall;
             };
           
          -  if (typeof window !== 'undefined') {
          +  if (typeof window !== 'undefined' && typeof window.addEventListener !== 'undefined') {
               ['resize', 'scroll', 'touchmove'].forEach(function (event) {
                 window.addEventListener(event, tick);
               });
          @@ -572,12 +579,15 @@ var parseOffset = function parseOffset(value) {
           };
           var parseAttachment = parseOffset;
           
          -var TetherClass = (function () {
          +var TetherClass = (function (_Evented) {
          +  _inherits(TetherClass, _Evented);
          +
             function TetherClass(options) {
               var _this = this;
           
               _classCallCheck(this, TetherClass);
           
          +    _get(Object.getPrototypeOf(TetherClass.prototype), 'constructor', this).call(this);
               this.position = this.position.bind(this);
           
               tethers.push(this);
          @@ -673,9 +683,9 @@ var TetherClass = (function () {
                 }
           
                 if (this.targetModifier === 'scroll-handle') {
          -        this.scrollParent = this.target;
          +        this.scrollParents = [this.target];
                 } else {
          -        this.scrollParent = getScrollParent(this.target);
          +        this.scrollParents = getScrollParents(this.target);
                 }
           
                 if (!(this.options.enabled === false)) {
          @@ -796,6 +806,8 @@ var TetherClass = (function () {
             }, {
               key: 'enable',
               value: function enable() {
          +      var _this3 = this;
          +
                 var pos = arguments.length <= 0 || arguments[0] === undefined ? true : arguments[0];
           
                 if (!(this.options.addTargetClasses === false)) {
          @@ -804,9 +816,11 @@ var TetherClass = (function () {
                 addClass(this.element, this.getClass('enabled'));
                 this.enabled = true;
           
          -      if (this.scrollParent !== document) {
          -        this.scrollParent.addEventListener('scroll', this.position);
          -      }
          +      this.scrollParents.forEach(function (parent) {
          +        if (parent !== document) {
          +          parent.addEventListener('scroll', _this3.position);
          +        }
          +      });
           
                 if (pos) {
                   this.position();
          @@ -815,23 +829,27 @@ var TetherClass = (function () {
             }, {
               key: 'disable',
               value: function disable() {
          +      var _this4 = this;
          +
                 removeClass(this.target, this.getClass('enabled'));
                 removeClass(this.element, this.getClass('enabled'));
                 this.enabled = false;
           
          -      if (typeof this.scrollParent !== 'undefined') {
          -        this.scrollParent.removeEventListener('scroll', this.position);
          +      if (typeof this.scrollParents !== 'undefined') {
          +        this.scrollParents.forEach(function (parent) {
          +          parent.removeEventListener('scroll', _this4.position);
          +        });
                 }
               }
             }, {
               key: 'destroy',
               value: function destroy() {
          -      var _this3 = this;
          +      var _this5 = this;
           
                 this.disable();
           
                 tethers.forEach(function (tether, i) {
          -        if (tether === _this3) {
          +        if (tether === _this5) {
                     tethers.splice(i, 1);
                     return;
                   }
          @@ -840,7 +858,7 @@ var TetherClass = (function () {
             }, {
               key: 'updateAttachClasses',
               value: function updateAttachClasses(elementAttach, targetAttach) {
          -      var _this4 = this;
          +      var _this6 = this;
           
                 elementAttach = elementAttach || this.attachment;
                 targetAttach = targetAttach || this.targetAttachment;
          @@ -873,27 +891,27 @@ var TetherClass = (function () {
           
                 var all = [];
                 sides.forEach(function (side) {
          -        all.push(_this4.getClass('element-attached') + '-' + side);
          -        all.push(_this4.getClass('target-attached') + '-' + side);
          +        all.push(_this6.getClass('element-attached') + '-' + side);
          +        all.push(_this6.getClass('target-attached') + '-' + side);
                 });
           
                 defer(function () {
          -        if (!(typeof _this4._addAttachClasses !== 'undefined')) {
          +        if (!(typeof _this6._addAttachClasses !== 'undefined')) {
                     return;
                   }
           
          -        updateClasses(_this4.element, _this4._addAttachClasses, all);
          -        if (!(_this4.options.addTargetClasses === false)) {
          -          updateClasses(_this4.target, _this4._addAttachClasses, all);
          +        updateClasses(_this6.element, _this6._addAttachClasses, all);
          +        if (!(_this6.options.addTargetClasses === false)) {
          +          updateClasses(_this6.target, _this6._addAttachClasses, all);
                   }
           
          -        delete _this4._addAttachClasses;
          +        delete _this6._addAttachClasses;
                 });
               }
             }, {
               key: 'position',
               value: function position() {
          -      var _this5 = this;
          +      var _this7 = this;
           
                 var flushChanges = arguments.length <= 0 || arguments[0] === undefined ? true : arguments[0];
           
          @@ -912,7 +930,7 @@ var TetherClass = (function () {
                 this.updateAttachClasses(this.attachment, targetAttachment);
           
                 var elementPos = this.cache('element-bounds', function () {
          -        return getBounds(_this5.element);
          +        return getBounds(_this7.element);
                 });
           
                 var width = elementPos.width;
          @@ -930,7 +948,7 @@ var TetherClass = (function () {
                 }
           
                 var targetPos = this.cache('target-bounds', function () {
          -        return _this5.getTargetBounds();
          +        return _this7.getTargetBounds();
                 });
                 var targetSize = targetPos;
           
          @@ -1014,10 +1032,10 @@ var TetherClass = (function () {
           
                 if (typeof this.options.optimizations !== 'undefined' && this.options.optimizations.moveElement !== false && !(typeof this.targetModifier !== 'undefined')) {
                   (function () {
          -          var offsetParent = _this5.cache('target-offsetparent', function () {
          -            return getOffsetParent(_this5.target);
          +          var offsetParent = _this7.cache('target-offsetparent', function () {
          +            return getOffsetParent(_this7.target);
                     });
          -          var offsetPosition = _this5.cache('target-offsetparent-bounds', function () {
          +          var offsetPosition = _this7.cache('target-offsetparent-bounds', function () {
                       return getBounds(offsetParent);
                     });
                     var offsetParentStyle = getComputedStyle(offsetParent);
          @@ -1070,7 +1088,7 @@ var TetherClass = (function () {
             }, {
               key: 'move',
               value: function move(pos) {
          -      var _this6 = this;
          +      var _this8 = this;
           
                 if (!(typeof this.element.parentNode !== 'undefined')) {
                   return;
          @@ -1101,8 +1119,8 @@ var TetherClass = (function () {
                 var css = { top: '', left: '', right: '', bottom: '' };
           
                 var transcribe = function transcribe(_same, _pos) {
          -        var hasOptimizations = typeof _this6.options.optimizations !== 'undefined';
          -        var gpu = hasOptimizations ? _this6.options.optimizations.gpu : null;
          +        var hasOptimizations = typeof _this8.options.optimizations !== 'undefined';
          +        var gpu = hasOptimizations ? _this8.options.optimizations.gpu : null;
                   if (gpu !== false) {
                     var yPos = undefined,
                         xPos = undefined;
          @@ -1154,14 +1172,14 @@ var TetherClass = (function () {
                 } else if (typeof same.offset !== 'undefined' && same.offset.top && same.offset.left) {
                   (function () {
                     css.position = 'absolute';
          -          var offsetParent = _this6.cache('target-offsetparent', function () {
          -            return getOffsetParent(_this6.target);
          +          var offsetParent = _this8.cache('target-offsetparent', function () {
          +            return getOffsetParent(_this8.target);
                     });
           
          -          if (getOffsetParent(_this6.element) !== offsetParent) {
          +          if (getOffsetParent(_this8.element) !== offsetParent) {
                       defer(function () {
          -              _this6.element.parentNode.removeChild(_this6.element);
          -              offsetParent.appendChild(_this6.element);
          +              _this8.element.parentNode.removeChild(_this8.element);
          +              offsetParent.appendChild(_this8.element);
                       });
                     }
           
          @@ -1176,7 +1194,7 @@ var TetherClass = (function () {
                 if (!moved) {
                   var offsetParentIsBody = true;
                   var currentNode = this.element.parentNode;
          -        while (currentNode && currentNode.tagName !== 'BODY') {
          +        while (currentNode && currentNode.nodeType === 1 && currentNode.tagName !== 'BODY') {
                     if (getComputedStyle(currentNode).position !== 'static') {
                       offsetParentIsBody = false;
                       break;
          @@ -1198,11 +1216,6 @@ var TetherClass = (function () {
                   var val = css[key];
                   var elVal = this.element.style[key];
           
          -        if (elVal !== '' && val !== '' && ['top', 'left', 'bottom', 'right'].indexOf(key) >= 0) {
          -          elVal = parseFloat(elVal);
          -          val = parseFloat(val);
          -        }
          -
                   if (elVal !== val) {
                     write = true;
                     writeCSS[key] = val;
          @@ -1211,14 +1224,14 @@ var TetherClass = (function () {
           
                 if (write) {
                   defer(function () {
          -          extend(_this6.element.style, writeCSS);
          +          extend(_this8.element.style, writeCSS);
                   });
                 }
               }
             }]);
           
             return TetherClass;
          -})();
          +})(Evented);
           
           TetherClass.modules = [];
           
          @@ -1369,34 +1382,32 @@ TetherBase.modules.push({
                 }
           
                 if (changeAttachY === 'together') {
          -        if (top < bounds[1] && tAttachment.top === 'top') {
          -          if (eAttachment.top === 'bottom') {
          +        if (tAttachment.top === 'top') {
          +          if (eAttachment.top === 'bottom' && top < bounds[1]) {
                       top += targetHeight;
                       tAttachment.top = 'bottom';
           
                       top += height;
                       eAttachment.top = 'top';
          -          } else if (eAttachment.top === 'top') {
          -            top += targetHeight;
          +          } else if (eAttachment.top === 'top' && top + height > bounds[3] && top - (height - targetHeight) >= bounds[1]) {
          +            top -= height - targetHeight;
                       tAttachment.top = 'bottom';
           
          -            top -= height;
                       eAttachment.top = 'bottom';
                     }
                   }
           
          -        if (top + height > bounds[3] && tAttachment.top === 'bottom') {
          -          if (eAttachment.top === 'top') {
          +        if (tAttachment.top === 'bottom') {
          +          if (eAttachment.top === 'top' && top + height > bounds[3]) {
                       top -= targetHeight;
                       tAttachment.top = 'top';
           
                       top -= height;
                       eAttachment.top = 'bottom';
          -          } else if (eAttachment.top === 'bottom') {
          -            top -= targetHeight;
          +          } else if (eAttachment.top === 'bottom' && top < bounds[1] && top + (height * 2 - targetHeight) <= bounds[3]) {
          +            top += height - targetHeight;
                       tAttachment.top = 'top';
           
          -            top += height;
                       eAttachment.top = 'top';
                     }
                   }
          @@ -1588,6 +1599,10 @@ TetherBase.modules.push({
           
                 if (tAttachment.top !== targetAttachment.top || tAttachment.left !== targetAttachment.left || eAttachment.top !== _this.attachment.top || eAttachment.left !== _this.attachment.left) {
                   _this.updateAttachClasses(eAttachment, tAttachment);
          +        _this.trigger('update', {
          +          attachment: eAttachment,
          +          targetAttachment: tAttachment
          +        });
                 }
               });
           
          diff --git a/dist/js/tether.min.js b/dist/js/tether.min.js
          index 9511798eb..3f8952ab1 100644
          --- a/dist/js/tether.min.js
          +++ b/dist/js/tether.min.js
          @@ -1 +1 @@
          -!function(t,e){"function"==typeof define&&define.amd?define(e):"object"==typeof exports?module.exports=e(require,exports,module):t.Tether=e()}(this,function(t,e,o){"use strict";function i(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}function n(t){var e=getComputedStyle(t)||{},o=e.position;if("fixed"===o)return t;for(var i=t;i=i.parentNode;){var n=void 0;try{n=getComputedStyle(i)}catch(r){}if("undefined"==typeof n||null===n)return i;var s=n,a=s.overflow,f=s.overflowX,h=s.overflowY;if(/(auto|scroll)/.test(a+h+f)&&("absolute"!==o||["relative","absolute","fixed"].indexOf(n.position)>=0))return i}return document.body}function r(t){var e=void 0;t===document?(e=document,t=document.documentElement):e=t.ownerDocument;var o=e.documentElement,i={},n=t.getBoundingClientRect();for(var r in n)i[r]=n[r];var s=x(e);return i.top-=s.top,i.left-=s.left,"undefined"==typeof i.width&&(i.width=document.body.scrollWidth-i.left-i.right),"undefined"==typeof i.height&&(i.height=document.body.scrollHeight-i.top-i.bottom),i.top=i.top-o.clientTop,i.left=i.left-o.clientLeft,i.right=e.body.clientWidth-i.width-i.left,i.bottom=e.body.clientHeight-i.height-i.top,i}function s(t){return t.offsetParent||document.documentElement}function a(){var t=document.createElement("div");t.style.width="100%",t.style.height="200px";var e=document.createElement("div");f(e.style,{position:"absolute",top:0,left:0,pointerEvents:"none",visibility:"hidden",width:"200px",height:"150px",overflow:"hidden"}),e.appendChild(t),document.body.appendChild(e);var o=t.offsetWidth;e.style.overflow="scroll";var i=t.offsetWidth;o===i&&(i=e.clientWidth),document.body.removeChild(e);var n=o-i;return{width:n,height:n}}function f(){var t=arguments.length<=0||void 0===arguments[0]?{}:arguments[0],e=[];return Array.prototype.push.apply(e,arguments),e.slice(1).forEach(function(e){if(e)for(var o in e)({}).hasOwnProperty.call(e,o)&&(t[o]=e[o])}),t}function h(t,e){if("undefined"!=typeof t.classList)e.split(" ").forEach(function(e){e.trim()&&t.classList.remove(e)});else{var o=new RegExp("(^| )"+e.split(" ").join("|")+"( |$)","gi"),i=u(t).replace(o," ");p(t,i)}}function l(t,e){if("undefined"!=typeof t.classList)e.split(" ").forEach(function(e){e.trim()&&t.classList.add(e)});else{h(t,e);var o=u(t)+(" "+e);p(t,o)}}function d(t,e){if("undefined"!=typeof t.classList)return t.classList.contains(e);var o=u(t);return new RegExp("(^| )"+e+"( |$)","gi").test(o)}function u(t){return t.className instanceof SVGAnimatedString?t.className.baseVal:t.className}function p(t,e){t.setAttribute("class",e)}function c(t,e,o){o.forEach(function(o){-1===e.indexOf(o)&&d(t,o)&&h(t,o)}),e.forEach(function(e){d(t,e)||l(t,e)})}function i(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}function g(t,e){var o=arguments.length<=2||void 0===arguments[2]?1:arguments[2];return t+o>=e&&e>=t-o}function m(){return"undefined"!=typeof performance&&"undefined"!=typeof performance.now?performance.now():+new Date}function v(){for(var t={top:0,left:0},e=arguments.length,o=Array(e),i=0;e>i;i++)o[i]=arguments[i];return o.forEach(function(e){var o=e.top,i=e.left;"string"==typeof o&&(o=parseFloat(o,10)),"string"==typeof i&&(i=parseFloat(i,10)),t.top+=o,t.left+=i}),t}function y(t,e){return"string"==typeof t.left&&-1!==t.left.indexOf("%")&&(t.left=parseFloat(t.left,10)/100*e.width),"string"==typeof t.top&&-1!==t.top.indexOf("%")&&(t.top=parseFloat(t.top,10)/100*e.height),t}function b(t,e){return"scrollParent"===e?e=t.scrollParent:"window"===e&&(e=[pageXOffset,pageYOffset,innerWidth+pageXOffset,innerHeight+pageYOffset]),e===document&&(e=e.documentElement),"undefined"!=typeof e.nodeType&&!function(){var t=r(e),o=t,i=getComputedStyle(e);e=[o.left,o.top,t.width+o.left,t.height+o.top],U.forEach(function(t,o){t=t[0].toUpperCase()+t.substr(1),"Top"===t||"Left"===t?e[o]+=parseFloat(i["border"+t+"Width"]):e[o]-=parseFloat(i["border"+t+"Width"])})}(),e}var w=function(){function t(t,e){for(var o=0;o1?o-1:0),n=1;o>n;n++)i[n-1]=arguments[n];for(;e16?(e=Math.min(e-16,250),void(o=setTimeout(n,250))):void("undefined"!=typeof t&&m()-t<10||("undefined"!=typeof o&&(clearTimeout(o),o=null),t=m(),_(),e=m()-t))};"undefined"!=typeof window&&["resize","scroll","touchmove"].forEach(function(t){window.addEventListener(t,i)})}();var z={center:"center",left:"right",right:"left"},F={middle:"middle",top:"bottom",bottom:"top"},L={top:0,left:0,middle:"50%",center:"50%",bottom:"100%",right:"100%"},Y=function(t,e){var o=t.left,i=t.top;return"auto"===o&&(o=z[e.left]),"auto"===i&&(i=F[e.top]),{left:o,top:i}},H=function(t){var e=t.left,o=t.top;return"undefined"!=typeof L[t.left]&&(e=L[t.left]),"undefined"!=typeof L[t.top]&&(o=L[t.top]),{left:e,top:o}},X=function(t){var e=t.split(" "),o=M(e,2),i=o[0],n=o[1];return{top:i,left:n}},j=X,N=function(){function t(e){var o=this;i(this,t),this.position=this.position.bind(this),B.push(this),this.history=[],this.setOptions(e,!1),C.modules.forEach(function(t){"undefined"!=typeof t.initialize&&t.initialize.call(o)}),this.position()}return w(t,[{key:"getClass",value:function(){var t=arguments.length<=0||void 0===arguments[0]?"":arguments[0],e=this.options.classes;return"undefined"!=typeof e&&e[t]?this.options.classes[t]:this.options.classPrefix?this.options.classPrefix+"-"+t:t}},{key:"setOptions",value:function(t){var e=this,o=arguments.length<=1||void 0===arguments[1]?!0:arguments[1],i={offset:"0 0",targetOffset:"0 0",targetAttachment:"auto auto",classPrefix:"tether"};this.options=f(i,t);var r=this.options,s=r.element,a=r.target,h=r.targetModifier;if(this.element=s,this.target=a,this.targetModifier=h,"viewport"===this.target?(this.target=document.body,this.targetModifier="visible"):"scroll-handle"===this.target&&(this.target=document.body,this.targetModifier="scroll-handle"),["element","target"].forEach(function(t){if("undefined"==typeof e[t])throw new Error("Tether Error: Both element and target must be defined");"undefined"!=typeof e[t].jquery?e[t]=e[t][0]:"string"==typeof e[t]&&(e[t]=document.querySelector(e[t]))}),l(this.element,this.getClass("element")),this.options.addTargetClasses!==!1&&l(this.target,this.getClass("target")),!this.options.attachment)throw new Error("Tether Error: You must provide an attachment");this.targetAttachment=j(this.options.targetAttachment),this.attachment=j(this.options.attachment),this.offset=X(this.options.offset),this.targetOffset=X(this.options.targetOffset),"undefined"!=typeof this.scrollParent&&this.disable(),"scroll-handle"===this.targetModifier?this.scrollParent=this.target:this.scrollParent=n(this.target),this.options.enabled!==!1&&this.enable(o)}},{key:"getTargetBounds",value:function(){if("undefined"==typeof this.targetModifier)return r(this.target);if("visible"===this.targetModifier){if(this.target===document.body)return{top:pageYOffset,left:pageXOffset,height:innerHeight,width:innerWidth};var t=r(this.target),e={height:t.height,width:t.width,top:t.top,left:t.left};return e.height=Math.min(e.height,t.height-(pageYOffset-t.top)),e.height=Math.min(e.height,t.height-(t.top+t.height-(pageYOffset+innerHeight))),e.height=Math.min(innerHeight,e.height),e.height-=2,e.width=Math.min(e.width,t.width-(pageXOffset-t.left)),e.width=Math.min(e.width,t.width-(t.left+t.width-(pageXOffset+innerWidth))),e.width=Math.min(innerWidth,e.width),e.width-=2,e.topo.clientWidth||[i.overflow,i.overflowX].indexOf("scroll")>=0||this.target!==document.body,s=0;n&&(s=15);var a=t.height-parseFloat(i.borderTopWidth)-parseFloat(i.borderBottomWidth)-s,e={width:15,height:.975*a*(a/o.scrollHeight),left:t.left+t.width-parseFloat(i.borderLeftWidth)-15},f=0;408>a&&this.target===document.body&&(f=-11e-5*Math.pow(a,2)-.00727*a+22.58),this.target!==document.body&&(e.height=Math.max(e.height,24));var h=this.target.scrollTop/(o.scrollHeight-a);return e.top=h*(a-e.height-f)+t.top+parseFloat(i.borderTopWidth),this.target===document.body&&(e.height=Math.max(e.height,24)),e}}},{key:"clearCache",value:function(){this._cache={}}},{key:"cache",value:function(t,e){return"undefined"==typeof this._cache&&(this._cache={}),"undefined"==typeof this._cache[t]&&(this._cache[t]=e.call(this)),this._cache[t]}},{key:"enable",value:function(){var t=arguments.length<=0||void 0===arguments[0]?!0:arguments[0];this.options.addTargetClasses!==!1&&l(this.target,this.getClass("enabled")),l(this.element,this.getClass("enabled")),this.enabled=!0,this.scrollParent!==document&&this.scrollParent.addEventListener("scroll",this.position),t&&this.position()}},{key:"disable",value:function(){h(this.target,this.getClass("enabled")),h(this.element,this.getClass("enabled")),this.enabled=!1,"undefined"!=typeof this.scrollParent&&this.scrollParent.removeEventListener("scroll",this.position)}},{key:"destroy",value:function(){var t=this;this.disable(),B.forEach(function(e,o){return e===t?void B.splice(o,1):void 0})}},{key:"updateAttachClasses",value:function(t,e){var o=this;t=t||this.attachment,e=e||this.targetAttachment;var i=["left","top","bottom","right","middle","center"];"undefined"!=typeof this._addAttachClasses&&this._addAttachClasses.length&&this._addAttachClasses.splice(0,this._addAttachClasses.length),"undefined"==typeof this._addAttachClasses&&(this._addAttachClasses=[]);var n=this._addAttachClasses;t.top&&n.push(this.getClass("element-attached")+"-"+t.top),t.left&&n.push(this.getClass("element-attached")+"-"+t.left),e.top&&n.push(this.getClass("target-attached")+"-"+e.top),e.left&&n.push(this.getClass("target-attached")+"-"+e.left);var r=[];i.forEach(function(t){r.push(o.getClass("element-attached")+"-"+t),r.push(o.getClass("target-attached")+"-"+t)}),T(function(){"undefined"!=typeof o._addAttachClasses&&(c(o.element,o._addAttachClasses,r),o.options.addTargetClasses!==!1&&c(o.target,o._addAttachClasses,r),delete o._addAttachClasses)})}},{key:"position",value:function(){var t=this,e=arguments.length<=0||void 0===arguments[0]?!0:arguments[0];if(this.enabled){this.clearCache();var o=Y(this.targetAttachment,this.attachment);this.updateAttachClasses(this.attachment,o);var i=this.cache("element-bounds",function(){return r(t.element)}),n=i.width,f=i.height;if(0===n&&0===f&&"undefined"!=typeof this.lastSize){var h=this.lastSize;n=h.width,f=h.height}else this.lastSize={width:n,height:f};var l=this.cache("target-bounds",function(){return t.getTargetBounds()}),d=l,u=y(H(this.attachment),{width:n,height:f}),p=y(H(o),d),c=y(this.offset,{width:n,height:f}),g=y(this.targetOffset,d);u=v(u,c),p=v(p,g);for(var m=l.left+p.left-u.left,b=l.top+p.top-u.top,w=0;wwindow.innerWidth&&(A=this.cache("scrollbar-size",a),x.viewport.bottom-=A.height),document.body.scrollHeight>window.innerHeight&&(A=this.cache("scrollbar-size",a),x.viewport.right-=A.width),(-1===["","static"].indexOf(document.body.style.position)||-1===["","static"].indexOf(document.body.parentElement.style.position))&&(x.page.bottom=document.body.scrollHeight-b-f,x.page.right=document.body.scrollWidth-m-n),"undefined"!=typeof this.options.optimizations&&this.options.optimizations.moveElement!==!1&&"undefined"==typeof this.targetModifier&&!function(){var e=t.cache("target-offsetparent",function(){return s(t.target)}),o=t.cache("target-offsetparent-bounds",function(){return r(e)}),i=getComputedStyle(e),n=o,a={};if(["Top","Left","Bottom","Right"].forEach(function(t){a[t.toLowerCase()]=parseFloat(i["border"+t+"Width"])}),o.right=document.body.scrollWidth-o.left-n.width+a.right,o.bottom=document.body.scrollHeight-o.top-n.height+a.bottom,x.page.top>=o.top+a.top&&x.page.bottom>=o.bottom&&x.page.left>=o.left+a.left&&x.page.right>=o.right){var f=e.scrollTop,h=e.scrollLeft;x.offset={top:x.page.top-o.top+f-a.top,left:x.page.left-o.left+h-a.left}}}(),this.move(x),this.history.unshift(x),this.history.length>3&&this.history.pop(),e&&S(),!0}}},{key:"move",value:function(t){var e=this;if("undefined"!=typeof this.element.parentNode){var o={};for(var i in t){o[i]={};for(var n in t[i]){for(var r=!1,a=0;a=0&&(b=parseFloat(b),y=parseFloat(y)),b!==y&&(v=!0,m[n]=y)}v&&T(function(){f(e.element.style,m)})}}}]),t}();N.modules=[],C.position=_;var R=f(N,C),M=function(){function t(t,e){var o=[],i=!0,n=!1,r=void 0;try{for(var s,a=t[Symbol.iterator]();!(i=(s=a.next()).done)&&(o.push(s.value),!e||o.length!==e);i=!0);}catch(f){n=!0,r=f}finally{try{!i&&a["return"]&&a["return"]()}finally{if(n)throw r}}return o}return function(e,o){if(Array.isArray(e))return e;if(Symbol.iterator in Object(e))return t(e,o);throw new TypeError("Invalid attempt to destructure non-iterable instance")}}(),P=C.Utils,r=P.getBounds,f=P.extend,c=P.updateClasses,T=P.defer,U=["left","top","right","bottom"];C.modules.push({position:function(t){var e=this,o=t.top,i=t.left,n=t.targetAttachment;if(!this.options.constraints)return!0;var s=this.cache("element-bounds",function(){return r(e.element)}),a=s.height,h=s.width;if(0===h&&0===a&&"undefined"!=typeof this.lastSize){var l=this.lastSize;h=l.width,a=l.height}var d=this.cache("target-bounds",function(){return e.getTargetBounds()}),u=d.height,p=d.width,g=[this.getClass("pinned"),this.getClass("out-of-bounds")];this.options.constraints.forEach(function(t){var e=t.outOfBoundsClass,o=t.pinnedClass;e&&g.push(e),o&&g.push(o)}),g.forEach(function(t){["left","top","right","bottom"].forEach(function(e){g.push(t+"-"+e)})});var m=[],v=f({},n),y=f({},this.attachment);return this.options.constraints.forEach(function(t){var r=t.to,s=t.attachment,f=t.pin;"undefined"==typeof s&&(s="");var l=void 0,d=void 0;if(s.indexOf(" ")>=0){var c=s.split(" "),g=M(c,2);d=g[0],l=g[1]}else l=d=s;var w=b(e,r);("target"===d||"both"===d)&&(ow[3]&&"bottom"===v.top&&(o-=u,v.top="top")),"together"===d&&(ow[3]&&"bottom"===v.top&&("top"===y.top?(o-=u,v.top="top",o-=a,y.top="bottom"):"bottom"===y.top&&(o-=u,v.top="top",o+=a,y.top="top")),"middle"===v.top&&(o+a>w[3]&&"top"===y.top?(o-=a,y.top="bottom"):ow[2]&&"right"===v.left&&(i-=p,v.left="left")),"together"===l&&(iw[2]&&"right"===v.left?"left"===y.left?(i-=p,v.left="left",i-=h,y.left="right"):"right"===y.left&&(i-=p,v.left="left",i+=h,y.left="left"):"center"===v.left&&(i+h>w[2]&&"left"===y.left?(i-=h,y.left="right"):iw[3]&&"top"===y.top&&(o-=a,y.top="bottom")),("element"===l||"both"===l)&&(iw[2]&&("left"===y.left?(i-=h,y.left="right"):"center"===y.left&&(i-=h/2,y.left="right"))),"string"==typeof f?f=f.split(",").map(function(t){return t.trim()}):f===!0&&(f=["top","left","right","bottom"]),f=f||[];var C=[],O=[];o=0?(o=w[1],C.push("top")):O.push("top")),o+a>w[3]&&(f.indexOf("bottom")>=0?(o=w[3]-a,C.push("bottom")):O.push("bottom")),i=0?(i=w[0],C.push("left")):O.push("left")),i+h>w[2]&&(f.indexOf("right")>=0?(i=w[2]-h,C.push("right")):O.push("right")),C.length&&!function(){var t=void 0;t="undefined"!=typeof e.options.pinnedClass?e.options.pinnedClass:e.getClass("pinned"),m.push(t),C.forEach(function(e){m.push(t+"-"+e)})}(),O.length&&!function(){var t=void 0;t="undefined"!=typeof e.options.outOfBoundsClass?e.options.outOfBoundsClass:e.getClass("out-of-bounds"),m.push(t),O.forEach(function(e){m.push(t+"-"+e)})}(),(C.indexOf("left")>=0||C.indexOf("right")>=0)&&(y.left=v.left=!1),(C.indexOf("top")>=0||C.indexOf("bottom")>=0)&&(y.top=v.top=!1),(v.top!==n.top||v.left!==n.left||y.top!==e.attachment.top||y.left!==e.attachment.left)&&e.updateAttachClasses(y,v)}),T(function(){e.options.addTargetClasses!==!1&&c(e.target,m,g),c(e.element,m,g)}),{top:o,left:i}}});var P=C.Utils,r=P.getBounds,c=P.updateClasses,T=P.defer;C.modules.push({position:function(t){var e=this,o=t.top,i=t.left,n=this.cache("element-bounds",function(){return r(e.element)}),s=n.height,a=n.width,f=this.getTargetBounds(),h=o+s,l=i+a,d=[];o<=f.bottom&&h>=f.top&&["left","right"].forEach(function(t){var e=f[t];(e===i||e===l)&&d.push(t)}),i<=f.right&&l>=f.left&&["top","bottom"].forEach(function(t){var e=f[t];(e===o||e===h)&&d.push(t)});var u=[],p=[],g=["left","top","right","bottom"];return u.push(this.getClass("abutted")),g.forEach(function(t){u.push(e.getClass("abutted")+"-"+t)}),d.length&&p.push(this.getClass("abutted")),d.forEach(function(t){p.push(e.getClass("abutted")+"-"+t)}),T(function(){e.options.addTargetClasses!==!1&&c(e.target,p,u),c(e.element,p,u)}),!0}});var M=function(){function t(t,e){var o=[],i=!0,n=!1,r=void 0;try{for(var s,a=t[Symbol.iterator]();!(i=(s=a.next()).done)&&(o.push(s.value),!e||o.length!==e);i=!0);}catch(f){n=!0,r=f}finally{try{!i&&a["return"]&&a["return"]()}finally{if(n)throw r}}return o}return function(e,o){if(Array.isArray(e))return e;if(Symbol.iterator in Object(e))return t(e,o);throw new TypeError("Invalid attempt to destructure non-iterable instance")}}();return C.modules.push({position:function(t){var e=t.top,o=t.left;if(this.options.shift){var i=this.options.shift;"function"==typeof this.options.shift&&(i=this.options.shift.call(this,{top:e,left:o}));var n=void 0,r=void 0;if("string"==typeof i){i=i.split(" "),i[1]=i[1]||i[0];var s=i,a=M(s,2);n=a[0],r=a[1],n=parseFloat(n,10),r=parseFloat(r,10)}else n=i.top,r=i.left;return e+=n,o+=r,{top:e,left:o}}}}),R});
          \ No newline at end of file
          +!function(t,e){"function"==typeof define&&define.amd?define(e):"object"==typeof exports?module.exports=e(require,exports,module):t.Tether=e()}(this,function(t,e,o){"use strict";function n(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}function i(t){var e=getComputedStyle(t)||{},o=e.position,n=[];if("fixed"===o)return[t];for(var i=t;(i=i.parentNode)&&i&&1===i.nodeType;){var r=void 0;try{r=getComputedStyle(i)}catch(s){}if("undefined"==typeof r||null===r)return n.push(i),n;var a=r,f=a.overflow,h=a.overflowX,l=a.overflowY;/(auto|scroll)/.test(f+l+h)&&("absolute"!==o||["relative","absolute","fixed"].indexOf(r.position)>=0)&&n.push(i)}return n.push(document.body),n}function r(t){var e=void 0;t===document?(e=document,t=document.documentElement):e=t.ownerDocument;var o=e.documentElement,n={},i=t.getBoundingClientRect();for(var r in i)n[r]=i[r];var s=T(e);return n.top-=s.top,n.left-=s.left,"undefined"==typeof n.width&&(n.width=document.body.scrollWidth-n.left-n.right),"undefined"==typeof n.height&&(n.height=document.body.scrollHeight-n.top-n.bottom),n.top=n.top-o.clientTop,n.left=n.left-o.clientLeft,n.right=e.body.clientWidth-n.width-n.left,n.bottom=e.body.clientHeight-n.height-n.top,n}function s(t){return t.offsetParent||document.documentElement}function a(){var t=document.createElement("div");t.style.width="100%",t.style.height="200px";var e=document.createElement("div");f(e.style,{position:"absolute",top:0,left:0,pointerEvents:"none",visibility:"hidden",width:"200px",height:"150px",overflow:"hidden"}),e.appendChild(t),document.body.appendChild(e);var o=t.offsetWidth;e.style.overflow="scroll";var n=t.offsetWidth;o===n&&(n=e.clientWidth),document.body.removeChild(e);var i=o-n;return{width:i,height:i}}function f(){var t=arguments.length<=0||void 0===arguments[0]?{}:arguments[0],e=[];return Array.prototype.push.apply(e,arguments),e.slice(1).forEach(function(e){if(e)for(var o in e)({}).hasOwnProperty.call(e,o)&&(t[o]=e[o])}),t}function h(t,e){if("undefined"!=typeof t.classList)e.split(" ").forEach(function(e){e.trim()&&t.classList.remove(e)});else{var o=new RegExp("(^| )"+e.split(" ").join("|")+"( |$)","gi"),n=u(t).replace(o," ");p(t,n)}}function l(t,e){if("undefined"!=typeof t.classList)e.split(" ").forEach(function(e){e.trim()&&t.classList.add(e)});else{h(t,e);var o=u(t)+(" "+e);p(t,o)}}function d(t,e){if("undefined"!=typeof t.classList)return t.classList.contains(e);var o=u(t);return new RegExp("(^| )"+e+"( |$)","gi").test(o)}function u(t){return t.className instanceof SVGAnimatedString?t.className.baseVal:t.className}function p(t,e){t.setAttribute("class",e)}function c(t,e,o){o.forEach(function(o){-1===e.indexOf(o)&&d(t,o)&&h(t,o)}),e.forEach(function(e){d(t,e)||l(t,e)})}function n(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}function g(t,e){if("function"!=typeof e&&null!==e)throw new TypeError("Super expression must either be null or a function, not "+typeof e);t.prototype=Object.create(e&&e.prototype,{constructor:{value:t,enumerable:!1,writable:!0,configurable:!0}}),e&&(Object.setPrototypeOf?Object.setPrototypeOf(t,e):t.__proto__=e)}function m(t,e){var o=arguments.length<=2||void 0===arguments[2]?1:arguments[2];return t+o>=e&&e>=t-o}function v(){return"undefined"!=typeof performance&&"undefined"!=typeof performance.now?performance.now():+new Date}function y(){for(var t={top:0,left:0},e=arguments.length,o=Array(e),n=0;e>n;n++)o[n]=arguments[n];return o.forEach(function(e){var o=e.top,n=e.left;"string"==typeof o&&(o=parseFloat(o,10)),"string"==typeof n&&(n=parseFloat(n,10)),t.top+=o,t.left+=n}),t}function b(t,e){return"string"==typeof t.left&&-1!==t.left.indexOf("%")&&(t.left=parseFloat(t.left,10)/100*e.width),"string"==typeof t.top&&-1!==t.top.indexOf("%")&&(t.top=parseFloat(t.top,10)/100*e.height),t}function w(t,e){return"scrollParent"===e?e=t.scrollParent:"window"===e&&(e=[pageXOffset,pageYOffset,innerWidth+pageXOffset,innerHeight+pageYOffset]),e===document&&(e=e.documentElement),"undefined"!=typeof e.nodeType&&!function(){var t=r(e),o=t,n=getComputedStyle(e);e=[o.left,o.top,t.width+o.left,t.height+o.top],D.forEach(function(t,o){t=t[0].toUpperCase()+t.substr(1),"Top"===t||"Left"===t?e[o]+=parseFloat(n["border"+t+"Width"]):e[o]-=parseFloat(n["border"+t+"Width"])})}(),e}var C=function(){function t(t,e){for(var o=0;o1?o-1:0),i=1;o>i;i++)n[i-1]=arguments[i];for(;e16?(e=Math.min(e-16,250),void(o=setTimeout(i,250))):void("undefined"!=typeof t&&v()-t<10||("undefined"!=typeof o&&(clearTimeout(o),o=null),t=v(),j(),e=v()-t))};"undefined"!=typeof window&&"undefined"!=typeof window.addEventListener&&["resize","scroll","touchmove"].forEach(function(t){window.addEventListener(t,n)})}();var L={center:"center",left:"right",right:"left"},Y={middle:"middle",top:"bottom",bottom:"top"},F={top:0,left:0,middle:"50%",center:"50%",bottom:"100%",right:"100%"},H=function(t,e){var o=t.left,n=t.top;return"auto"===o&&(o=L[e.left]),"auto"===n&&(n=Y[e.top]),{left:o,top:n}},X=function(t){var e=t.left,o=t.top;return"undefined"!=typeof F[t.left]&&(e=F[t.left]),"undefined"!=typeof F[t.top]&&(o=F[t.top]),{left:e,top:o}},N=function(t){var e=t.split(" "),o=_(e,2),n=o[0],i=o[1];return{top:n,left:i}},R=N,U=function(t){function e(t){var o=this;n(this,e),M(Object.getPrototypeOf(e.prototype),"constructor",this).call(this),this.position=this.position.bind(this),z.push(this),this.history=[],this.setOptions(t,!1),O.modules.forEach(function(t){"undefined"!=typeof t.initialize&&t.initialize.call(o)}),this.position()}return g(e,t),C(e,[{key:"getClass",value:function(){var t=arguments.length<=0||void 0===arguments[0]?"":arguments[0],e=this.options.classes;return"undefined"!=typeof e&&e[t]?this.options.classes[t]:this.options.classPrefix?this.options.classPrefix+"-"+t:t}},{key:"setOptions",value:function(t){var e=this,o=arguments.length<=1||void 0===arguments[1]?!0:arguments[1],n={offset:"0 0",targetOffset:"0 0",targetAttachment:"auto auto",classPrefix:"tether"};this.options=f(n,t);var r=this.options,s=r.element,a=r.target,h=r.targetModifier;if(this.element=s,this.target=a,this.targetModifier=h,"viewport"===this.target?(this.target=document.body,this.targetModifier="visible"):"scroll-handle"===this.target&&(this.target=document.body,this.targetModifier="scroll-handle"),["element","target"].forEach(function(t){if("undefined"==typeof e[t])throw new Error("Tether Error: Both element and target must be defined");"undefined"!=typeof e[t].jquery?e[t]=e[t][0]:"string"==typeof e[t]&&(e[t]=document.querySelector(e[t]))}),l(this.element,this.getClass("element")),this.options.addTargetClasses!==!1&&l(this.target,this.getClass("target")),!this.options.attachment)throw new Error("Tether Error: You must provide an attachment");this.targetAttachment=R(this.options.targetAttachment),this.attachment=R(this.options.attachment),this.offset=N(this.options.offset),this.targetOffset=N(this.options.targetOffset),"undefined"!=typeof this.scrollParent&&this.disable(),"scroll-handle"===this.targetModifier?this.scrollParents=[this.target]:this.scrollParents=i(this.target),this.options.enabled!==!1&&this.enable(o)}},{key:"getTargetBounds",value:function(){if("undefined"==typeof this.targetModifier)return r(this.target);if("visible"===this.targetModifier){if(this.target===document.body)return{top:pageYOffset,left:pageXOffset,height:innerHeight,width:innerWidth};var t=r(this.target),e={height:t.height,width:t.width,top:t.top,left:t.left};return e.height=Math.min(e.height,t.height-(pageYOffset-t.top)),e.height=Math.min(e.height,t.height-(t.top+t.height-(pageYOffset+innerHeight))),e.height=Math.min(innerHeight,e.height),e.height-=2,e.width=Math.min(e.width,t.width-(pageXOffset-t.left)),e.width=Math.min(e.width,t.width-(t.left+t.width-(pageXOffset+innerWidth))),e.width=Math.min(innerWidth,e.width),e.width-=2,e.topo.clientWidth||[n.overflow,n.overflowX].indexOf("scroll")>=0||this.target!==document.body,s=0;i&&(s=15);var a=t.height-parseFloat(n.borderTopWidth)-parseFloat(n.borderBottomWidth)-s,e={width:15,height:.975*a*(a/o.scrollHeight),left:t.left+t.width-parseFloat(n.borderLeftWidth)-15},f=0;408>a&&this.target===document.body&&(f=-11e-5*Math.pow(a,2)-.00727*a+22.58),this.target!==document.body&&(e.height=Math.max(e.height,24));var h=this.target.scrollTop/(o.scrollHeight-a);return e.top=h*(a-e.height-f)+t.top+parseFloat(n.borderTopWidth),this.target===document.body&&(e.height=Math.max(e.height,24)),e}}},{key:"clearCache",value:function(){this._cache={}}},{key:"cache",value:function(t,e){return"undefined"==typeof this._cache&&(this._cache={}),"undefined"==typeof this._cache[t]&&(this._cache[t]=e.call(this)),this._cache[t]}},{key:"enable",value:function(){var t=this,e=arguments.length<=0||void 0===arguments[0]?!0:arguments[0];this.options.addTargetClasses!==!1&&l(this.target,this.getClass("enabled")),l(this.element,this.getClass("enabled")),this.enabled=!0,this.scrollParents.forEach(function(e){e!==document&&e.addEventListener("scroll",t.position)}),e&&this.position()}},{key:"disable",value:function(){var t=this;h(this.target,this.getClass("enabled")),h(this.element,this.getClass("enabled")),this.enabled=!1,"undefined"!=typeof this.scrollParents&&this.scrollParents.forEach(function(e){e.removeEventListener("scroll",t.position)})}},{key:"destroy",value:function(){var t=this;this.disable(),z.forEach(function(e,o){return e===t?void z.splice(o,1):void 0})}},{key:"updateAttachClasses",value:function(t,e){var o=this;t=t||this.attachment,e=e||this.targetAttachment;var n=["left","top","bottom","right","middle","center"];"undefined"!=typeof this._addAttachClasses&&this._addAttachClasses.length&&this._addAttachClasses.splice(0,this._addAttachClasses.length),"undefined"==typeof this._addAttachClasses&&(this._addAttachClasses=[]);var i=this._addAttachClasses;t.top&&i.push(this.getClass("element-attached")+"-"+t.top),t.left&&i.push(this.getClass("element-attached")+"-"+t.left),e.top&&i.push(this.getClass("target-attached")+"-"+e.top),e.left&&i.push(this.getClass("target-attached")+"-"+e.left);var r=[];n.forEach(function(t){r.push(o.getClass("element-attached")+"-"+t),r.push(o.getClass("target-attached")+"-"+t)}),S(function(){"undefined"!=typeof o._addAttachClasses&&(c(o.element,o._addAttachClasses,r),o.options.addTargetClasses!==!1&&c(o.target,o._addAttachClasses,r),delete o._addAttachClasses)})}},{key:"position",value:function(){var t=this,e=arguments.length<=0||void 0===arguments[0]?!0:arguments[0];if(this.enabled){this.clearCache();var o=H(this.targetAttachment,this.attachment);this.updateAttachClasses(this.attachment,o);var n=this.cache("element-bounds",function(){return r(t.element)}),i=n.width,f=n.height;if(0===i&&0===f&&"undefined"!=typeof this.lastSize){var h=this.lastSize;i=h.width,f=h.height}else this.lastSize={width:i,height:f};var l=this.cache("target-bounds",function(){return t.getTargetBounds()}),d=l,u=b(X(this.attachment),{width:i,height:f}),p=b(X(o),d),c=b(this.offset,{width:i,height:f}),g=b(this.targetOffset,d);u=y(u,c),p=y(p,g);for(var m=l.left+p.left-u.left,v=l.top+p.top-u.top,w=0;wwindow.innerWidth&&(T=this.cache("scrollbar-size",a),x.viewport.bottom-=T.height),document.body.scrollHeight>window.innerHeight&&(T=this.cache("scrollbar-size",a),x.viewport.right-=T.width),(-1===["","static"].indexOf(document.body.style.position)||-1===["","static"].indexOf(document.body.parentElement.style.position))&&(x.page.bottom=document.body.scrollHeight-v-f,x.page.right=document.body.scrollWidth-m-i),"undefined"!=typeof this.options.optimizations&&this.options.optimizations.moveElement!==!1&&"undefined"==typeof this.targetModifier&&!function(){var e=t.cache("target-offsetparent",function(){return s(t.target)}),o=t.cache("target-offsetparent-bounds",function(){return r(e)}),n=getComputedStyle(e),i=o,a={};if(["Top","Left","Bottom","Right"].forEach(function(t){a[t.toLowerCase()]=parseFloat(n["border"+t+"Width"])}),o.right=document.body.scrollWidth-o.left-i.width+a.right,o.bottom=document.body.scrollHeight-o.top-i.height+a.bottom,x.page.top>=o.top+a.top&&x.page.bottom>=o.bottom&&x.page.left>=o.left+a.left&&x.page.right>=o.right){var f=e.scrollTop,h=e.scrollLeft;x.offset={top:x.page.top-o.top+f-a.top,left:x.page.left-o.left+h-a.left}}}(),this.move(x),this.history.unshift(x),this.history.length>3&&this.history.pop(),e&&P(),!0}}},{key:"move",value:function(t){var e=this;if("undefined"!=typeof this.element.parentNode){var o={};for(var n in t){o[n]={};for(var i in t[n]){for(var r=!1,a=0;a=0){var c=s.split(" "),g=_(c,2);d=g[0],l=g[1]}else l=d=s;var b=w(e,r);("target"===d||"both"===d)&&(ob[3]&&"bottom"===v.top&&(o-=u,v.top="top")),"together"===d&&("top"===v.top&&("bottom"===y.top&&ob[3]&&o-(a-u)>=b[1]&&(o-=a-u,v.top="bottom",y.top="bottom")),"bottom"===v.top&&("top"===y.top&&o+a>b[3]?(o-=u,v.top="top",o-=a,y.top="bottom"):"bottom"===y.top&&ob[3]&&"top"===y.top?(o-=a,y.top="bottom"):ob[2]&&"right"===v.left&&(n-=p,v.left="left")),"together"===l&&(nb[2]&&"right"===v.left?"left"===y.left?(n-=p,v.left="left",n-=h,y.left="right"):"right"===y.left&&(n-=p,v.left="left",n+=h,y.left="left"):"center"===v.left&&(n+h>b[2]&&"left"===y.left?(n-=h,y.left="right"):nb[3]&&"top"===y.top&&(o-=a,y.top="bottom")),("element"===l||"both"===l)&&(nb[2]&&("left"===y.left?(n-=h,y.left="right"):"center"===y.left&&(n-=h/2,y.left="right"))),"string"==typeof f?f=f.split(",").map(function(t){return t.trim()}):f===!0&&(f=["top","left","right","bottom"]),f=f||[];var C=[],O=[];o=0?(o=b[1],C.push("top")):O.push("top")),o+a>b[3]&&(f.indexOf("bottom")>=0?(o=b[3]-a,C.push("bottom")):O.push("bottom")),n=0?(n=b[0],C.push("left")):O.push("left")),n+h>b[2]&&(f.indexOf("right")>=0?(n=b[2]-h,C.push("right")):O.push("right")),C.length&&!function(){var t=void 0;t="undefined"!=typeof e.options.pinnedClass?e.options.pinnedClass:e.getClass("pinned"),m.push(t),C.forEach(function(e){m.push(t+"-"+e)})}(),O.length&&!function(){var t=void 0;t="undefined"!=typeof e.options.outOfBoundsClass?e.options.outOfBoundsClass:e.getClass("out-of-bounds"),m.push(t),O.forEach(function(e){m.push(t+"-"+e)})}(),(C.indexOf("left")>=0||C.indexOf("right")>=0)&&(y.left=v.left=!1),(C.indexOf("top")>=0||C.indexOf("bottom")>=0)&&(y.top=v.top=!1),(v.top!==i.top||v.left!==i.left||y.top!==e.attachment.top||y.left!==e.attachment.left)&&(e.updateAttachClasses(y,v),e.trigger("update",{attachment:y,targetAttachment:v}))}),S(function(){e.options.addTargetClasses!==!1&&c(e.target,m,g),c(e.element,m,g)}),{top:o,left:n}}});var k=O.Utils,r=k.getBounds,c=k.updateClasses,S=k.defer;O.modules.push({position:function(t){var e=this,o=t.top,n=t.left,i=this.cache("element-bounds",function(){return r(e.element)}),s=i.height,a=i.width,f=this.getTargetBounds(),h=o+s,l=n+a,d=[];o<=f.bottom&&h>=f.top&&["left","right"].forEach(function(t){var e=f[t];(e===n||e===l)&&d.push(t)}),n<=f.right&&l>=f.left&&["top","bottom"].forEach(function(t){var e=f[t];(e===o||e===h)&&d.push(t)});var u=[],p=[],g=["left","top","right","bottom"];return u.push(this.getClass("abutted")),g.forEach(function(t){u.push(e.getClass("abutted")+"-"+t)}),d.length&&p.push(this.getClass("abutted")),d.forEach(function(t){p.push(e.getClass("abutted")+"-"+t)}),S(function(){e.options.addTargetClasses!==!1&&c(e.target,p,u),c(e.element,p,u)}),!0}});var _=function(){function t(t,e){var o=[],n=!0,i=!1,r=void 0;try{for(var s,a=t[Symbol.iterator]();!(n=(s=a.next()).done)&&(o.push(s.value),!e||o.length!==e);n=!0);}catch(f){i=!0,r=f}finally{try{!n&&a["return"]&&a["return"]()}finally{if(i)throw r}}return o}return function(e,o){if(Array.isArray(e))return e;if(Symbol.iterator in Object(e))return t(e,o);throw new TypeError("Invalid attempt to destructure non-iterable instance")}}();return O.modules.push({position:function(t){var e=t.top,o=t.left;if(this.options.shift){var n=this.options.shift;"function"==typeof this.options.shift&&(n=this.options.shift.call(this,{top:e,left:o}));var i=void 0,r=void 0;if("string"==typeof n){n=n.split(" "),n[1]=n[1]||n[0];var s=n,a=_(s,2);i=a[0],r=a[1],i=parseFloat(i,10),r=parseFloat(r,10)}else i=n.top,r=n.left;return e+=i,o+=r,{top:e,left:o}}}}),q});
          \ No newline at end of file
          diff --git a/docs/intro.html b/docs/intro.html
          index 58845af50..251868c14 100644
          --- a/docs/intro.html
          +++ b/docs/intro.html
          @@ -1,4 +1,4 @@
          -Tether
          -

          +

          diff --git a/examples/list_of_examples/index.html b/examples/list_of_examples/index.html index 758d90695..90d1b3b57 100644 --- a/examples/list_of_examples/index.html +++ b/examples/list_of_examples/index.html @@ -1,4 +1,4 @@ -Tether -

          Examples

          +

          Examples

          It's our goal to create a wide variety of example of how Tether can be used. Here's what we have so far, please send a PR with any examples you might create.

          diff --git a/examples/out-of-bounds/index.html b/examples/out-of-bounds/index.html index 29301e72b..c2a8c6d03 100644 --- a/examples/out-of-bounds/index.html +++ b/examples/out-of-bounds/index.html @@ -20,7 +20,7 @@ diff --git a/examples/projects_using_tether/index.html b/examples/projects_using_tether/index.html index b9caef001..e31e8553e 100644 --- a/examples/projects_using_tether/index.html +++ b/examples/projects_using_tether/index.html @@ -1,4 +1,4 @@ -Tether -

          Projects Using Tether

          +

          Projects Using Tether

          Here at HubSpot we have built a bunch of libraries on top of Tether, both because we wanted Tether-performance, and because we saw opportunities to improve on what was available in the client-side ecosystem.

          diff --git a/index.html b/index.html index 554afa64c..674252425 100644 --- a/index.html +++ b/index.html @@ -1,4 +1,4 @@ -Tether -

          Tether

          A client-side library to make absolutely positioned elements attach to elements in the page efficiently.

          1.2.0

          +

          Tether

          A client-side library to make absolutely positioned elements attach to elements in the page efficiently.

          1.3.0

          diff --git a/overview/repositioning/index.html b/overview/repositioning/index.html index adb9b2505..f3be63046 100644 --- a/overview/repositioning/index.html +++ b/overview/repositioning/index.html @@ -1,4 +1,4 @@ -Tether -

          Repositioning

          +

          Repositioning

          Tethers will be automatically repositioned when the page is resized, and when any element containing the Tether is scrolled. If the element moves for some other reason (e.g. with JavaScript), Tether won't know to reposition the element.

          Manually Repositioning

          diff --git a/overview/why_we_dont_support_ie_8/index.html b/overview/why_we_dont_support_ie_8/index.html index 4fef63cf2..4253154aa 100644 --- a/overview/why_we_dont_support_ie_8/index.html +++ b/overview/why_we_dont_support_ie_8/index.html @@ -1,4 +1,4 @@ -Tether -

          Why we don't support IE 8

          +

          Why we don't support IE 8

          We've been living in 2007 for a while now, pretending that new browser features don't exist because they aren't in IE8. You might not even know about some of these features, or think they are only enabled by jQuery or underscore, simply because it hasn't diff --git a/overview/why_you_should_use_tether/index.html b/overview/why_you_should_use_tether/index.html index 5a3f7cf93..faa96a403 100644 --- a/overview/why_you_should_use_tether/index.html +++ b/overview/why_you_should_use_tether/index.html @@ -1,4 +1,4 @@ -Tether

          -

          Why You Should Use Tether

          +

          Why You Should Use Tether

          Virtually every app includes some sort of overlay attached to an element on the page. Things like tooltips, dropdowns, hover-activated info boxes, etc.

          From 996ce979854a7bb53573069391921a6f8c2305f5 Mon Sep 17 00:00:00 2001 From: Trevor Burnham Date: Tue, 19 Apr 2016 18:11:59 -0400 Subject: [PATCH 11/40] Rebuild docs for 1.2.3 Trying to pin down what went wrong with the 1.3.0 release... --- dist/js/tether.js | 21 +++++---------------- dist/js/tether.min.js | 2 +- examples/out-of-bounds/index.html | 5 +---- index.html | 2 +- 4 files changed, 8 insertions(+), 22 deletions(-) diff --git a/dist/js/tether.js b/dist/js/tether.js index ca253480d..7abc32098 100644 --- a/dist/js/tether.js +++ b/dist/js/tether.js @@ -1,4 +1,4 @@ -/*! tether 1.3.0 */ +/*! tether 1.2.3 */ (function(root, factory) { if (typeof define === 'function' && define.amd) { @@ -33,7 +33,7 @@ function getScrollParents(el) { } var parent = el; - while ((parent = parent.parentNode) && parent && parent.nodeType === 1) { + while (parent = parent.parentNode) { var style = undefined; try { style = getComputedStyle(parent); @@ -384,12 +384,8 @@ var _slicedToArray = (function () { function sliceIterator(arr, i) { var _arr = 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; }; })(); -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); } } }; - function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError('Cannot call a class as a function'); } } -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; } - if (typeof TetherBase === 'undefined') { throw new Error('You must include the utils.js file before tether.js'); } @@ -579,15 +575,12 @@ var parseOffset = function parseOffset(value) { }; var parseAttachment = parseOffset; -var TetherClass = (function (_Evented) { - _inherits(TetherClass, _Evented); - +var TetherClass = (function () { function TetherClass(options) { var _this = this; _classCallCheck(this, TetherClass); - _get(Object.getPrototypeOf(TetherClass.prototype), 'constructor', this).call(this); this.position = this.position.bind(this); tethers.push(this); @@ -1194,7 +1187,7 @@ var TetherClass = (function (_Evented) { if (!moved) { var offsetParentIsBody = true; var currentNode = this.element.parentNode; - while (currentNode && currentNode.nodeType === 1 && currentNode.tagName !== 'BODY') { + while (currentNode && currentNode.tagName !== 'BODY') { if (getComputedStyle(currentNode).position !== 'static') { offsetParentIsBody = false; break; @@ -1231,7 +1224,7 @@ var TetherClass = (function (_Evented) { }]); return TetherClass; -})(Evented); +})(); TetherClass.modules = []; @@ -1599,10 +1592,6 @@ TetherBase.modules.push({ if (tAttachment.top !== targetAttachment.top || tAttachment.left !== targetAttachment.left || eAttachment.top !== _this.attachment.top || eAttachment.left !== _this.attachment.left) { _this.updateAttachClasses(eAttachment, tAttachment); - _this.trigger('update', { - attachment: eAttachment, - targetAttachment: tAttachment - }); } }); diff --git a/dist/js/tether.min.js b/dist/js/tether.min.js index 3f8952ab1..a74d501ba 100644 --- a/dist/js/tether.min.js +++ b/dist/js/tether.min.js @@ -1 +1 @@ -!function(t,e){"function"==typeof define&&define.amd?define(e):"object"==typeof exports?module.exports=e(require,exports,module):t.Tether=e()}(this,function(t,e,o){"use strict";function n(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}function i(t){var e=getComputedStyle(t)||{},o=e.position,n=[];if("fixed"===o)return[t];for(var i=t;(i=i.parentNode)&&i&&1===i.nodeType;){var r=void 0;try{r=getComputedStyle(i)}catch(s){}if("undefined"==typeof r||null===r)return n.push(i),n;var a=r,f=a.overflow,h=a.overflowX,l=a.overflowY;/(auto|scroll)/.test(f+l+h)&&("absolute"!==o||["relative","absolute","fixed"].indexOf(r.position)>=0)&&n.push(i)}return n.push(document.body),n}function r(t){var e=void 0;t===document?(e=document,t=document.documentElement):e=t.ownerDocument;var o=e.documentElement,n={},i=t.getBoundingClientRect();for(var r in i)n[r]=i[r];var s=T(e);return n.top-=s.top,n.left-=s.left,"undefined"==typeof n.width&&(n.width=document.body.scrollWidth-n.left-n.right),"undefined"==typeof n.height&&(n.height=document.body.scrollHeight-n.top-n.bottom),n.top=n.top-o.clientTop,n.left=n.left-o.clientLeft,n.right=e.body.clientWidth-n.width-n.left,n.bottom=e.body.clientHeight-n.height-n.top,n}function s(t){return t.offsetParent||document.documentElement}function a(){var t=document.createElement("div");t.style.width="100%",t.style.height="200px";var e=document.createElement("div");f(e.style,{position:"absolute",top:0,left:0,pointerEvents:"none",visibility:"hidden",width:"200px",height:"150px",overflow:"hidden"}),e.appendChild(t),document.body.appendChild(e);var o=t.offsetWidth;e.style.overflow="scroll";var n=t.offsetWidth;o===n&&(n=e.clientWidth),document.body.removeChild(e);var i=o-n;return{width:i,height:i}}function f(){var t=arguments.length<=0||void 0===arguments[0]?{}:arguments[0],e=[];return Array.prototype.push.apply(e,arguments),e.slice(1).forEach(function(e){if(e)for(var o in e)({}).hasOwnProperty.call(e,o)&&(t[o]=e[o])}),t}function h(t,e){if("undefined"!=typeof t.classList)e.split(" ").forEach(function(e){e.trim()&&t.classList.remove(e)});else{var o=new RegExp("(^| )"+e.split(" ").join("|")+"( |$)","gi"),n=u(t).replace(o," ");p(t,n)}}function l(t,e){if("undefined"!=typeof t.classList)e.split(" ").forEach(function(e){e.trim()&&t.classList.add(e)});else{h(t,e);var o=u(t)+(" "+e);p(t,o)}}function d(t,e){if("undefined"!=typeof t.classList)return t.classList.contains(e);var o=u(t);return new RegExp("(^| )"+e+"( |$)","gi").test(o)}function u(t){return t.className instanceof SVGAnimatedString?t.className.baseVal:t.className}function p(t,e){t.setAttribute("class",e)}function c(t,e,o){o.forEach(function(o){-1===e.indexOf(o)&&d(t,o)&&h(t,o)}),e.forEach(function(e){d(t,e)||l(t,e)})}function n(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}function g(t,e){if("function"!=typeof e&&null!==e)throw new TypeError("Super expression must either be null or a function, not "+typeof e);t.prototype=Object.create(e&&e.prototype,{constructor:{value:t,enumerable:!1,writable:!0,configurable:!0}}),e&&(Object.setPrototypeOf?Object.setPrototypeOf(t,e):t.__proto__=e)}function m(t,e){var o=arguments.length<=2||void 0===arguments[2]?1:arguments[2];return t+o>=e&&e>=t-o}function v(){return"undefined"!=typeof performance&&"undefined"!=typeof performance.now?performance.now():+new Date}function y(){for(var t={top:0,left:0},e=arguments.length,o=Array(e),n=0;e>n;n++)o[n]=arguments[n];return o.forEach(function(e){var o=e.top,n=e.left;"string"==typeof o&&(o=parseFloat(o,10)),"string"==typeof n&&(n=parseFloat(n,10)),t.top+=o,t.left+=n}),t}function b(t,e){return"string"==typeof t.left&&-1!==t.left.indexOf("%")&&(t.left=parseFloat(t.left,10)/100*e.width),"string"==typeof t.top&&-1!==t.top.indexOf("%")&&(t.top=parseFloat(t.top,10)/100*e.height),t}function w(t,e){return"scrollParent"===e?e=t.scrollParent:"window"===e&&(e=[pageXOffset,pageYOffset,innerWidth+pageXOffset,innerHeight+pageYOffset]),e===document&&(e=e.documentElement),"undefined"!=typeof e.nodeType&&!function(){var t=r(e),o=t,n=getComputedStyle(e);e=[o.left,o.top,t.width+o.left,t.height+o.top],D.forEach(function(t,o){t=t[0].toUpperCase()+t.substr(1),"Top"===t||"Left"===t?e[o]+=parseFloat(n["border"+t+"Width"]):e[o]-=parseFloat(n["border"+t+"Width"])})}(),e}var C=function(){function t(t,e){for(var o=0;o1?o-1:0),i=1;o>i;i++)n[i-1]=arguments[i];for(;e16?(e=Math.min(e-16,250),void(o=setTimeout(i,250))):void("undefined"!=typeof t&&v()-t<10||("undefined"!=typeof o&&(clearTimeout(o),o=null),t=v(),j(),e=v()-t))};"undefined"!=typeof window&&"undefined"!=typeof window.addEventListener&&["resize","scroll","touchmove"].forEach(function(t){window.addEventListener(t,n)})}();var L={center:"center",left:"right",right:"left"},Y={middle:"middle",top:"bottom",bottom:"top"},F={top:0,left:0,middle:"50%",center:"50%",bottom:"100%",right:"100%"},H=function(t,e){var o=t.left,n=t.top;return"auto"===o&&(o=L[e.left]),"auto"===n&&(n=Y[e.top]),{left:o,top:n}},X=function(t){var e=t.left,o=t.top;return"undefined"!=typeof F[t.left]&&(e=F[t.left]),"undefined"!=typeof F[t.top]&&(o=F[t.top]),{left:e,top:o}},N=function(t){var e=t.split(" "),o=_(e,2),n=o[0],i=o[1];return{top:n,left:i}},R=N,U=function(t){function e(t){var o=this;n(this,e),M(Object.getPrototypeOf(e.prototype),"constructor",this).call(this),this.position=this.position.bind(this),z.push(this),this.history=[],this.setOptions(t,!1),O.modules.forEach(function(t){"undefined"!=typeof t.initialize&&t.initialize.call(o)}),this.position()}return g(e,t),C(e,[{key:"getClass",value:function(){var t=arguments.length<=0||void 0===arguments[0]?"":arguments[0],e=this.options.classes;return"undefined"!=typeof e&&e[t]?this.options.classes[t]:this.options.classPrefix?this.options.classPrefix+"-"+t:t}},{key:"setOptions",value:function(t){var e=this,o=arguments.length<=1||void 0===arguments[1]?!0:arguments[1],n={offset:"0 0",targetOffset:"0 0",targetAttachment:"auto auto",classPrefix:"tether"};this.options=f(n,t);var r=this.options,s=r.element,a=r.target,h=r.targetModifier;if(this.element=s,this.target=a,this.targetModifier=h,"viewport"===this.target?(this.target=document.body,this.targetModifier="visible"):"scroll-handle"===this.target&&(this.target=document.body,this.targetModifier="scroll-handle"),["element","target"].forEach(function(t){if("undefined"==typeof e[t])throw new Error("Tether Error: Both element and target must be defined");"undefined"!=typeof e[t].jquery?e[t]=e[t][0]:"string"==typeof e[t]&&(e[t]=document.querySelector(e[t]))}),l(this.element,this.getClass("element")),this.options.addTargetClasses!==!1&&l(this.target,this.getClass("target")),!this.options.attachment)throw new Error("Tether Error: You must provide an attachment");this.targetAttachment=R(this.options.targetAttachment),this.attachment=R(this.options.attachment),this.offset=N(this.options.offset),this.targetOffset=N(this.options.targetOffset),"undefined"!=typeof this.scrollParent&&this.disable(),"scroll-handle"===this.targetModifier?this.scrollParents=[this.target]:this.scrollParents=i(this.target),this.options.enabled!==!1&&this.enable(o)}},{key:"getTargetBounds",value:function(){if("undefined"==typeof this.targetModifier)return r(this.target);if("visible"===this.targetModifier){if(this.target===document.body)return{top:pageYOffset,left:pageXOffset,height:innerHeight,width:innerWidth};var t=r(this.target),e={height:t.height,width:t.width,top:t.top,left:t.left};return e.height=Math.min(e.height,t.height-(pageYOffset-t.top)),e.height=Math.min(e.height,t.height-(t.top+t.height-(pageYOffset+innerHeight))),e.height=Math.min(innerHeight,e.height),e.height-=2,e.width=Math.min(e.width,t.width-(pageXOffset-t.left)),e.width=Math.min(e.width,t.width-(t.left+t.width-(pageXOffset+innerWidth))),e.width=Math.min(innerWidth,e.width),e.width-=2,e.topo.clientWidth||[n.overflow,n.overflowX].indexOf("scroll")>=0||this.target!==document.body,s=0;i&&(s=15);var a=t.height-parseFloat(n.borderTopWidth)-parseFloat(n.borderBottomWidth)-s,e={width:15,height:.975*a*(a/o.scrollHeight),left:t.left+t.width-parseFloat(n.borderLeftWidth)-15},f=0;408>a&&this.target===document.body&&(f=-11e-5*Math.pow(a,2)-.00727*a+22.58),this.target!==document.body&&(e.height=Math.max(e.height,24));var h=this.target.scrollTop/(o.scrollHeight-a);return e.top=h*(a-e.height-f)+t.top+parseFloat(n.borderTopWidth),this.target===document.body&&(e.height=Math.max(e.height,24)),e}}},{key:"clearCache",value:function(){this._cache={}}},{key:"cache",value:function(t,e){return"undefined"==typeof this._cache&&(this._cache={}),"undefined"==typeof this._cache[t]&&(this._cache[t]=e.call(this)),this._cache[t]}},{key:"enable",value:function(){var t=this,e=arguments.length<=0||void 0===arguments[0]?!0:arguments[0];this.options.addTargetClasses!==!1&&l(this.target,this.getClass("enabled")),l(this.element,this.getClass("enabled")),this.enabled=!0,this.scrollParents.forEach(function(e){e!==document&&e.addEventListener("scroll",t.position)}),e&&this.position()}},{key:"disable",value:function(){var t=this;h(this.target,this.getClass("enabled")),h(this.element,this.getClass("enabled")),this.enabled=!1,"undefined"!=typeof this.scrollParents&&this.scrollParents.forEach(function(e){e.removeEventListener("scroll",t.position)})}},{key:"destroy",value:function(){var t=this;this.disable(),z.forEach(function(e,o){return e===t?void z.splice(o,1):void 0})}},{key:"updateAttachClasses",value:function(t,e){var o=this;t=t||this.attachment,e=e||this.targetAttachment;var n=["left","top","bottom","right","middle","center"];"undefined"!=typeof this._addAttachClasses&&this._addAttachClasses.length&&this._addAttachClasses.splice(0,this._addAttachClasses.length),"undefined"==typeof this._addAttachClasses&&(this._addAttachClasses=[]);var i=this._addAttachClasses;t.top&&i.push(this.getClass("element-attached")+"-"+t.top),t.left&&i.push(this.getClass("element-attached")+"-"+t.left),e.top&&i.push(this.getClass("target-attached")+"-"+e.top),e.left&&i.push(this.getClass("target-attached")+"-"+e.left);var r=[];n.forEach(function(t){r.push(o.getClass("element-attached")+"-"+t),r.push(o.getClass("target-attached")+"-"+t)}),S(function(){"undefined"!=typeof o._addAttachClasses&&(c(o.element,o._addAttachClasses,r),o.options.addTargetClasses!==!1&&c(o.target,o._addAttachClasses,r),delete o._addAttachClasses)})}},{key:"position",value:function(){var t=this,e=arguments.length<=0||void 0===arguments[0]?!0:arguments[0];if(this.enabled){this.clearCache();var o=H(this.targetAttachment,this.attachment);this.updateAttachClasses(this.attachment,o);var n=this.cache("element-bounds",function(){return r(t.element)}),i=n.width,f=n.height;if(0===i&&0===f&&"undefined"!=typeof this.lastSize){var h=this.lastSize;i=h.width,f=h.height}else this.lastSize={width:i,height:f};var l=this.cache("target-bounds",function(){return t.getTargetBounds()}),d=l,u=b(X(this.attachment),{width:i,height:f}),p=b(X(o),d),c=b(this.offset,{width:i,height:f}),g=b(this.targetOffset,d);u=y(u,c),p=y(p,g);for(var m=l.left+p.left-u.left,v=l.top+p.top-u.top,w=0;wwindow.innerWidth&&(T=this.cache("scrollbar-size",a),x.viewport.bottom-=T.height),document.body.scrollHeight>window.innerHeight&&(T=this.cache("scrollbar-size",a),x.viewport.right-=T.width),(-1===["","static"].indexOf(document.body.style.position)||-1===["","static"].indexOf(document.body.parentElement.style.position))&&(x.page.bottom=document.body.scrollHeight-v-f,x.page.right=document.body.scrollWidth-m-i),"undefined"!=typeof this.options.optimizations&&this.options.optimizations.moveElement!==!1&&"undefined"==typeof this.targetModifier&&!function(){var e=t.cache("target-offsetparent",function(){return s(t.target)}),o=t.cache("target-offsetparent-bounds",function(){return r(e)}),n=getComputedStyle(e),i=o,a={};if(["Top","Left","Bottom","Right"].forEach(function(t){a[t.toLowerCase()]=parseFloat(n["border"+t+"Width"])}),o.right=document.body.scrollWidth-o.left-i.width+a.right,o.bottom=document.body.scrollHeight-o.top-i.height+a.bottom,x.page.top>=o.top+a.top&&x.page.bottom>=o.bottom&&x.page.left>=o.left+a.left&&x.page.right>=o.right){var f=e.scrollTop,h=e.scrollLeft;x.offset={top:x.page.top-o.top+f-a.top,left:x.page.left-o.left+h-a.left}}}(),this.move(x),this.history.unshift(x),this.history.length>3&&this.history.pop(),e&&P(),!0}}},{key:"move",value:function(t){var e=this;if("undefined"!=typeof this.element.parentNode){var o={};for(var n in t){o[n]={};for(var i in t[n]){for(var r=!1,a=0;a=0){var c=s.split(" "),g=_(c,2);d=g[0],l=g[1]}else l=d=s;var b=w(e,r);("target"===d||"both"===d)&&(ob[3]&&"bottom"===v.top&&(o-=u,v.top="top")),"together"===d&&("top"===v.top&&("bottom"===y.top&&ob[3]&&o-(a-u)>=b[1]&&(o-=a-u,v.top="bottom",y.top="bottom")),"bottom"===v.top&&("top"===y.top&&o+a>b[3]?(o-=u,v.top="top",o-=a,y.top="bottom"):"bottom"===y.top&&ob[3]&&"top"===y.top?(o-=a,y.top="bottom"):ob[2]&&"right"===v.left&&(n-=p,v.left="left")),"together"===l&&(nb[2]&&"right"===v.left?"left"===y.left?(n-=p,v.left="left",n-=h,y.left="right"):"right"===y.left&&(n-=p,v.left="left",n+=h,y.left="left"):"center"===v.left&&(n+h>b[2]&&"left"===y.left?(n-=h,y.left="right"):nb[3]&&"top"===y.top&&(o-=a,y.top="bottom")),("element"===l||"both"===l)&&(nb[2]&&("left"===y.left?(n-=h,y.left="right"):"center"===y.left&&(n-=h/2,y.left="right"))),"string"==typeof f?f=f.split(",").map(function(t){return t.trim()}):f===!0&&(f=["top","left","right","bottom"]),f=f||[];var C=[],O=[];o=0?(o=b[1],C.push("top")):O.push("top")),o+a>b[3]&&(f.indexOf("bottom")>=0?(o=b[3]-a,C.push("bottom")):O.push("bottom")),n=0?(n=b[0],C.push("left")):O.push("left")),n+h>b[2]&&(f.indexOf("right")>=0?(n=b[2]-h,C.push("right")):O.push("right")),C.length&&!function(){var t=void 0;t="undefined"!=typeof e.options.pinnedClass?e.options.pinnedClass:e.getClass("pinned"),m.push(t),C.forEach(function(e){m.push(t+"-"+e)})}(),O.length&&!function(){var t=void 0;t="undefined"!=typeof e.options.outOfBoundsClass?e.options.outOfBoundsClass:e.getClass("out-of-bounds"),m.push(t),O.forEach(function(e){m.push(t+"-"+e)})}(),(C.indexOf("left")>=0||C.indexOf("right")>=0)&&(y.left=v.left=!1),(C.indexOf("top")>=0||C.indexOf("bottom")>=0)&&(y.top=v.top=!1),(v.top!==i.top||v.left!==i.left||y.top!==e.attachment.top||y.left!==e.attachment.left)&&(e.updateAttachClasses(y,v),e.trigger("update",{attachment:y,targetAttachment:v}))}),S(function(){e.options.addTargetClasses!==!1&&c(e.target,m,g),c(e.element,m,g)}),{top:o,left:n}}});var k=O.Utils,r=k.getBounds,c=k.updateClasses,S=k.defer;O.modules.push({position:function(t){var e=this,o=t.top,n=t.left,i=this.cache("element-bounds",function(){return r(e.element)}),s=i.height,a=i.width,f=this.getTargetBounds(),h=o+s,l=n+a,d=[];o<=f.bottom&&h>=f.top&&["left","right"].forEach(function(t){var e=f[t];(e===n||e===l)&&d.push(t)}),n<=f.right&&l>=f.left&&["top","bottom"].forEach(function(t){var e=f[t];(e===o||e===h)&&d.push(t)});var u=[],p=[],g=["left","top","right","bottom"];return u.push(this.getClass("abutted")),g.forEach(function(t){u.push(e.getClass("abutted")+"-"+t)}),d.length&&p.push(this.getClass("abutted")),d.forEach(function(t){p.push(e.getClass("abutted")+"-"+t)}),S(function(){e.options.addTargetClasses!==!1&&c(e.target,p,u),c(e.element,p,u)}),!0}});var _=function(){function t(t,e){var o=[],n=!0,i=!1,r=void 0;try{for(var s,a=t[Symbol.iterator]();!(n=(s=a.next()).done)&&(o.push(s.value),!e||o.length!==e);n=!0);}catch(f){i=!0,r=f}finally{try{!n&&a["return"]&&a["return"]()}finally{if(i)throw r}}return o}return function(e,o){if(Array.isArray(e))return e;if(Symbol.iterator in Object(e))return t(e,o);throw new TypeError("Invalid attempt to destructure non-iterable instance")}}();return O.modules.push({position:function(t){var e=t.top,o=t.left;if(this.options.shift){var n=this.options.shift;"function"==typeof this.options.shift&&(n=this.options.shift.call(this,{top:e,left:o}));var i=void 0,r=void 0;if("string"==typeof n){n=n.split(" "),n[1]=n[1]||n[0];var s=n,a=_(s,2);i=a[0],r=a[1],i=parseFloat(i,10),r=parseFloat(r,10)}else i=n.top,r=n.left;return e+=i,o+=r,{top:e,left:o}}}}),q}); \ No newline at end of file +!function(t,e){"function"==typeof define&&define.amd?define(e):"object"==typeof exports?module.exports=e(require,exports,module):t.Tether=e()}(this,function(t,e,o){"use strict";function i(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}function n(t){var e=getComputedStyle(t)||{},o=e.position,i=[];if("fixed"===o)return[t];for(var n=t;n=n.parentNode;){var r=void 0;try{r=getComputedStyle(n)}catch(s){}if("undefined"==typeof r||null===r)return i.push(n),i;var a=r,f=a.overflow,h=a.overflowX,l=a.overflowY;/(auto|scroll)/.test(f+l+h)&&("absolute"!==o||["relative","absolute","fixed"].indexOf(r.position)>=0)&&i.push(n)}return i.push(document.body),i}function r(t){var e=void 0;t===document?(e=document,t=document.documentElement):e=t.ownerDocument;var o=e.documentElement,i={},n=t.getBoundingClientRect();for(var r in n)i[r]=n[r];var s=x(e);return i.top-=s.top,i.left-=s.left,"undefined"==typeof i.width&&(i.width=document.body.scrollWidth-i.left-i.right),"undefined"==typeof i.height&&(i.height=document.body.scrollHeight-i.top-i.bottom),i.top=i.top-o.clientTop,i.left=i.left-o.clientLeft,i.right=e.body.clientWidth-i.width-i.left,i.bottom=e.body.clientHeight-i.height-i.top,i}function s(t){return t.offsetParent||document.documentElement}function a(){var t=document.createElement("div");t.style.width="100%",t.style.height="200px";var e=document.createElement("div");f(e.style,{position:"absolute",top:0,left:0,pointerEvents:"none",visibility:"hidden",width:"200px",height:"150px",overflow:"hidden"}),e.appendChild(t),document.body.appendChild(e);var o=t.offsetWidth;e.style.overflow="scroll";var i=t.offsetWidth;o===i&&(i=e.clientWidth),document.body.removeChild(e);var n=o-i;return{width:n,height:n}}function f(){var t=arguments.length<=0||void 0===arguments[0]?{}:arguments[0],e=[];return Array.prototype.push.apply(e,arguments),e.slice(1).forEach(function(e){if(e)for(var o in e)({}).hasOwnProperty.call(e,o)&&(t[o]=e[o])}),t}function h(t,e){if("undefined"!=typeof t.classList)e.split(" ").forEach(function(e){e.trim()&&t.classList.remove(e)});else{var o=new RegExp("(^| )"+e.split(" ").join("|")+"( |$)","gi"),i=u(t).replace(o," ");p(t,i)}}function l(t,e){if("undefined"!=typeof t.classList)e.split(" ").forEach(function(e){e.trim()&&t.classList.add(e)});else{h(t,e);var o=u(t)+(" "+e);p(t,o)}}function d(t,e){if("undefined"!=typeof t.classList)return t.classList.contains(e);var o=u(t);return new RegExp("(^| )"+e+"( |$)","gi").test(o)}function u(t){return t.className instanceof SVGAnimatedString?t.className.baseVal:t.className}function p(t,e){t.setAttribute("class",e)}function c(t,e,o){o.forEach(function(o){-1===e.indexOf(o)&&d(t,o)&&h(t,o)}),e.forEach(function(e){d(t,e)||l(t,e)})}function i(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}function g(t,e){var o=arguments.length<=2||void 0===arguments[2]?1:arguments[2];return t+o>=e&&e>=t-o}function m(){return"undefined"!=typeof performance&&"undefined"!=typeof performance.now?performance.now():+new Date}function v(){for(var t={top:0,left:0},e=arguments.length,o=Array(e),i=0;e>i;i++)o[i]=arguments[i];return o.forEach(function(e){var o=e.top,i=e.left;"string"==typeof o&&(o=parseFloat(o,10)),"string"==typeof i&&(i=parseFloat(i,10)),t.top+=o,t.left+=i}),t}function y(t,e){return"string"==typeof t.left&&-1!==t.left.indexOf("%")&&(t.left=parseFloat(t.left,10)/100*e.width),"string"==typeof t.top&&-1!==t.top.indexOf("%")&&(t.top=parseFloat(t.top,10)/100*e.height),t}function b(t,e){return"scrollParent"===e?e=t.scrollParent:"window"===e&&(e=[pageXOffset,pageYOffset,innerWidth+pageXOffset,innerHeight+pageYOffset]),e===document&&(e=e.documentElement),"undefined"!=typeof e.nodeType&&!function(){var t=r(e),o=t,i=getComputedStyle(e);e=[o.left,o.top,t.width+o.left,t.height+o.top],U.forEach(function(t,o){t=t[0].toUpperCase()+t.substr(1),"Top"===t||"Left"===t?e[o]+=parseFloat(i["border"+t+"Width"]):e[o]-=parseFloat(i["border"+t+"Width"])})}(),e}var w=function(){function t(t,e){for(var o=0;o1?o-1:0),n=1;o>n;n++)i[n-1]=arguments[n];for(;e16?(e=Math.min(e-16,250),void(o=setTimeout(n,250))):void("undefined"!=typeof t&&m()-t<10||("undefined"!=typeof o&&(clearTimeout(o),o=null),t=m(),_(),e=m()-t))};"undefined"!=typeof window&&"undefined"!=typeof window.addEventListener&&["resize","scroll","touchmove"].forEach(function(t){window.addEventListener(t,i)})}();var z={center:"center",left:"right",right:"left"},L={middle:"middle",top:"bottom",bottom:"top"},Y={top:0,left:0,middle:"50%",center:"50%",bottom:"100%",right:"100%"},H=function(t,e){var o=t.left,i=t.top;return"auto"===o&&(o=z[e.left]),"auto"===i&&(i=L[e.top]),{left:o,top:i}},F=function(t){var e=t.left,o=t.top;return"undefined"!=typeof Y[t.left]&&(e=Y[t.left]),"undefined"!=typeof Y[t.top]&&(o=Y[t.top]),{left:e,top:o}},X=function(t){var e=t.split(" "),o=M(e,2),i=o[0],n=o[1];return{top:i,left:n}},j=X,N=function(){function t(e){var o=this;i(this,t),this.position=this.position.bind(this),B.push(this),this.history=[],this.setOptions(e,!1),C.modules.forEach(function(t){"undefined"!=typeof t.initialize&&t.initialize.call(o)}),this.position()}return w(t,[{key:"getClass",value:function(){var t=arguments.length<=0||void 0===arguments[0]?"":arguments[0],e=this.options.classes;return"undefined"!=typeof e&&e[t]?this.options.classes[t]:this.options.classPrefix?this.options.classPrefix+"-"+t:t}},{key:"setOptions",value:function(t){var e=this,o=arguments.length<=1||void 0===arguments[1]?!0:arguments[1],i={offset:"0 0",targetOffset:"0 0",targetAttachment:"auto auto",classPrefix:"tether"};this.options=f(i,t);var r=this.options,s=r.element,a=r.target,h=r.targetModifier;if(this.element=s,this.target=a,this.targetModifier=h,"viewport"===this.target?(this.target=document.body,this.targetModifier="visible"):"scroll-handle"===this.target&&(this.target=document.body,this.targetModifier="scroll-handle"),["element","target"].forEach(function(t){if("undefined"==typeof e[t])throw new Error("Tether Error: Both element and target must be defined");"undefined"!=typeof e[t].jquery?e[t]=e[t][0]:"string"==typeof e[t]&&(e[t]=document.querySelector(e[t]))}),l(this.element,this.getClass("element")),this.options.addTargetClasses!==!1&&l(this.target,this.getClass("target")),!this.options.attachment)throw new Error("Tether Error: You must provide an attachment");this.targetAttachment=j(this.options.targetAttachment),this.attachment=j(this.options.attachment),this.offset=X(this.options.offset),this.targetOffset=X(this.options.targetOffset),"undefined"!=typeof this.scrollParent&&this.disable(),"scroll-handle"===this.targetModifier?this.scrollParents=[this.target]:this.scrollParents=n(this.target),this.options.enabled!==!1&&this.enable(o)}},{key:"getTargetBounds",value:function(){if("undefined"==typeof this.targetModifier)return r(this.target);if("visible"===this.targetModifier){if(this.target===document.body)return{top:pageYOffset,left:pageXOffset,height:innerHeight,width:innerWidth};var t=r(this.target),e={height:t.height,width:t.width,top:t.top,left:t.left};return e.height=Math.min(e.height,t.height-(pageYOffset-t.top)),e.height=Math.min(e.height,t.height-(t.top+t.height-(pageYOffset+innerHeight))),e.height=Math.min(innerHeight,e.height),e.height-=2,e.width=Math.min(e.width,t.width-(pageXOffset-t.left)),e.width=Math.min(e.width,t.width-(t.left+t.width-(pageXOffset+innerWidth))),e.width=Math.min(innerWidth,e.width),e.width-=2,e.topo.clientWidth||[i.overflow,i.overflowX].indexOf("scroll")>=0||this.target!==document.body,s=0;n&&(s=15);var a=t.height-parseFloat(i.borderTopWidth)-parseFloat(i.borderBottomWidth)-s,e={width:15,height:.975*a*(a/o.scrollHeight),left:t.left+t.width-parseFloat(i.borderLeftWidth)-15},f=0;408>a&&this.target===document.body&&(f=-11e-5*Math.pow(a,2)-.00727*a+22.58),this.target!==document.body&&(e.height=Math.max(e.height,24));var h=this.target.scrollTop/(o.scrollHeight-a);return e.top=h*(a-e.height-f)+t.top+parseFloat(i.borderTopWidth),this.target===document.body&&(e.height=Math.max(e.height,24)),e}}},{key:"clearCache",value:function(){this._cache={}}},{key:"cache",value:function(t,e){return"undefined"==typeof this._cache&&(this._cache={}),"undefined"==typeof this._cache[t]&&(this._cache[t]=e.call(this)),this._cache[t]}},{key:"enable",value:function(){var t=this,e=arguments.length<=0||void 0===arguments[0]?!0:arguments[0];this.options.addTargetClasses!==!1&&l(this.target,this.getClass("enabled")),l(this.element,this.getClass("enabled")),this.enabled=!0,this.scrollParents.forEach(function(e){e!==document&&e.addEventListener("scroll",t.position)}),e&&this.position()}},{key:"disable",value:function(){var t=this;h(this.target,this.getClass("enabled")),h(this.element,this.getClass("enabled")),this.enabled=!1,"undefined"!=typeof this.scrollParents&&this.scrollParents.forEach(function(e){e.removeEventListener("scroll",t.position)})}},{key:"destroy",value:function(){var t=this;this.disable(),B.forEach(function(e,o){return e===t?void B.splice(o,1):void 0})}},{key:"updateAttachClasses",value:function(t,e){var o=this;t=t||this.attachment,e=e||this.targetAttachment;var i=["left","top","bottom","right","middle","center"];"undefined"!=typeof this._addAttachClasses&&this._addAttachClasses.length&&this._addAttachClasses.splice(0,this._addAttachClasses.length),"undefined"==typeof this._addAttachClasses&&(this._addAttachClasses=[]);var n=this._addAttachClasses;t.top&&n.push(this.getClass("element-attached")+"-"+t.top),t.left&&n.push(this.getClass("element-attached")+"-"+t.left),e.top&&n.push(this.getClass("target-attached")+"-"+e.top),e.left&&n.push(this.getClass("target-attached")+"-"+e.left);var r=[];i.forEach(function(t){r.push(o.getClass("element-attached")+"-"+t),r.push(o.getClass("target-attached")+"-"+t)}),T(function(){"undefined"!=typeof o._addAttachClasses&&(c(o.element,o._addAttachClasses,r),o.options.addTargetClasses!==!1&&c(o.target,o._addAttachClasses,r),delete o._addAttachClasses)})}},{key:"position",value:function(){var t=this,e=arguments.length<=0||void 0===arguments[0]?!0:arguments[0];if(this.enabled){this.clearCache();var o=H(this.targetAttachment,this.attachment);this.updateAttachClasses(this.attachment,o);var i=this.cache("element-bounds",function(){return r(t.element)}),n=i.width,f=i.height;if(0===n&&0===f&&"undefined"!=typeof this.lastSize){var h=this.lastSize;n=h.width,f=h.height}else this.lastSize={width:n,height:f};var l=this.cache("target-bounds",function(){return t.getTargetBounds()}),d=l,u=y(F(this.attachment),{width:n,height:f}),p=y(F(o),d),c=y(this.offset,{width:n,height:f}),g=y(this.targetOffset,d);u=v(u,c),p=v(p,g);for(var m=l.left+p.left-u.left,b=l.top+p.top-u.top,w=0;wwindow.innerWidth&&(A=this.cache("scrollbar-size",a),x.viewport.bottom-=A.height),document.body.scrollHeight>window.innerHeight&&(A=this.cache("scrollbar-size",a),x.viewport.right-=A.width),(-1===["","static"].indexOf(document.body.style.position)||-1===["","static"].indexOf(document.body.parentElement.style.position))&&(x.page.bottom=document.body.scrollHeight-b-f,x.page.right=document.body.scrollWidth-m-n),"undefined"!=typeof this.options.optimizations&&this.options.optimizations.moveElement!==!1&&"undefined"==typeof this.targetModifier&&!function(){var e=t.cache("target-offsetparent",function(){return s(t.target)}),o=t.cache("target-offsetparent-bounds",function(){return r(e)}),i=getComputedStyle(e),n=o,a={};if(["Top","Left","Bottom","Right"].forEach(function(t){a[t.toLowerCase()]=parseFloat(i["border"+t+"Width"])}),o.right=document.body.scrollWidth-o.left-n.width+a.right,o.bottom=document.body.scrollHeight-o.top-n.height+a.bottom,x.page.top>=o.top+a.top&&x.page.bottom>=o.bottom&&x.page.left>=o.left+a.left&&x.page.right>=o.right){var f=e.scrollTop,h=e.scrollLeft;x.offset={top:x.page.top-o.top+f-a.top,left:x.page.left-o.left+h-a.left}}}(),this.move(x),this.history.unshift(x),this.history.length>3&&this.history.pop(),e&&S(),!0}}},{key:"move",value:function(t){var e=this;if("undefined"!=typeof this.element.parentNode){var o={};for(var i in t){o[i]={};for(var n in t[i]){for(var r=!1,a=0;a=0){var c=s.split(" "),g=M(c,2);d=g[0],l=g[1]}else l=d=s;var w=b(e,r);("target"===d||"both"===d)&&(ow[3]&&"bottom"===v.top&&(o-=u,v.top="top")),"together"===d&&("top"===v.top&&("bottom"===y.top&&ow[3]&&o-(a-u)>=w[1]&&(o-=a-u,v.top="bottom",y.top="bottom")),"bottom"===v.top&&("top"===y.top&&o+a>w[3]?(o-=u,v.top="top",o-=a,y.top="bottom"):"bottom"===y.top&&ow[3]&&"top"===y.top?(o-=a,y.top="bottom"):ow[2]&&"right"===v.left&&(i-=p,v.left="left")),"together"===l&&(iw[2]&&"right"===v.left?"left"===y.left?(i-=p,v.left="left",i-=h,y.left="right"):"right"===y.left&&(i-=p,v.left="left",i+=h,y.left="left"):"center"===v.left&&(i+h>w[2]&&"left"===y.left?(i-=h,y.left="right"):iw[3]&&"top"===y.top&&(o-=a,y.top="bottom")),("element"===l||"both"===l)&&(iw[2]&&("left"===y.left?(i-=h,y.left="right"):"center"===y.left&&(i-=h/2,y.left="right"))),"string"==typeof f?f=f.split(",").map(function(t){return t.trim()}):f===!0&&(f=["top","left","right","bottom"]),f=f||[];var C=[],O=[];o=0?(o=w[1],C.push("top")):O.push("top")),o+a>w[3]&&(f.indexOf("bottom")>=0?(o=w[3]-a,C.push("bottom")):O.push("bottom")),i=0?(i=w[0],C.push("left")):O.push("left")),i+h>w[2]&&(f.indexOf("right")>=0?(i=w[2]-h,C.push("right")):O.push("right")),C.length&&!function(){var t=void 0;t="undefined"!=typeof e.options.pinnedClass?e.options.pinnedClass:e.getClass("pinned"),m.push(t),C.forEach(function(e){m.push(t+"-"+e)})}(),O.length&&!function(){var t=void 0;t="undefined"!=typeof e.options.outOfBoundsClass?e.options.outOfBoundsClass:e.getClass("out-of-bounds"),m.push(t),O.forEach(function(e){m.push(t+"-"+e)})}(),(C.indexOf("left")>=0||C.indexOf("right")>=0)&&(y.left=v.left=!1),(C.indexOf("top")>=0||C.indexOf("bottom")>=0)&&(y.top=v.top=!1),(v.top!==n.top||v.left!==n.left||y.top!==e.attachment.top||y.left!==e.attachment.left)&&e.updateAttachClasses(y,v)}),T(function(){e.options.addTargetClasses!==!1&&c(e.target,m,g),c(e.element,m,g)}),{top:o,left:i}}});var P=C.Utils,r=P.getBounds,c=P.updateClasses,T=P.defer;C.modules.push({position:function(t){var e=this,o=t.top,i=t.left,n=this.cache("element-bounds",function(){return r(e.element)}),s=n.height,a=n.width,f=this.getTargetBounds(),h=o+s,l=i+a,d=[];o<=f.bottom&&h>=f.top&&["left","right"].forEach(function(t){var e=f[t];(e===i||e===l)&&d.push(t)}),i<=f.right&&l>=f.left&&["top","bottom"].forEach(function(t){var e=f[t];(e===o||e===h)&&d.push(t)});var u=[],p=[],g=["left","top","right","bottom"];return u.push(this.getClass("abutted")),g.forEach(function(t){u.push(e.getClass("abutted")+"-"+t)}),d.length&&p.push(this.getClass("abutted")),d.forEach(function(t){p.push(e.getClass("abutted")+"-"+t)}),T(function(){e.options.addTargetClasses!==!1&&c(e.target,p,u),c(e.element,p,u)}),!0}});var M=function(){function t(t,e){var o=[],i=!0,n=!1,r=void 0;try{for(var s,a=t[Symbol.iterator]();!(i=(s=a.next()).done)&&(o.push(s.value),!e||o.length!==e);i=!0);}catch(f){n=!0,r=f}finally{try{!i&&a["return"]&&a["return"]()}finally{if(n)throw r}}return o}return function(e,o){if(Array.isArray(e))return e;if(Symbol.iterator in Object(e))return t(e,o);throw new TypeError("Invalid attempt to destructure non-iterable instance")}}();return C.modules.push({position:function(t){var e=t.top,o=t.left;if(this.options.shift){var i=this.options.shift;"function"==typeof this.options.shift&&(i=this.options.shift.call(this,{top:e,left:o}));var n=void 0,r=void 0;if("string"==typeof i){i=i.split(" "),i[1]=i[1]||i[0];var s=i,a=M(s,2);n=a[0],r=a[1],n=parseFloat(n,10),r=parseFloat(r,10)}else n=i.top,r=i.left;return e+=n,o+=r,{top:e,left:o}}}}),R}); \ No newline at end of file diff --git a/examples/out-of-bounds/index.html b/examples/out-of-bounds/index.html index c2a8c6d03..29301e72b 100644 --- a/examples/out-of-bounds/index.html +++ b/examples/out-of-bounds/index.html @@ -20,7 +20,7 @@ diff --git a/index.html b/index.html index 674252425..d2d3636e8 100644 --- a/index.html +++ b/index.html @@ -28,7 +28,7 @@
          -

          Tether

          A client-side library to make absolutely positioned elements attach to elements in the page efficiently.

          1.3.0

          +

          Tether

          A client-side library to make absolutely positioned elements attach to elements in the page efficiently.

          1.2.3

          From 6cfa83790e92339ac485cea0e2d79ee8d3ebaa10 Mon Sep 17 00:00:00 2001 From: Trevor Burnham Date: Tue, 19 Apr 2016 18:16:13 -0400 Subject: [PATCH 12/40] Rebuild docs for 1.2.2 Going backward in time to track down a bug... --- dist/js/tether.js | 109 +++++++++++++---------------- dist/js/tether.min.js | 2 +- examples/element-scroll/index.html | 2 +- index.html | 2 +- 4 files changed, 53 insertions(+), 62 deletions(-) diff --git a/dist/js/tether.js b/dist/js/tether.js index 7abc32098..a818dacc1 100644 --- a/dist/js/tether.js +++ b/dist/js/tether.js @@ -1,4 +1,4 @@ -/*! tether 1.2.3 */ +/*! tether 1.2.2 */ (function(root, factory) { if (typeof define === 'function' && define.amd) { @@ -21,15 +21,14 @@ if (typeof TetherBase === 'undefined') { TetherBase = { modules: [] }; } -function getScrollParents(el) { +function getScrollParent(el) { // In firefox if the el is inside an iframe with display: none; window.getComputedStyle() will return null; // https://bugzilla.mozilla.org/show_bug.cgi?id=548397 var computedStyle = getComputedStyle(el) || {}; var position = computedStyle.position; - var parents = []; if (position === 'fixed') { - return [el]; + return el; } var parent = el; @@ -40,8 +39,7 @@ function getScrollParents(el) { } catch (err) {} if (typeof style === 'undefined' || style === null) { - parents.push(parent); - return parents; + return parent; } var _style = style; @@ -51,13 +49,12 @@ function getScrollParents(el) { if (/(auto|scroll)/.test(overflow + overflowY + overflowX)) { if (position !== 'absolute' || ['relative', 'absolute', 'fixed'].indexOf(style.position) >= 0) { - parents.push(parent); + return parent; } } } - parents.push(document.body); - return parents; + return document.body; } var uniqueId = (function () { @@ -362,7 +359,7 @@ var Evented = (function () { })(); TetherBase.Utils = { - getScrollParents: getScrollParents, + getScrollParent: getScrollParent, getBounds: getBounds, getOffsetParent: getOffsetParent, extend: extend, @@ -391,7 +388,7 @@ if (typeof TetherBase === 'undefined') { } var _TetherBase$Utils = TetherBase.Utils; -var getScrollParents = _TetherBase$Utils.getScrollParents; +var getScrollParent = _TetherBase$Utils.getScrollParent; var getBounds = _TetherBase$Utils.getBounds; var getOffsetParent = _TetherBase$Utils.getOffsetParent; var extend = _TetherBase$Utils.extend; @@ -676,9 +673,9 @@ var TetherClass = (function () { } if (this.targetModifier === 'scroll-handle') { - this.scrollParents = [this.target]; + this.scrollParent = this.target; } else { - this.scrollParents = getScrollParents(this.target); + this.scrollParent = getScrollParent(this.target); } if (!(this.options.enabled === false)) { @@ -799,8 +796,6 @@ var TetherClass = (function () { }, { key: 'enable', value: function enable() { - var _this3 = this; - var pos = arguments.length <= 0 || arguments[0] === undefined ? true : arguments[0]; if (!(this.options.addTargetClasses === false)) { @@ -809,11 +804,9 @@ var TetherClass = (function () { addClass(this.element, this.getClass('enabled')); this.enabled = true; - this.scrollParents.forEach(function (parent) { - if (parent !== document) { - parent.addEventListener('scroll', _this3.position); - } - }); + if (this.scrollParent !== document) { + this.scrollParent.addEventListener('scroll', this.position); + } if (pos) { this.position(); @@ -822,27 +815,23 @@ var TetherClass = (function () { }, { key: 'disable', value: function disable() { - var _this4 = this; - removeClass(this.target, this.getClass('enabled')); removeClass(this.element, this.getClass('enabled')); this.enabled = false; - if (typeof this.scrollParents !== 'undefined') { - this.scrollParents.forEach(function (parent) { - parent.removeEventListener('scroll', _this4.position); - }); + if (typeof this.scrollParent !== 'undefined') { + this.scrollParent.removeEventListener('scroll', this.position); } } }, { key: 'destroy', value: function destroy() { - var _this5 = this; + var _this3 = this; this.disable(); tethers.forEach(function (tether, i) { - if (tether === _this5) { + if (tether === _this3) { tethers.splice(i, 1); return; } @@ -851,7 +840,7 @@ var TetherClass = (function () { }, { key: 'updateAttachClasses', value: function updateAttachClasses(elementAttach, targetAttach) { - var _this6 = this; + var _this4 = this; elementAttach = elementAttach || this.attachment; targetAttach = targetAttach || this.targetAttachment; @@ -884,27 +873,27 @@ var TetherClass = (function () { var all = []; sides.forEach(function (side) { - all.push(_this6.getClass('element-attached') + '-' + side); - all.push(_this6.getClass('target-attached') + '-' + side); + all.push(_this4.getClass('element-attached') + '-' + side); + all.push(_this4.getClass('target-attached') + '-' + side); }); defer(function () { - if (!(typeof _this6._addAttachClasses !== 'undefined')) { + if (!(typeof _this4._addAttachClasses !== 'undefined')) { return; } - updateClasses(_this6.element, _this6._addAttachClasses, all); - if (!(_this6.options.addTargetClasses === false)) { - updateClasses(_this6.target, _this6._addAttachClasses, all); + updateClasses(_this4.element, _this4._addAttachClasses, all); + if (!(_this4.options.addTargetClasses === false)) { + updateClasses(_this4.target, _this4._addAttachClasses, all); } - delete _this6._addAttachClasses; + delete _this4._addAttachClasses; }); } }, { key: 'position', value: function position() { - var _this7 = this; + var _this5 = this; var flushChanges = arguments.length <= 0 || arguments[0] === undefined ? true : arguments[0]; @@ -923,7 +912,7 @@ var TetherClass = (function () { this.updateAttachClasses(this.attachment, targetAttachment); var elementPos = this.cache('element-bounds', function () { - return getBounds(_this7.element); + return getBounds(_this5.element); }); var width = elementPos.width; @@ -941,7 +930,7 @@ var TetherClass = (function () { } var targetPos = this.cache('target-bounds', function () { - return _this7.getTargetBounds(); + return _this5.getTargetBounds(); }); var targetSize = targetPos; @@ -1025,10 +1014,10 @@ var TetherClass = (function () { if (typeof this.options.optimizations !== 'undefined' && this.options.optimizations.moveElement !== false && !(typeof this.targetModifier !== 'undefined')) { (function () { - var offsetParent = _this7.cache('target-offsetparent', function () { - return getOffsetParent(_this7.target); + var offsetParent = _this5.cache('target-offsetparent', function () { + return getOffsetParent(_this5.target); }); - var offsetPosition = _this7.cache('target-offsetparent-bounds', function () { + var offsetPosition = _this5.cache('target-offsetparent-bounds', function () { return getBounds(offsetParent); }); var offsetParentStyle = getComputedStyle(offsetParent); @@ -1081,7 +1070,7 @@ var TetherClass = (function () { }, { key: 'move', value: function move(pos) { - var _this8 = this; + var _this6 = this; if (!(typeof this.element.parentNode !== 'undefined')) { return; @@ -1112,8 +1101,8 @@ var TetherClass = (function () { var css = { top: '', left: '', right: '', bottom: '' }; var transcribe = function transcribe(_same, _pos) { - var hasOptimizations = typeof _this8.options.optimizations !== 'undefined'; - var gpu = hasOptimizations ? _this8.options.optimizations.gpu : null; + var hasOptimizations = typeof _this6.options.optimizations !== 'undefined'; + var gpu = hasOptimizations ? _this6.options.optimizations.gpu : null; if (gpu !== false) { var yPos = undefined, xPos = undefined; @@ -1165,14 +1154,14 @@ var TetherClass = (function () { } else if (typeof same.offset !== 'undefined' && same.offset.top && same.offset.left) { (function () { css.position = 'absolute'; - var offsetParent = _this8.cache('target-offsetparent', function () { - return getOffsetParent(_this8.target); + var offsetParent = _this6.cache('target-offsetparent', function () { + return getOffsetParent(_this6.target); }); - if (getOffsetParent(_this8.element) !== offsetParent) { + if (getOffsetParent(_this6.element) !== offsetParent) { defer(function () { - _this8.element.parentNode.removeChild(_this8.element); - offsetParent.appendChild(_this8.element); + _this6.element.parentNode.removeChild(_this6.element); + offsetParent.appendChild(_this6.element); }); } @@ -1217,7 +1206,7 @@ var TetherClass = (function () { if (write) { defer(function () { - extend(_this8.element.style, writeCSS); + extend(_this6.element.style, writeCSS); }); } } @@ -1375,32 +1364,34 @@ TetherBase.modules.push({ } if (changeAttachY === 'together') { - if (tAttachment.top === 'top') { - if (eAttachment.top === 'bottom' && top < bounds[1]) { + if (top < bounds[1] && tAttachment.top === 'top') { + if (eAttachment.top === 'bottom') { top += targetHeight; tAttachment.top = 'bottom'; top += height; eAttachment.top = 'top'; - } else if (eAttachment.top === 'top' && top + height > bounds[3] && top - (height - targetHeight) >= bounds[1]) { - top -= height - targetHeight; + } else if (eAttachment.top === 'top') { + top += targetHeight; tAttachment.top = 'bottom'; + top -= height; eAttachment.top = 'bottom'; } } - if (tAttachment.top === 'bottom') { - if (eAttachment.top === 'top' && top + height > bounds[3]) { + if (top + height > bounds[3] && tAttachment.top === 'bottom') { + if (eAttachment.top === 'top') { top -= targetHeight; tAttachment.top = 'top'; top -= height; eAttachment.top = 'bottom'; - } else if (eAttachment.top === 'bottom' && top < bounds[1] && top + (height * 2 - targetHeight) <= bounds[3]) { - top += height - targetHeight; + } else if (eAttachment.top === 'bottom') { + top -= targetHeight; tAttachment.top = 'top'; + top += height; eAttachment.top = 'top'; } } diff --git a/dist/js/tether.min.js b/dist/js/tether.min.js index a74d501ba..fae66f0cd 100644 --- a/dist/js/tether.min.js +++ b/dist/js/tether.min.js @@ -1 +1 @@ -!function(t,e){"function"==typeof define&&define.amd?define(e):"object"==typeof exports?module.exports=e(require,exports,module):t.Tether=e()}(this,function(t,e,o){"use strict";function i(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}function n(t){var e=getComputedStyle(t)||{},o=e.position,i=[];if("fixed"===o)return[t];for(var n=t;n=n.parentNode;){var r=void 0;try{r=getComputedStyle(n)}catch(s){}if("undefined"==typeof r||null===r)return i.push(n),i;var a=r,f=a.overflow,h=a.overflowX,l=a.overflowY;/(auto|scroll)/.test(f+l+h)&&("absolute"!==o||["relative","absolute","fixed"].indexOf(r.position)>=0)&&i.push(n)}return i.push(document.body),i}function r(t){var e=void 0;t===document?(e=document,t=document.documentElement):e=t.ownerDocument;var o=e.documentElement,i={},n=t.getBoundingClientRect();for(var r in n)i[r]=n[r];var s=x(e);return i.top-=s.top,i.left-=s.left,"undefined"==typeof i.width&&(i.width=document.body.scrollWidth-i.left-i.right),"undefined"==typeof i.height&&(i.height=document.body.scrollHeight-i.top-i.bottom),i.top=i.top-o.clientTop,i.left=i.left-o.clientLeft,i.right=e.body.clientWidth-i.width-i.left,i.bottom=e.body.clientHeight-i.height-i.top,i}function s(t){return t.offsetParent||document.documentElement}function a(){var t=document.createElement("div");t.style.width="100%",t.style.height="200px";var e=document.createElement("div");f(e.style,{position:"absolute",top:0,left:0,pointerEvents:"none",visibility:"hidden",width:"200px",height:"150px",overflow:"hidden"}),e.appendChild(t),document.body.appendChild(e);var o=t.offsetWidth;e.style.overflow="scroll";var i=t.offsetWidth;o===i&&(i=e.clientWidth),document.body.removeChild(e);var n=o-i;return{width:n,height:n}}function f(){var t=arguments.length<=0||void 0===arguments[0]?{}:arguments[0],e=[];return Array.prototype.push.apply(e,arguments),e.slice(1).forEach(function(e){if(e)for(var o in e)({}).hasOwnProperty.call(e,o)&&(t[o]=e[o])}),t}function h(t,e){if("undefined"!=typeof t.classList)e.split(" ").forEach(function(e){e.trim()&&t.classList.remove(e)});else{var o=new RegExp("(^| )"+e.split(" ").join("|")+"( |$)","gi"),i=u(t).replace(o," ");p(t,i)}}function l(t,e){if("undefined"!=typeof t.classList)e.split(" ").forEach(function(e){e.trim()&&t.classList.add(e)});else{h(t,e);var o=u(t)+(" "+e);p(t,o)}}function d(t,e){if("undefined"!=typeof t.classList)return t.classList.contains(e);var o=u(t);return new RegExp("(^| )"+e+"( |$)","gi").test(o)}function u(t){return t.className instanceof SVGAnimatedString?t.className.baseVal:t.className}function p(t,e){t.setAttribute("class",e)}function c(t,e,o){o.forEach(function(o){-1===e.indexOf(o)&&d(t,o)&&h(t,o)}),e.forEach(function(e){d(t,e)||l(t,e)})}function i(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}function g(t,e){var o=arguments.length<=2||void 0===arguments[2]?1:arguments[2];return t+o>=e&&e>=t-o}function m(){return"undefined"!=typeof performance&&"undefined"!=typeof performance.now?performance.now():+new Date}function v(){for(var t={top:0,left:0},e=arguments.length,o=Array(e),i=0;e>i;i++)o[i]=arguments[i];return o.forEach(function(e){var o=e.top,i=e.left;"string"==typeof o&&(o=parseFloat(o,10)),"string"==typeof i&&(i=parseFloat(i,10)),t.top+=o,t.left+=i}),t}function y(t,e){return"string"==typeof t.left&&-1!==t.left.indexOf("%")&&(t.left=parseFloat(t.left,10)/100*e.width),"string"==typeof t.top&&-1!==t.top.indexOf("%")&&(t.top=parseFloat(t.top,10)/100*e.height),t}function b(t,e){return"scrollParent"===e?e=t.scrollParent:"window"===e&&(e=[pageXOffset,pageYOffset,innerWidth+pageXOffset,innerHeight+pageYOffset]),e===document&&(e=e.documentElement),"undefined"!=typeof e.nodeType&&!function(){var t=r(e),o=t,i=getComputedStyle(e);e=[o.left,o.top,t.width+o.left,t.height+o.top],U.forEach(function(t,o){t=t[0].toUpperCase()+t.substr(1),"Top"===t||"Left"===t?e[o]+=parseFloat(i["border"+t+"Width"]):e[o]-=parseFloat(i["border"+t+"Width"])})}(),e}var w=function(){function t(t,e){for(var o=0;o1?o-1:0),n=1;o>n;n++)i[n-1]=arguments[n];for(;e16?(e=Math.min(e-16,250),void(o=setTimeout(n,250))):void("undefined"!=typeof t&&m()-t<10||("undefined"!=typeof o&&(clearTimeout(o),o=null),t=m(),_(),e=m()-t))};"undefined"!=typeof window&&"undefined"!=typeof window.addEventListener&&["resize","scroll","touchmove"].forEach(function(t){window.addEventListener(t,i)})}();var z={center:"center",left:"right",right:"left"},L={middle:"middle",top:"bottom",bottom:"top"},Y={top:0,left:0,middle:"50%",center:"50%",bottom:"100%",right:"100%"},H=function(t,e){var o=t.left,i=t.top;return"auto"===o&&(o=z[e.left]),"auto"===i&&(i=L[e.top]),{left:o,top:i}},F=function(t){var e=t.left,o=t.top;return"undefined"!=typeof Y[t.left]&&(e=Y[t.left]),"undefined"!=typeof Y[t.top]&&(o=Y[t.top]),{left:e,top:o}},X=function(t){var e=t.split(" "),o=M(e,2),i=o[0],n=o[1];return{top:i,left:n}},j=X,N=function(){function t(e){var o=this;i(this,t),this.position=this.position.bind(this),B.push(this),this.history=[],this.setOptions(e,!1),C.modules.forEach(function(t){"undefined"!=typeof t.initialize&&t.initialize.call(o)}),this.position()}return w(t,[{key:"getClass",value:function(){var t=arguments.length<=0||void 0===arguments[0]?"":arguments[0],e=this.options.classes;return"undefined"!=typeof e&&e[t]?this.options.classes[t]:this.options.classPrefix?this.options.classPrefix+"-"+t:t}},{key:"setOptions",value:function(t){var e=this,o=arguments.length<=1||void 0===arguments[1]?!0:arguments[1],i={offset:"0 0",targetOffset:"0 0",targetAttachment:"auto auto",classPrefix:"tether"};this.options=f(i,t);var r=this.options,s=r.element,a=r.target,h=r.targetModifier;if(this.element=s,this.target=a,this.targetModifier=h,"viewport"===this.target?(this.target=document.body,this.targetModifier="visible"):"scroll-handle"===this.target&&(this.target=document.body,this.targetModifier="scroll-handle"),["element","target"].forEach(function(t){if("undefined"==typeof e[t])throw new Error("Tether Error: Both element and target must be defined");"undefined"!=typeof e[t].jquery?e[t]=e[t][0]:"string"==typeof e[t]&&(e[t]=document.querySelector(e[t]))}),l(this.element,this.getClass("element")),this.options.addTargetClasses!==!1&&l(this.target,this.getClass("target")),!this.options.attachment)throw new Error("Tether Error: You must provide an attachment");this.targetAttachment=j(this.options.targetAttachment),this.attachment=j(this.options.attachment),this.offset=X(this.options.offset),this.targetOffset=X(this.options.targetOffset),"undefined"!=typeof this.scrollParent&&this.disable(),"scroll-handle"===this.targetModifier?this.scrollParents=[this.target]:this.scrollParents=n(this.target),this.options.enabled!==!1&&this.enable(o)}},{key:"getTargetBounds",value:function(){if("undefined"==typeof this.targetModifier)return r(this.target);if("visible"===this.targetModifier){if(this.target===document.body)return{top:pageYOffset,left:pageXOffset,height:innerHeight,width:innerWidth};var t=r(this.target),e={height:t.height,width:t.width,top:t.top,left:t.left};return e.height=Math.min(e.height,t.height-(pageYOffset-t.top)),e.height=Math.min(e.height,t.height-(t.top+t.height-(pageYOffset+innerHeight))),e.height=Math.min(innerHeight,e.height),e.height-=2,e.width=Math.min(e.width,t.width-(pageXOffset-t.left)),e.width=Math.min(e.width,t.width-(t.left+t.width-(pageXOffset+innerWidth))),e.width=Math.min(innerWidth,e.width),e.width-=2,e.topo.clientWidth||[i.overflow,i.overflowX].indexOf("scroll")>=0||this.target!==document.body,s=0;n&&(s=15);var a=t.height-parseFloat(i.borderTopWidth)-parseFloat(i.borderBottomWidth)-s,e={width:15,height:.975*a*(a/o.scrollHeight),left:t.left+t.width-parseFloat(i.borderLeftWidth)-15},f=0;408>a&&this.target===document.body&&(f=-11e-5*Math.pow(a,2)-.00727*a+22.58),this.target!==document.body&&(e.height=Math.max(e.height,24));var h=this.target.scrollTop/(o.scrollHeight-a);return e.top=h*(a-e.height-f)+t.top+parseFloat(i.borderTopWidth),this.target===document.body&&(e.height=Math.max(e.height,24)),e}}},{key:"clearCache",value:function(){this._cache={}}},{key:"cache",value:function(t,e){return"undefined"==typeof this._cache&&(this._cache={}),"undefined"==typeof this._cache[t]&&(this._cache[t]=e.call(this)),this._cache[t]}},{key:"enable",value:function(){var t=this,e=arguments.length<=0||void 0===arguments[0]?!0:arguments[0];this.options.addTargetClasses!==!1&&l(this.target,this.getClass("enabled")),l(this.element,this.getClass("enabled")),this.enabled=!0,this.scrollParents.forEach(function(e){e!==document&&e.addEventListener("scroll",t.position)}),e&&this.position()}},{key:"disable",value:function(){var t=this;h(this.target,this.getClass("enabled")),h(this.element,this.getClass("enabled")),this.enabled=!1,"undefined"!=typeof this.scrollParents&&this.scrollParents.forEach(function(e){e.removeEventListener("scroll",t.position)})}},{key:"destroy",value:function(){var t=this;this.disable(),B.forEach(function(e,o){return e===t?void B.splice(o,1):void 0})}},{key:"updateAttachClasses",value:function(t,e){var o=this;t=t||this.attachment,e=e||this.targetAttachment;var i=["left","top","bottom","right","middle","center"];"undefined"!=typeof this._addAttachClasses&&this._addAttachClasses.length&&this._addAttachClasses.splice(0,this._addAttachClasses.length),"undefined"==typeof this._addAttachClasses&&(this._addAttachClasses=[]);var n=this._addAttachClasses;t.top&&n.push(this.getClass("element-attached")+"-"+t.top),t.left&&n.push(this.getClass("element-attached")+"-"+t.left),e.top&&n.push(this.getClass("target-attached")+"-"+e.top),e.left&&n.push(this.getClass("target-attached")+"-"+e.left);var r=[];i.forEach(function(t){r.push(o.getClass("element-attached")+"-"+t),r.push(o.getClass("target-attached")+"-"+t)}),T(function(){"undefined"!=typeof o._addAttachClasses&&(c(o.element,o._addAttachClasses,r),o.options.addTargetClasses!==!1&&c(o.target,o._addAttachClasses,r),delete o._addAttachClasses)})}},{key:"position",value:function(){var t=this,e=arguments.length<=0||void 0===arguments[0]?!0:arguments[0];if(this.enabled){this.clearCache();var o=H(this.targetAttachment,this.attachment);this.updateAttachClasses(this.attachment,o);var i=this.cache("element-bounds",function(){return r(t.element)}),n=i.width,f=i.height;if(0===n&&0===f&&"undefined"!=typeof this.lastSize){var h=this.lastSize;n=h.width,f=h.height}else this.lastSize={width:n,height:f};var l=this.cache("target-bounds",function(){return t.getTargetBounds()}),d=l,u=y(F(this.attachment),{width:n,height:f}),p=y(F(o),d),c=y(this.offset,{width:n,height:f}),g=y(this.targetOffset,d);u=v(u,c),p=v(p,g);for(var m=l.left+p.left-u.left,b=l.top+p.top-u.top,w=0;wwindow.innerWidth&&(A=this.cache("scrollbar-size",a),x.viewport.bottom-=A.height),document.body.scrollHeight>window.innerHeight&&(A=this.cache("scrollbar-size",a),x.viewport.right-=A.width),(-1===["","static"].indexOf(document.body.style.position)||-1===["","static"].indexOf(document.body.parentElement.style.position))&&(x.page.bottom=document.body.scrollHeight-b-f,x.page.right=document.body.scrollWidth-m-n),"undefined"!=typeof this.options.optimizations&&this.options.optimizations.moveElement!==!1&&"undefined"==typeof this.targetModifier&&!function(){var e=t.cache("target-offsetparent",function(){return s(t.target)}),o=t.cache("target-offsetparent-bounds",function(){return r(e)}),i=getComputedStyle(e),n=o,a={};if(["Top","Left","Bottom","Right"].forEach(function(t){a[t.toLowerCase()]=parseFloat(i["border"+t+"Width"])}),o.right=document.body.scrollWidth-o.left-n.width+a.right,o.bottom=document.body.scrollHeight-o.top-n.height+a.bottom,x.page.top>=o.top+a.top&&x.page.bottom>=o.bottom&&x.page.left>=o.left+a.left&&x.page.right>=o.right){var f=e.scrollTop,h=e.scrollLeft;x.offset={top:x.page.top-o.top+f-a.top,left:x.page.left-o.left+h-a.left}}}(),this.move(x),this.history.unshift(x),this.history.length>3&&this.history.pop(),e&&S(),!0}}},{key:"move",value:function(t){var e=this;if("undefined"!=typeof this.element.parentNode){var o={};for(var i in t){o[i]={};for(var n in t[i]){for(var r=!1,a=0;a=0){var c=s.split(" "),g=M(c,2);d=g[0],l=g[1]}else l=d=s;var w=b(e,r);("target"===d||"both"===d)&&(ow[3]&&"bottom"===v.top&&(o-=u,v.top="top")),"together"===d&&("top"===v.top&&("bottom"===y.top&&ow[3]&&o-(a-u)>=w[1]&&(o-=a-u,v.top="bottom",y.top="bottom")),"bottom"===v.top&&("top"===y.top&&o+a>w[3]?(o-=u,v.top="top",o-=a,y.top="bottom"):"bottom"===y.top&&ow[3]&&"top"===y.top?(o-=a,y.top="bottom"):ow[2]&&"right"===v.left&&(i-=p,v.left="left")),"together"===l&&(iw[2]&&"right"===v.left?"left"===y.left?(i-=p,v.left="left",i-=h,y.left="right"):"right"===y.left&&(i-=p,v.left="left",i+=h,y.left="left"):"center"===v.left&&(i+h>w[2]&&"left"===y.left?(i-=h,y.left="right"):iw[3]&&"top"===y.top&&(o-=a,y.top="bottom")),("element"===l||"both"===l)&&(iw[2]&&("left"===y.left?(i-=h,y.left="right"):"center"===y.left&&(i-=h/2,y.left="right"))),"string"==typeof f?f=f.split(",").map(function(t){return t.trim()}):f===!0&&(f=["top","left","right","bottom"]),f=f||[];var C=[],O=[];o=0?(o=w[1],C.push("top")):O.push("top")),o+a>w[3]&&(f.indexOf("bottom")>=0?(o=w[3]-a,C.push("bottom")):O.push("bottom")),i=0?(i=w[0],C.push("left")):O.push("left")),i+h>w[2]&&(f.indexOf("right")>=0?(i=w[2]-h,C.push("right")):O.push("right")),C.length&&!function(){var t=void 0;t="undefined"!=typeof e.options.pinnedClass?e.options.pinnedClass:e.getClass("pinned"),m.push(t),C.forEach(function(e){m.push(t+"-"+e)})}(),O.length&&!function(){var t=void 0;t="undefined"!=typeof e.options.outOfBoundsClass?e.options.outOfBoundsClass:e.getClass("out-of-bounds"),m.push(t),O.forEach(function(e){m.push(t+"-"+e)})}(),(C.indexOf("left")>=0||C.indexOf("right")>=0)&&(y.left=v.left=!1),(C.indexOf("top")>=0||C.indexOf("bottom")>=0)&&(y.top=v.top=!1),(v.top!==n.top||v.left!==n.left||y.top!==e.attachment.top||y.left!==e.attachment.left)&&e.updateAttachClasses(y,v)}),T(function(){e.options.addTargetClasses!==!1&&c(e.target,m,g),c(e.element,m,g)}),{top:o,left:i}}});var P=C.Utils,r=P.getBounds,c=P.updateClasses,T=P.defer;C.modules.push({position:function(t){var e=this,o=t.top,i=t.left,n=this.cache("element-bounds",function(){return r(e.element)}),s=n.height,a=n.width,f=this.getTargetBounds(),h=o+s,l=i+a,d=[];o<=f.bottom&&h>=f.top&&["left","right"].forEach(function(t){var e=f[t];(e===i||e===l)&&d.push(t)}),i<=f.right&&l>=f.left&&["top","bottom"].forEach(function(t){var e=f[t];(e===o||e===h)&&d.push(t)});var u=[],p=[],g=["left","top","right","bottom"];return u.push(this.getClass("abutted")),g.forEach(function(t){u.push(e.getClass("abutted")+"-"+t)}),d.length&&p.push(this.getClass("abutted")),d.forEach(function(t){p.push(e.getClass("abutted")+"-"+t)}),T(function(){e.options.addTargetClasses!==!1&&c(e.target,p,u),c(e.element,p,u)}),!0}});var M=function(){function t(t,e){var o=[],i=!0,n=!1,r=void 0;try{for(var s,a=t[Symbol.iterator]();!(i=(s=a.next()).done)&&(o.push(s.value),!e||o.length!==e);i=!0);}catch(f){n=!0,r=f}finally{try{!i&&a["return"]&&a["return"]()}finally{if(n)throw r}}return o}return function(e,o){if(Array.isArray(e))return e;if(Symbol.iterator in Object(e))return t(e,o);throw new TypeError("Invalid attempt to destructure non-iterable instance")}}();return C.modules.push({position:function(t){var e=t.top,o=t.left;if(this.options.shift){var i=this.options.shift;"function"==typeof this.options.shift&&(i=this.options.shift.call(this,{top:e,left:o}));var n=void 0,r=void 0;if("string"==typeof i){i=i.split(" "),i[1]=i[1]||i[0];var s=i,a=M(s,2);n=a[0],r=a[1],n=parseFloat(n,10),r=parseFloat(r,10)}else n=i.top,r=i.left;return e+=n,o+=r,{top:e,left:o}}}}),R}); \ No newline at end of file +!function(t,e){"function"==typeof define&&define.amd?define(e):"object"==typeof exports?module.exports=e(require,exports,module):t.Tether=e()}(this,function(t,e,o){"use strict";function i(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}function n(t){var e=getComputedStyle(t)||{},o=e.position;if("fixed"===o)return t;for(var i=t;i=i.parentNode;){var n=void 0;try{n=getComputedStyle(i)}catch(r){}if("undefined"==typeof n||null===n)return i;var s=n,a=s.overflow,f=s.overflowX,h=s.overflowY;if(/(auto|scroll)/.test(a+h+f)&&("absolute"!==o||["relative","absolute","fixed"].indexOf(n.position)>=0))return i}return document.body}function r(t){var e=void 0;t===document?(e=document,t=document.documentElement):e=t.ownerDocument;var o=e.documentElement,i={},n=t.getBoundingClientRect();for(var r in n)i[r]=n[r];var s=x(e);return i.top-=s.top,i.left-=s.left,"undefined"==typeof i.width&&(i.width=document.body.scrollWidth-i.left-i.right),"undefined"==typeof i.height&&(i.height=document.body.scrollHeight-i.top-i.bottom),i.top=i.top-o.clientTop,i.left=i.left-o.clientLeft,i.right=e.body.clientWidth-i.width-i.left,i.bottom=e.body.clientHeight-i.height-i.top,i}function s(t){return t.offsetParent||document.documentElement}function a(){var t=document.createElement("div");t.style.width="100%",t.style.height="200px";var e=document.createElement("div");f(e.style,{position:"absolute",top:0,left:0,pointerEvents:"none",visibility:"hidden",width:"200px",height:"150px",overflow:"hidden"}),e.appendChild(t),document.body.appendChild(e);var o=t.offsetWidth;e.style.overflow="scroll";var i=t.offsetWidth;o===i&&(i=e.clientWidth),document.body.removeChild(e);var n=o-i;return{width:n,height:n}}function f(){var t=arguments.length<=0||void 0===arguments[0]?{}:arguments[0],e=[];return Array.prototype.push.apply(e,arguments),e.slice(1).forEach(function(e){if(e)for(var o in e)({}).hasOwnProperty.call(e,o)&&(t[o]=e[o])}),t}function h(t,e){if("undefined"!=typeof t.classList)e.split(" ").forEach(function(e){e.trim()&&t.classList.remove(e)});else{var o=new RegExp("(^| )"+e.split(" ").join("|")+"( |$)","gi"),i=p(t).replace(o," ");u(t,i)}}function l(t,e){if("undefined"!=typeof t.classList)e.split(" ").forEach(function(e){e.trim()&&t.classList.add(e)});else{h(t,e);var o=p(t)+(" "+e);u(t,o)}}function d(t,e){if("undefined"!=typeof t.classList)return t.classList.contains(e);var o=p(t);return new RegExp("(^| )"+e+"( |$)","gi").test(o)}function p(t){return t.className instanceof SVGAnimatedString?t.className.baseVal:t.className}function u(t,e){t.setAttribute("class",e)}function c(t,e,o){o.forEach(function(o){-1===e.indexOf(o)&&d(t,o)&&h(t,o)}),e.forEach(function(e){d(t,e)||l(t,e)})}function i(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}function g(t,e){var o=arguments.length<=2||void 0===arguments[2]?1:arguments[2];return t+o>=e&&e>=t-o}function m(){return"undefined"!=typeof performance&&"undefined"!=typeof performance.now?performance.now():+new Date}function v(){for(var t={top:0,left:0},e=arguments.length,o=Array(e),i=0;e>i;i++)o[i]=arguments[i];return o.forEach(function(e){var o=e.top,i=e.left;"string"==typeof o&&(o=parseFloat(o,10)),"string"==typeof i&&(i=parseFloat(i,10)),t.top+=o,t.left+=i}),t}function y(t,e){return"string"==typeof t.left&&-1!==t.left.indexOf("%")&&(t.left=parseFloat(t.left,10)/100*e.width),"string"==typeof t.top&&-1!==t.top.indexOf("%")&&(t.top=parseFloat(t.top,10)/100*e.height),t}function b(t,e){return"scrollParent"===e?e=t.scrollParent:"window"===e&&(e=[pageXOffset,pageYOffset,innerWidth+pageXOffset,innerHeight+pageYOffset]),e===document&&(e=e.documentElement),"undefined"!=typeof e.nodeType&&!function(){var t=r(e),o=t,i=getComputedStyle(e);e=[o.left,o.top,t.width+o.left,t.height+o.top],U.forEach(function(t,o){t=t[0].toUpperCase()+t.substr(1),"Top"===t||"Left"===t?e[o]+=parseFloat(i["border"+t+"Width"]):e[o]-=parseFloat(i["border"+t+"Width"])})}(),e}var w=function(){function t(t,e){for(var o=0;o1?o-1:0),n=1;o>n;n++)i[n-1]=arguments[n];for(;e16?(e=Math.min(e-16,250),void(o=setTimeout(n,250))):void("undefined"!=typeof t&&m()-t<10||("undefined"!=typeof o&&(clearTimeout(o),o=null),t=m(),_(),e=m()-t))};"undefined"!=typeof window&&"undefined"!=typeof window.addEventListener&&["resize","scroll","touchmove"].forEach(function(t){window.addEventListener(t,i)})}();var z={center:"center",left:"right",right:"left"},L={middle:"middle",top:"bottom",bottom:"top"},Y={top:0,left:0,middle:"50%",center:"50%",bottom:"100%",right:"100%"},H=function(t,e){var o=t.left,i=t.top;return"auto"===o&&(o=z[e.left]),"auto"===i&&(i=L[e.top]),{left:o,top:i}},F=function(t){var e=t.left,o=t.top;return"undefined"!=typeof Y[t.left]&&(e=Y[t.left]),"undefined"!=typeof Y[t.top]&&(o=Y[t.top]),{left:e,top:o}},X=function(t){var e=t.split(" "),o=M(e,2),i=o[0],n=o[1];return{top:i,left:n}},j=X,N=function(){function t(e){var o=this;i(this,t),this.position=this.position.bind(this),B.push(this),this.history=[],this.setOptions(e,!1),C.modules.forEach(function(t){"undefined"!=typeof t.initialize&&t.initialize.call(o)}),this.position()}return w(t,[{key:"getClass",value:function(){var t=arguments.length<=0||void 0===arguments[0]?"":arguments[0],e=this.options.classes;return"undefined"!=typeof e&&e[t]?this.options.classes[t]:this.options.classPrefix?this.options.classPrefix+"-"+t:t}},{key:"setOptions",value:function(t){var e=this,o=arguments.length<=1||void 0===arguments[1]?!0:arguments[1],i={offset:"0 0",targetOffset:"0 0",targetAttachment:"auto auto",classPrefix:"tether"};this.options=f(i,t);var r=this.options,s=r.element,a=r.target,h=r.targetModifier;if(this.element=s,this.target=a,this.targetModifier=h,"viewport"===this.target?(this.target=document.body,this.targetModifier="visible"):"scroll-handle"===this.target&&(this.target=document.body,this.targetModifier="scroll-handle"),["element","target"].forEach(function(t){if("undefined"==typeof e[t])throw new Error("Tether Error: Both element and target must be defined");"undefined"!=typeof e[t].jquery?e[t]=e[t][0]:"string"==typeof e[t]&&(e[t]=document.querySelector(e[t]))}),l(this.element,this.getClass("element")),this.options.addTargetClasses!==!1&&l(this.target,this.getClass("target")),!this.options.attachment)throw new Error("Tether Error: You must provide an attachment");this.targetAttachment=j(this.options.targetAttachment),this.attachment=j(this.options.attachment),this.offset=X(this.options.offset),this.targetOffset=X(this.options.targetOffset),"undefined"!=typeof this.scrollParent&&this.disable(),"scroll-handle"===this.targetModifier?this.scrollParent=this.target:this.scrollParent=n(this.target),this.options.enabled!==!1&&this.enable(o)}},{key:"getTargetBounds",value:function(){if("undefined"==typeof this.targetModifier)return r(this.target);if("visible"===this.targetModifier){if(this.target===document.body)return{top:pageYOffset,left:pageXOffset,height:innerHeight,width:innerWidth};var t=r(this.target),e={height:t.height,width:t.width,top:t.top,left:t.left};return e.height=Math.min(e.height,t.height-(pageYOffset-t.top)),e.height=Math.min(e.height,t.height-(t.top+t.height-(pageYOffset+innerHeight))),e.height=Math.min(innerHeight,e.height),e.height-=2,e.width=Math.min(e.width,t.width-(pageXOffset-t.left)),e.width=Math.min(e.width,t.width-(t.left+t.width-(pageXOffset+innerWidth))),e.width=Math.min(innerWidth,e.width),e.width-=2,e.topo.clientWidth||[i.overflow,i.overflowX].indexOf("scroll")>=0||this.target!==document.body,s=0;n&&(s=15);var a=t.height-parseFloat(i.borderTopWidth)-parseFloat(i.borderBottomWidth)-s,e={width:15,height:.975*a*(a/o.scrollHeight),left:t.left+t.width-parseFloat(i.borderLeftWidth)-15},f=0;408>a&&this.target===document.body&&(f=-11e-5*Math.pow(a,2)-.00727*a+22.58),this.target!==document.body&&(e.height=Math.max(e.height,24));var h=this.target.scrollTop/(o.scrollHeight-a);return e.top=h*(a-e.height-f)+t.top+parseFloat(i.borderTopWidth),this.target===document.body&&(e.height=Math.max(e.height,24)),e}}},{key:"clearCache",value:function(){this._cache={}}},{key:"cache",value:function(t,e){return"undefined"==typeof this._cache&&(this._cache={}),"undefined"==typeof this._cache[t]&&(this._cache[t]=e.call(this)),this._cache[t]}},{key:"enable",value:function(){var t=arguments.length<=0||void 0===arguments[0]?!0:arguments[0];this.options.addTargetClasses!==!1&&l(this.target,this.getClass("enabled")),l(this.element,this.getClass("enabled")),this.enabled=!0,this.scrollParent!==document&&this.scrollParent.addEventListener("scroll",this.position),t&&this.position()}},{key:"disable",value:function(){h(this.target,this.getClass("enabled")),h(this.element,this.getClass("enabled")),this.enabled=!1,"undefined"!=typeof this.scrollParent&&this.scrollParent.removeEventListener("scroll",this.position)}},{key:"destroy",value:function(){var t=this;this.disable(),B.forEach(function(e,o){return e===t?void B.splice(o,1):void 0})}},{key:"updateAttachClasses",value:function(t,e){var o=this;t=t||this.attachment,e=e||this.targetAttachment;var i=["left","top","bottom","right","middle","center"];"undefined"!=typeof this._addAttachClasses&&this._addAttachClasses.length&&this._addAttachClasses.splice(0,this._addAttachClasses.length),"undefined"==typeof this._addAttachClasses&&(this._addAttachClasses=[]);var n=this._addAttachClasses;t.top&&n.push(this.getClass("element-attached")+"-"+t.top),t.left&&n.push(this.getClass("element-attached")+"-"+t.left),e.top&&n.push(this.getClass("target-attached")+"-"+e.top),e.left&&n.push(this.getClass("target-attached")+"-"+e.left);var r=[];i.forEach(function(t){r.push(o.getClass("element-attached")+"-"+t),r.push(o.getClass("target-attached")+"-"+t)}),T(function(){"undefined"!=typeof o._addAttachClasses&&(c(o.element,o._addAttachClasses,r),o.options.addTargetClasses!==!1&&c(o.target,o._addAttachClasses,r),delete o._addAttachClasses)})}},{key:"position",value:function(){var t=this,e=arguments.length<=0||void 0===arguments[0]?!0:arguments[0];if(this.enabled){this.clearCache();var o=H(this.targetAttachment,this.attachment);this.updateAttachClasses(this.attachment,o);var i=this.cache("element-bounds",function(){return r(t.element)}),n=i.width,f=i.height;if(0===n&&0===f&&"undefined"!=typeof this.lastSize){var h=this.lastSize;n=h.width,f=h.height}else this.lastSize={width:n,height:f};var l=this.cache("target-bounds",function(){return t.getTargetBounds()}),d=l,p=y(F(this.attachment),{width:n,height:f}),u=y(F(o),d),c=y(this.offset,{width:n,height:f}),g=y(this.targetOffset,d);p=v(p,c),u=v(u,g);for(var m=l.left+u.left-p.left,b=l.top+u.top-p.top,w=0;wwindow.innerWidth&&(A=this.cache("scrollbar-size",a),x.viewport.bottom-=A.height),document.body.scrollHeight>window.innerHeight&&(A=this.cache("scrollbar-size",a),x.viewport.right-=A.width),-1!==["","static"].indexOf(document.body.style.position)&&-1!==["","static"].indexOf(document.body.parentElement.style.position)||(x.page.bottom=document.body.scrollHeight-b-f,x.page.right=document.body.scrollWidth-m-n),"undefined"!=typeof this.options.optimizations&&this.options.optimizations.moveElement!==!1&&"undefined"==typeof this.targetModifier&&!function(){var e=t.cache("target-offsetparent",function(){return s(t.target)}),o=t.cache("target-offsetparent-bounds",function(){return r(e)}),i=getComputedStyle(e),n=o,a={};if(["Top","Left","Bottom","Right"].forEach(function(t){a[t.toLowerCase()]=parseFloat(i["border"+t+"Width"])}),o.right=document.body.scrollWidth-o.left-n.width+a.right,o.bottom=document.body.scrollHeight-o.top-n.height+a.bottom,x.page.top>=o.top+a.top&&x.page.bottom>=o.bottom&&x.page.left>=o.left+a.left&&x.page.right>=o.right){var f=e.scrollTop,h=e.scrollLeft;x.offset={top:x.page.top-o.top+f-a.top,left:x.page.left-o.left+h-a.left}}}(),this.move(x),this.history.unshift(x),this.history.length>3&&this.history.pop(),e&&S(),!0}}},{key:"move",value:function(t){var e=this;if("undefined"!=typeof this.element.parentNode){var o={};for(var i in t){o[i]={};for(var n in t[i]){for(var r=!1,a=0;a=0){var c=s.split(" "),g=M(c,2);d=g[0],l=g[1]}else l=d=s;var w=b(e,r);"target"!==d&&"both"!==d||(ow[3]&&"bottom"===v.top&&(o-=p,v.top="top")),"together"===d&&(ow[3]&&"bottom"===v.top&&("top"===y.top?(o-=p,v.top="top",o-=a,y.top="bottom"):"bottom"===y.top&&(o-=p,v.top="top",o+=a,y.top="top")),"middle"===v.top&&(o+a>w[3]&&"top"===y.top?(o-=a,y.top="bottom"):ow[2]&&"right"===v.left&&(i-=u,v.left="left")),"together"===l&&(iw[2]&&"right"===v.left?"left"===y.left?(i-=u,v.left="left",i-=h,y.left="right"):"right"===y.left&&(i-=u,v.left="left",i+=h,y.left="left"):"center"===v.left&&(i+h>w[2]&&"left"===y.left?(i-=h,y.left="right"):iw[3]&&"top"===y.top&&(o-=a,y.top="bottom")),"element"!==l&&"both"!==l||(iw[2]&&("left"===y.left?(i-=h,y.left="right"):"center"===y.left&&(i-=h/2,y.left="right"))),"string"==typeof f?f=f.split(",").map(function(t){return t.trim()}):f===!0&&(f=["top","left","right","bottom"]),f=f||[];var C=[],O=[];o=0?(o=w[1],C.push("top")):O.push("top")),o+a>w[3]&&(f.indexOf("bottom")>=0?(o=w[3]-a,C.push("bottom")):O.push("bottom")),i=0?(i=w[0],C.push("left")):O.push("left")),i+h>w[2]&&(f.indexOf("right")>=0?(i=w[2]-h,C.push("right")):O.push("right")),C.length&&!function(){var t=void 0;t="undefined"!=typeof e.options.pinnedClass?e.options.pinnedClass:e.getClass("pinned"),m.push(t),C.forEach(function(e){m.push(t+"-"+e)})}(),O.length&&!function(){var t=void 0;t="undefined"!=typeof e.options.outOfBoundsClass?e.options.outOfBoundsClass:e.getClass("out-of-bounds"),m.push(t),O.forEach(function(e){m.push(t+"-"+e)})}(),(C.indexOf("left")>=0||C.indexOf("right")>=0)&&(y.left=v.left=!1),(C.indexOf("top")>=0||C.indexOf("bottom")>=0)&&(y.top=v.top=!1),v.top===n.top&&v.left===n.left&&y.top===e.attachment.top&&y.left===e.attachment.left||e.updateAttachClasses(y,v)}),T(function(){e.options.addTargetClasses!==!1&&c(e.target,m,g),c(e.element,m,g)}),{top:o,left:i}}});var P=C.Utils,r=P.getBounds,c=P.updateClasses,T=P.defer;C.modules.push({position:function(t){var e=this,o=t.top,i=t.left,n=this.cache("element-bounds",function(){return r(e.element)}),s=n.height,a=n.width,f=this.getTargetBounds(),h=o+s,l=i+a,d=[];o<=f.bottom&&h>=f.top&&["left","right"].forEach(function(t){var e=f[t];e!==i&&e!==l||d.push(t)}),i<=f.right&&l>=f.left&&["top","bottom"].forEach(function(t){var e=f[t];e!==o&&e!==h||d.push(t)});var p=[],u=[],g=["left","top","right","bottom"];return p.push(this.getClass("abutted")),g.forEach(function(t){p.push(e.getClass("abutted")+"-"+t)}),d.length&&u.push(this.getClass("abutted")),d.forEach(function(t){u.push(e.getClass("abutted")+"-"+t)}),T(function(){e.options.addTargetClasses!==!1&&c(e.target,u,p),c(e.element,u,p)}),!0}});var M=function(){function t(t,e){var o=[],i=!0,n=!1,r=void 0;try{for(var s,a=t[Symbol.iterator]();!(i=(s=a.next()).done)&&(o.push(s.value),!e||o.length!==e);i=!0);}catch(f){n=!0,r=f}finally{try{!i&&a["return"]&&a["return"]()}finally{if(n)throw r}}return o}return function(e,o){if(Array.isArray(e))return e;if(Symbol.iterator in Object(e))return t(e,o);throw new TypeError("Invalid attempt to destructure non-iterable instance")}}();return C.modules.push({position:function(t){var e=t.top,o=t.left;if(this.options.shift){var i=this.options.shift;"function"==typeof this.options.shift&&(i=this.options.shift.call(this,{top:e,left:o}));var n=void 0,r=void 0;if("string"==typeof i){i=i.split(" "),i[1]=i[1]||i[0];var s=i,a=M(s,2);n=a[0],r=a[1],n=parseFloat(n,10),r=parseFloat(r,10)}else n=i.top,r=i.left;return e+=n,o+=r,{top:e,left:o}}}}),R}); \ No newline at end of file diff --git a/examples/element-scroll/index.html b/examples/element-scroll/index.html index e93181aed..216138909 100644 --- a/examples/element-scroll/index.html +++ b/examples/element-scroll/index.html @@ -441,7 +441,7 @@ } - +

          +

          Tether

          A client-side library to make absolutely positioned elements attach to elements in the page efficiently.

          1.2.2

          From 924097620bd4e93fd6d9a96db9a358fa74b7b30e Mon Sep 17 00:00:00 2001 From: Trevor Burnham Date: Tue, 19 Apr 2016 18:27:48 -0400 Subject: [PATCH 13/40] Rebuild docs for 1.3.1 --- dist/js/tether.js | 163 +++++++++++++++++------------ dist/js/tether.min.js | 2 +- examples/element-scroll/index.html | 2 +- examples/out-of-bounds/index.html | 5 +- index.html | 2 +- 5 files changed, 105 insertions(+), 69 deletions(-) diff --git a/dist/js/tether.js b/dist/js/tether.js index a818dacc1..5176a7786 100644 --- a/dist/js/tether.js +++ b/dist/js/tether.js @@ -1,4 +1,4 @@ -/*! tether 1.2.2 */ +/*! tether 1.3.0 */ (function(root, factory) { if (typeof define === 'function' && define.amd) { @@ -21,25 +21,29 @@ if (typeof TetherBase === 'undefined') { TetherBase = { modules: [] }; } -function getScrollParent(el) { +var zeroElement = null; + +function getScrollParents(el) { // In firefox if the el is inside an iframe with display: none; window.getComputedStyle() will return null; // https://bugzilla.mozilla.org/show_bug.cgi?id=548397 var computedStyle = getComputedStyle(el) || {}; var position = computedStyle.position; + var parents = []; if (position === 'fixed') { - return el; + return [el]; } var parent = el; - while (parent = parent.parentNode) { + while ((parent = parent.parentNode) && parent && parent.nodeType === 1) { var style = undefined; try { style = getComputedStyle(parent); } catch (err) {} if (typeof style === 'undefined' || style === null) { - return parent; + parents.push(parent); + return parents; } var _style = style; @@ -49,12 +53,13 @@ function getScrollParent(el) { if (/(auto|scroll)/.test(overflow + overflowY + overflowX)) { if (position !== 'absolute' || ['relative', 'absolute', 'fixed'].indexOf(style.position) >= 0) { - return parent; + parents.push(parent); } } } - return document.body; + parents.push(document.body); + return parents; } var uniqueId = (function () { @@ -65,14 +70,14 @@ var uniqueId = (function () { })(); var zeroPosCache = {}; -var getOrigin = function getOrigin(doc) { +var getOrigin = function getOrigin() { // getBoundingClientRect is unfortunately too accurate. It introduces a pixel or two of // jitter as the user scrolls that messes with our ability to detect if two positions // are equivilant or not. We place an element at the top left of the page that will // get the same jitter, so we can cancel the two out. - var node = doc._tetherZeroElement; - if (typeof node === 'undefined') { - node = doc.createElement('div'); + var node = zeroElement; + if (!node) { + node = document.createElement('div'); node.setAttribute('data-tether-id', uniqueId()); extend(node.style, { top: 0, @@ -80,9 +85,9 @@ var getOrigin = function getOrigin(doc) { position: 'absolute' }); - doc.body.appendChild(node); + document.body.appendChild(node); - doc._tetherZeroElement = node; + zeroElement = node; } var id = node.getAttribute('data-tether-id'); @@ -104,6 +109,11 @@ var getOrigin = function getOrigin(doc) { return zeroPosCache[id]; }; +function removeUtilElements() { + document.body.removeChild(zeroElement); + zeroElement = undefined; +}; + function getBounds(el) { var doc = undefined; if (el === document) { @@ -123,7 +133,7 @@ function getBounds(el) { box[k] = rect[k]; } - var origin = getOrigin(doc); + var origin = getOrigin(); box.top -= origin.top; box.left -= origin.left; @@ -359,7 +369,7 @@ var Evented = (function () { })(); TetherBase.Utils = { - getScrollParent: getScrollParent, + getScrollParents: getScrollParents, getBounds: getBounds, getOffsetParent: getOffsetParent, extend: extend, @@ -371,7 +381,8 @@ TetherBase.Utils = { flush: flush, uniqueId: uniqueId, Evented: Evented, - getScrollBarSize: getScrollBarSize + getScrollBarSize: getScrollBarSize, + removeUtilElements: removeUtilElements }; /* globals TetherBase, performance */ @@ -381,14 +392,18 @@ var _slicedToArray = (function () { function sliceIterator(arr, i) { var _arr = 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; }; })(); +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); } } }; + function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError('Cannot call a class as a function'); } } +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; } + if (typeof TetherBase === 'undefined') { throw new Error('You must include the utils.js file before tether.js'); } var _TetherBase$Utils = TetherBase.Utils; -var getScrollParent = _TetherBase$Utils.getScrollParent; +var getScrollParents = _TetherBase$Utils.getScrollParents; var getBounds = _TetherBase$Utils.getBounds; var getOffsetParent = _TetherBase$Utils.getOffsetParent; var extend = _TetherBase$Utils.extend; @@ -398,6 +413,7 @@ var updateClasses = _TetherBase$Utils.updateClasses; var defer = _TetherBase$Utils.defer; var flush = _TetherBase$Utils.flush; var getScrollBarSize = _TetherBase$Utils.getScrollBarSize; +var removeUtilElements = _TetherBase$Utils.removeUtilElements; function within(a, b) { var diff = arguments.length <= 2 || arguments[2] === undefined ? 1 : arguments[2]; @@ -572,12 +588,15 @@ var parseOffset = function parseOffset(value) { }; var parseAttachment = parseOffset; -var TetherClass = (function () { +var TetherClass = (function (_Evented) { + _inherits(TetherClass, _Evented); + function TetherClass(options) { var _this = this; _classCallCheck(this, TetherClass); + _get(Object.getPrototypeOf(TetherClass.prototype), 'constructor', this).call(this); this.position = this.position.bind(this); tethers.push(this); @@ -668,14 +687,14 @@ var TetherClass = (function () { this.offset = parseOffset(this.options.offset); this.targetOffset = parseOffset(this.options.targetOffset); - if (typeof this.scrollParent !== 'undefined') { + if (typeof this.scrollParents !== 'undefined') { this.disable(); } if (this.targetModifier === 'scroll-handle') { - this.scrollParent = this.target; + this.scrollParents = [this.target]; } else { - this.scrollParent = getScrollParent(this.target); + this.scrollParents = getScrollParents(this.target); } if (!(this.options.enabled === false)) { @@ -796,6 +815,8 @@ var TetherClass = (function () { }, { key: 'enable', value: function enable() { + var _this3 = this; + var pos = arguments.length <= 0 || arguments[0] === undefined ? true : arguments[0]; if (!(this.options.addTargetClasses === false)) { @@ -804,9 +825,11 @@ var TetherClass = (function () { addClass(this.element, this.getClass('enabled')); this.enabled = true; - if (this.scrollParent !== document) { - this.scrollParent.addEventListener('scroll', this.position); - } + this.scrollParents.forEach(function (parent) { + if (parent !== document) { + parent.addEventListener('scroll', _this3.position); + } + }); if (pos) { this.position(); @@ -815,32 +838,40 @@ var TetherClass = (function () { }, { key: 'disable', value: function disable() { + var _this4 = this; + removeClass(this.target, this.getClass('enabled')); removeClass(this.element, this.getClass('enabled')); this.enabled = false; - if (typeof this.scrollParent !== 'undefined') { - this.scrollParent.removeEventListener('scroll', this.position); + if (typeof this.scrollParents !== 'undefined') { + this.scrollParents.forEach(function (parent) { + parent.removeEventListener('scroll', _this4.position); + }); } } }, { key: 'destroy', value: function destroy() { - var _this3 = this; + var _this5 = this; this.disable(); tethers.forEach(function (tether, i) { - if (tether === _this3) { + if (tether === _this5) { tethers.splice(i, 1); - return; } }); + + // Remove any elements we were using for convenience from the DOM + if (tethers.length === 0) { + removeUtilElements(); + } } }, { key: 'updateAttachClasses', value: function updateAttachClasses(elementAttach, targetAttach) { - var _this4 = this; + var _this6 = this; elementAttach = elementAttach || this.attachment; targetAttach = targetAttach || this.targetAttachment; @@ -873,27 +904,27 @@ var TetherClass = (function () { var all = []; sides.forEach(function (side) { - all.push(_this4.getClass('element-attached') + '-' + side); - all.push(_this4.getClass('target-attached') + '-' + side); + all.push(_this6.getClass('element-attached') + '-' + side); + all.push(_this6.getClass('target-attached') + '-' + side); }); defer(function () { - if (!(typeof _this4._addAttachClasses !== 'undefined')) { + if (!(typeof _this6._addAttachClasses !== 'undefined')) { return; } - updateClasses(_this4.element, _this4._addAttachClasses, all); - if (!(_this4.options.addTargetClasses === false)) { - updateClasses(_this4.target, _this4._addAttachClasses, all); + updateClasses(_this6.element, _this6._addAttachClasses, all); + if (!(_this6.options.addTargetClasses === false)) { + updateClasses(_this6.target, _this6._addAttachClasses, all); } - delete _this4._addAttachClasses; + delete _this6._addAttachClasses; }); } }, { key: 'position', value: function position() { - var _this5 = this; + var _this7 = this; var flushChanges = arguments.length <= 0 || arguments[0] === undefined ? true : arguments[0]; @@ -912,7 +943,7 @@ var TetherClass = (function () { this.updateAttachClasses(this.attachment, targetAttachment); var elementPos = this.cache('element-bounds', function () { - return getBounds(_this5.element); + return getBounds(_this7.element); }); var width = elementPos.width; @@ -930,7 +961,7 @@ var TetherClass = (function () { } var targetPos = this.cache('target-bounds', function () { - return _this5.getTargetBounds(); + return _this7.getTargetBounds(); }); var targetSize = targetPos; @@ -1014,10 +1045,10 @@ var TetherClass = (function () { if (typeof this.options.optimizations !== 'undefined' && this.options.optimizations.moveElement !== false && !(typeof this.targetModifier !== 'undefined')) { (function () { - var offsetParent = _this5.cache('target-offsetparent', function () { - return getOffsetParent(_this5.target); + var offsetParent = _this7.cache('target-offsetparent', function () { + return getOffsetParent(_this7.target); }); - var offsetPosition = _this5.cache('target-offsetparent-bounds', function () { + var offsetPosition = _this7.cache('target-offsetparent-bounds', function () { return getBounds(offsetParent); }); var offsetParentStyle = getComputedStyle(offsetParent); @@ -1070,7 +1101,7 @@ var TetherClass = (function () { }, { key: 'move', value: function move(pos) { - var _this6 = this; + var _this8 = this; if (!(typeof this.element.parentNode !== 'undefined')) { return; @@ -1101,8 +1132,8 @@ var TetherClass = (function () { var css = { top: '', left: '', right: '', bottom: '' }; var transcribe = function transcribe(_same, _pos) { - var hasOptimizations = typeof _this6.options.optimizations !== 'undefined'; - var gpu = hasOptimizations ? _this6.options.optimizations.gpu : null; + var hasOptimizations = typeof _this8.options.optimizations !== 'undefined'; + var gpu = hasOptimizations ? _this8.options.optimizations.gpu : null; if (gpu !== false) { var yPos = undefined, xPos = undefined; @@ -1154,14 +1185,14 @@ var TetherClass = (function () { } else if (typeof same.offset !== 'undefined' && same.offset.top && same.offset.left) { (function () { css.position = 'absolute'; - var offsetParent = _this6.cache('target-offsetparent', function () { - return getOffsetParent(_this6.target); + var offsetParent = _this8.cache('target-offsetparent', function () { + return getOffsetParent(_this8.target); }); - if (getOffsetParent(_this6.element) !== offsetParent) { + if (getOffsetParent(_this8.element) !== offsetParent) { defer(function () { - _this6.element.parentNode.removeChild(_this6.element); - offsetParent.appendChild(_this6.element); + _this8.element.parentNode.removeChild(_this8.element); + offsetParent.appendChild(_this8.element); }); } @@ -1176,7 +1207,7 @@ var TetherClass = (function () { if (!moved) { var offsetParentIsBody = true; var currentNode = this.element.parentNode; - while (currentNode && currentNode.tagName !== 'BODY') { + while (currentNode && currentNode.nodeType === 1 && currentNode.tagName !== 'BODY') { if (getComputedStyle(currentNode).position !== 'static') { offsetParentIsBody = false; break; @@ -1206,14 +1237,14 @@ var TetherClass = (function () { if (write) { defer(function () { - extend(_this6.element.style, writeCSS); + extend(_this8.element.style, writeCSS); }); } } }]); return TetherClass; -})(); +})(Evented); TetherClass.modules = []; @@ -1236,7 +1267,7 @@ var BOUNDS_FORMAT = ['left', 'top', 'right', 'bottom']; function getBoundingRect(tether, to) { if (to === 'scrollParent') { - to = tether.scrollParent; + to = tether.scrollParents[0]; } else if (to === 'window') { to = [pageXOffset, pageYOffset, innerWidth + pageXOffset, innerHeight + pageYOffset]; } @@ -1364,34 +1395,32 @@ TetherBase.modules.push({ } if (changeAttachY === 'together') { - if (top < bounds[1] && tAttachment.top === 'top') { - if (eAttachment.top === 'bottom') { + if (tAttachment.top === 'top') { + if (eAttachment.top === 'bottom' && top < bounds[1]) { top += targetHeight; tAttachment.top = 'bottom'; top += height; eAttachment.top = 'top'; - } else if (eAttachment.top === 'top') { - top += targetHeight; + } else if (eAttachment.top === 'top' && top + height > bounds[3] && top - (height - targetHeight) >= bounds[1]) { + top -= height - targetHeight; tAttachment.top = 'bottom'; - top -= height; eAttachment.top = 'bottom'; } } - if (top + height > bounds[3] && tAttachment.top === 'bottom') { - if (eAttachment.top === 'top') { + if (tAttachment.top === 'bottom') { + if (eAttachment.top === 'top' && top + height > bounds[3]) { top -= targetHeight; tAttachment.top = 'top'; top -= height; eAttachment.top = 'bottom'; - } else if (eAttachment.top === 'bottom') { - top -= targetHeight; + } else if (eAttachment.top === 'bottom' && top < bounds[1] && top + (height * 2 - targetHeight) <= bounds[3]) { + top += height - targetHeight; tAttachment.top = 'top'; - top += height; eAttachment.top = 'top'; } } @@ -1583,6 +1612,10 @@ TetherBase.modules.push({ if (tAttachment.top !== targetAttachment.top || tAttachment.left !== targetAttachment.left || eAttachment.top !== _this.attachment.top || eAttachment.left !== _this.attachment.left) { _this.updateAttachClasses(eAttachment, tAttachment); + _this.trigger('update', { + attachment: eAttachment, + targetAttachment: tAttachment + }); } }); diff --git a/dist/js/tether.min.js b/dist/js/tether.min.js index fae66f0cd..3f4993796 100644 --- a/dist/js/tether.min.js +++ b/dist/js/tether.min.js @@ -1 +1 @@ -!function(t,e){"function"==typeof define&&define.amd?define(e):"object"==typeof exports?module.exports=e(require,exports,module):t.Tether=e()}(this,function(t,e,o){"use strict";function i(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}function n(t){var e=getComputedStyle(t)||{},o=e.position;if("fixed"===o)return t;for(var i=t;i=i.parentNode;){var n=void 0;try{n=getComputedStyle(i)}catch(r){}if("undefined"==typeof n||null===n)return i;var s=n,a=s.overflow,f=s.overflowX,h=s.overflowY;if(/(auto|scroll)/.test(a+h+f)&&("absolute"!==o||["relative","absolute","fixed"].indexOf(n.position)>=0))return i}return document.body}function r(t){var e=void 0;t===document?(e=document,t=document.documentElement):e=t.ownerDocument;var o=e.documentElement,i={},n=t.getBoundingClientRect();for(var r in n)i[r]=n[r];var s=x(e);return i.top-=s.top,i.left-=s.left,"undefined"==typeof i.width&&(i.width=document.body.scrollWidth-i.left-i.right),"undefined"==typeof i.height&&(i.height=document.body.scrollHeight-i.top-i.bottom),i.top=i.top-o.clientTop,i.left=i.left-o.clientLeft,i.right=e.body.clientWidth-i.width-i.left,i.bottom=e.body.clientHeight-i.height-i.top,i}function s(t){return t.offsetParent||document.documentElement}function a(){var t=document.createElement("div");t.style.width="100%",t.style.height="200px";var e=document.createElement("div");f(e.style,{position:"absolute",top:0,left:0,pointerEvents:"none",visibility:"hidden",width:"200px",height:"150px",overflow:"hidden"}),e.appendChild(t),document.body.appendChild(e);var o=t.offsetWidth;e.style.overflow="scroll";var i=t.offsetWidth;o===i&&(i=e.clientWidth),document.body.removeChild(e);var n=o-i;return{width:n,height:n}}function f(){var t=arguments.length<=0||void 0===arguments[0]?{}:arguments[0],e=[];return Array.prototype.push.apply(e,arguments),e.slice(1).forEach(function(e){if(e)for(var o in e)({}).hasOwnProperty.call(e,o)&&(t[o]=e[o])}),t}function h(t,e){if("undefined"!=typeof t.classList)e.split(" ").forEach(function(e){e.trim()&&t.classList.remove(e)});else{var o=new RegExp("(^| )"+e.split(" ").join("|")+"( |$)","gi"),i=p(t).replace(o," ");u(t,i)}}function l(t,e){if("undefined"!=typeof t.classList)e.split(" ").forEach(function(e){e.trim()&&t.classList.add(e)});else{h(t,e);var o=p(t)+(" "+e);u(t,o)}}function d(t,e){if("undefined"!=typeof t.classList)return t.classList.contains(e);var o=p(t);return new RegExp("(^| )"+e+"( |$)","gi").test(o)}function p(t){return t.className instanceof SVGAnimatedString?t.className.baseVal:t.className}function u(t,e){t.setAttribute("class",e)}function c(t,e,o){o.forEach(function(o){-1===e.indexOf(o)&&d(t,o)&&h(t,o)}),e.forEach(function(e){d(t,e)||l(t,e)})}function i(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}function g(t,e){var o=arguments.length<=2||void 0===arguments[2]?1:arguments[2];return t+o>=e&&e>=t-o}function m(){return"undefined"!=typeof performance&&"undefined"!=typeof performance.now?performance.now():+new Date}function v(){for(var t={top:0,left:0},e=arguments.length,o=Array(e),i=0;e>i;i++)o[i]=arguments[i];return o.forEach(function(e){var o=e.top,i=e.left;"string"==typeof o&&(o=parseFloat(o,10)),"string"==typeof i&&(i=parseFloat(i,10)),t.top+=o,t.left+=i}),t}function y(t,e){return"string"==typeof t.left&&-1!==t.left.indexOf("%")&&(t.left=parseFloat(t.left,10)/100*e.width),"string"==typeof t.top&&-1!==t.top.indexOf("%")&&(t.top=parseFloat(t.top,10)/100*e.height),t}function b(t,e){return"scrollParent"===e?e=t.scrollParent:"window"===e&&(e=[pageXOffset,pageYOffset,innerWidth+pageXOffset,innerHeight+pageYOffset]),e===document&&(e=e.documentElement),"undefined"!=typeof e.nodeType&&!function(){var t=r(e),o=t,i=getComputedStyle(e);e=[o.left,o.top,t.width+o.left,t.height+o.top],U.forEach(function(t,o){t=t[0].toUpperCase()+t.substr(1),"Top"===t||"Left"===t?e[o]+=parseFloat(i["border"+t+"Width"]):e[o]-=parseFloat(i["border"+t+"Width"])})}(),e}var w=function(){function t(t,e){for(var o=0;o1?o-1:0),n=1;o>n;n++)i[n-1]=arguments[n];for(;e16?(e=Math.min(e-16,250),void(o=setTimeout(n,250))):void("undefined"!=typeof t&&m()-t<10||("undefined"!=typeof o&&(clearTimeout(o),o=null),t=m(),_(),e=m()-t))};"undefined"!=typeof window&&"undefined"!=typeof window.addEventListener&&["resize","scroll","touchmove"].forEach(function(t){window.addEventListener(t,i)})}();var z={center:"center",left:"right",right:"left"},L={middle:"middle",top:"bottom",bottom:"top"},Y={top:0,left:0,middle:"50%",center:"50%",bottom:"100%",right:"100%"},H=function(t,e){var o=t.left,i=t.top;return"auto"===o&&(o=z[e.left]),"auto"===i&&(i=L[e.top]),{left:o,top:i}},F=function(t){var e=t.left,o=t.top;return"undefined"!=typeof Y[t.left]&&(e=Y[t.left]),"undefined"!=typeof Y[t.top]&&(o=Y[t.top]),{left:e,top:o}},X=function(t){var e=t.split(" "),o=M(e,2),i=o[0],n=o[1];return{top:i,left:n}},j=X,N=function(){function t(e){var o=this;i(this,t),this.position=this.position.bind(this),B.push(this),this.history=[],this.setOptions(e,!1),C.modules.forEach(function(t){"undefined"!=typeof t.initialize&&t.initialize.call(o)}),this.position()}return w(t,[{key:"getClass",value:function(){var t=arguments.length<=0||void 0===arguments[0]?"":arguments[0],e=this.options.classes;return"undefined"!=typeof e&&e[t]?this.options.classes[t]:this.options.classPrefix?this.options.classPrefix+"-"+t:t}},{key:"setOptions",value:function(t){var e=this,o=arguments.length<=1||void 0===arguments[1]?!0:arguments[1],i={offset:"0 0",targetOffset:"0 0",targetAttachment:"auto auto",classPrefix:"tether"};this.options=f(i,t);var r=this.options,s=r.element,a=r.target,h=r.targetModifier;if(this.element=s,this.target=a,this.targetModifier=h,"viewport"===this.target?(this.target=document.body,this.targetModifier="visible"):"scroll-handle"===this.target&&(this.target=document.body,this.targetModifier="scroll-handle"),["element","target"].forEach(function(t){if("undefined"==typeof e[t])throw new Error("Tether Error: Both element and target must be defined");"undefined"!=typeof e[t].jquery?e[t]=e[t][0]:"string"==typeof e[t]&&(e[t]=document.querySelector(e[t]))}),l(this.element,this.getClass("element")),this.options.addTargetClasses!==!1&&l(this.target,this.getClass("target")),!this.options.attachment)throw new Error("Tether Error: You must provide an attachment");this.targetAttachment=j(this.options.targetAttachment),this.attachment=j(this.options.attachment),this.offset=X(this.options.offset),this.targetOffset=X(this.options.targetOffset),"undefined"!=typeof this.scrollParent&&this.disable(),"scroll-handle"===this.targetModifier?this.scrollParent=this.target:this.scrollParent=n(this.target),this.options.enabled!==!1&&this.enable(o)}},{key:"getTargetBounds",value:function(){if("undefined"==typeof this.targetModifier)return r(this.target);if("visible"===this.targetModifier){if(this.target===document.body)return{top:pageYOffset,left:pageXOffset,height:innerHeight,width:innerWidth};var t=r(this.target),e={height:t.height,width:t.width,top:t.top,left:t.left};return e.height=Math.min(e.height,t.height-(pageYOffset-t.top)),e.height=Math.min(e.height,t.height-(t.top+t.height-(pageYOffset+innerHeight))),e.height=Math.min(innerHeight,e.height),e.height-=2,e.width=Math.min(e.width,t.width-(pageXOffset-t.left)),e.width=Math.min(e.width,t.width-(t.left+t.width-(pageXOffset+innerWidth))),e.width=Math.min(innerWidth,e.width),e.width-=2,e.topo.clientWidth||[i.overflow,i.overflowX].indexOf("scroll")>=0||this.target!==document.body,s=0;n&&(s=15);var a=t.height-parseFloat(i.borderTopWidth)-parseFloat(i.borderBottomWidth)-s,e={width:15,height:.975*a*(a/o.scrollHeight),left:t.left+t.width-parseFloat(i.borderLeftWidth)-15},f=0;408>a&&this.target===document.body&&(f=-11e-5*Math.pow(a,2)-.00727*a+22.58),this.target!==document.body&&(e.height=Math.max(e.height,24));var h=this.target.scrollTop/(o.scrollHeight-a);return e.top=h*(a-e.height-f)+t.top+parseFloat(i.borderTopWidth),this.target===document.body&&(e.height=Math.max(e.height,24)),e}}},{key:"clearCache",value:function(){this._cache={}}},{key:"cache",value:function(t,e){return"undefined"==typeof this._cache&&(this._cache={}),"undefined"==typeof this._cache[t]&&(this._cache[t]=e.call(this)),this._cache[t]}},{key:"enable",value:function(){var t=arguments.length<=0||void 0===arguments[0]?!0:arguments[0];this.options.addTargetClasses!==!1&&l(this.target,this.getClass("enabled")),l(this.element,this.getClass("enabled")),this.enabled=!0,this.scrollParent!==document&&this.scrollParent.addEventListener("scroll",this.position),t&&this.position()}},{key:"disable",value:function(){h(this.target,this.getClass("enabled")),h(this.element,this.getClass("enabled")),this.enabled=!1,"undefined"!=typeof this.scrollParent&&this.scrollParent.removeEventListener("scroll",this.position)}},{key:"destroy",value:function(){var t=this;this.disable(),B.forEach(function(e,o){return e===t?void B.splice(o,1):void 0})}},{key:"updateAttachClasses",value:function(t,e){var o=this;t=t||this.attachment,e=e||this.targetAttachment;var i=["left","top","bottom","right","middle","center"];"undefined"!=typeof this._addAttachClasses&&this._addAttachClasses.length&&this._addAttachClasses.splice(0,this._addAttachClasses.length),"undefined"==typeof this._addAttachClasses&&(this._addAttachClasses=[]);var n=this._addAttachClasses;t.top&&n.push(this.getClass("element-attached")+"-"+t.top),t.left&&n.push(this.getClass("element-attached")+"-"+t.left),e.top&&n.push(this.getClass("target-attached")+"-"+e.top),e.left&&n.push(this.getClass("target-attached")+"-"+e.left);var r=[];i.forEach(function(t){r.push(o.getClass("element-attached")+"-"+t),r.push(o.getClass("target-attached")+"-"+t)}),T(function(){"undefined"!=typeof o._addAttachClasses&&(c(o.element,o._addAttachClasses,r),o.options.addTargetClasses!==!1&&c(o.target,o._addAttachClasses,r),delete o._addAttachClasses)})}},{key:"position",value:function(){var t=this,e=arguments.length<=0||void 0===arguments[0]?!0:arguments[0];if(this.enabled){this.clearCache();var o=H(this.targetAttachment,this.attachment);this.updateAttachClasses(this.attachment,o);var i=this.cache("element-bounds",function(){return r(t.element)}),n=i.width,f=i.height;if(0===n&&0===f&&"undefined"!=typeof this.lastSize){var h=this.lastSize;n=h.width,f=h.height}else this.lastSize={width:n,height:f};var l=this.cache("target-bounds",function(){return t.getTargetBounds()}),d=l,p=y(F(this.attachment),{width:n,height:f}),u=y(F(o),d),c=y(this.offset,{width:n,height:f}),g=y(this.targetOffset,d);p=v(p,c),u=v(u,g);for(var m=l.left+u.left-p.left,b=l.top+u.top-p.top,w=0;wwindow.innerWidth&&(A=this.cache("scrollbar-size",a),x.viewport.bottom-=A.height),document.body.scrollHeight>window.innerHeight&&(A=this.cache("scrollbar-size",a),x.viewport.right-=A.width),-1!==["","static"].indexOf(document.body.style.position)&&-1!==["","static"].indexOf(document.body.parentElement.style.position)||(x.page.bottom=document.body.scrollHeight-b-f,x.page.right=document.body.scrollWidth-m-n),"undefined"!=typeof this.options.optimizations&&this.options.optimizations.moveElement!==!1&&"undefined"==typeof this.targetModifier&&!function(){var e=t.cache("target-offsetparent",function(){return s(t.target)}),o=t.cache("target-offsetparent-bounds",function(){return r(e)}),i=getComputedStyle(e),n=o,a={};if(["Top","Left","Bottom","Right"].forEach(function(t){a[t.toLowerCase()]=parseFloat(i["border"+t+"Width"])}),o.right=document.body.scrollWidth-o.left-n.width+a.right,o.bottom=document.body.scrollHeight-o.top-n.height+a.bottom,x.page.top>=o.top+a.top&&x.page.bottom>=o.bottom&&x.page.left>=o.left+a.left&&x.page.right>=o.right){var f=e.scrollTop,h=e.scrollLeft;x.offset={top:x.page.top-o.top+f-a.top,left:x.page.left-o.left+h-a.left}}}(),this.move(x),this.history.unshift(x),this.history.length>3&&this.history.pop(),e&&S(),!0}}},{key:"move",value:function(t){var e=this;if("undefined"!=typeof this.element.parentNode){var o={};for(var i in t){o[i]={};for(var n in t[i]){for(var r=!1,a=0;a=0){var c=s.split(" "),g=M(c,2);d=g[0],l=g[1]}else l=d=s;var w=b(e,r);"target"!==d&&"both"!==d||(ow[3]&&"bottom"===v.top&&(o-=p,v.top="top")),"together"===d&&(ow[3]&&"bottom"===v.top&&("top"===y.top?(o-=p,v.top="top",o-=a,y.top="bottom"):"bottom"===y.top&&(o-=p,v.top="top",o+=a,y.top="top")),"middle"===v.top&&(o+a>w[3]&&"top"===y.top?(o-=a,y.top="bottom"):ow[2]&&"right"===v.left&&(i-=u,v.left="left")),"together"===l&&(iw[2]&&"right"===v.left?"left"===y.left?(i-=u,v.left="left",i-=h,y.left="right"):"right"===y.left&&(i-=u,v.left="left",i+=h,y.left="left"):"center"===v.left&&(i+h>w[2]&&"left"===y.left?(i-=h,y.left="right"):iw[3]&&"top"===y.top&&(o-=a,y.top="bottom")),"element"!==l&&"both"!==l||(iw[2]&&("left"===y.left?(i-=h,y.left="right"):"center"===y.left&&(i-=h/2,y.left="right"))),"string"==typeof f?f=f.split(",").map(function(t){return t.trim()}):f===!0&&(f=["top","left","right","bottom"]),f=f||[];var C=[],O=[];o=0?(o=w[1],C.push("top")):O.push("top")),o+a>w[3]&&(f.indexOf("bottom")>=0?(o=w[3]-a,C.push("bottom")):O.push("bottom")),i=0?(i=w[0],C.push("left")):O.push("left")),i+h>w[2]&&(f.indexOf("right")>=0?(i=w[2]-h,C.push("right")):O.push("right")),C.length&&!function(){var t=void 0;t="undefined"!=typeof e.options.pinnedClass?e.options.pinnedClass:e.getClass("pinned"),m.push(t),C.forEach(function(e){m.push(t+"-"+e)})}(),O.length&&!function(){var t=void 0;t="undefined"!=typeof e.options.outOfBoundsClass?e.options.outOfBoundsClass:e.getClass("out-of-bounds"),m.push(t),O.forEach(function(e){m.push(t+"-"+e)})}(),(C.indexOf("left")>=0||C.indexOf("right")>=0)&&(y.left=v.left=!1),(C.indexOf("top")>=0||C.indexOf("bottom")>=0)&&(y.top=v.top=!1),v.top===n.top&&v.left===n.left&&y.top===e.attachment.top&&y.left===e.attachment.left||e.updateAttachClasses(y,v)}),T(function(){e.options.addTargetClasses!==!1&&c(e.target,m,g),c(e.element,m,g)}),{top:o,left:i}}});var P=C.Utils,r=P.getBounds,c=P.updateClasses,T=P.defer;C.modules.push({position:function(t){var e=this,o=t.top,i=t.left,n=this.cache("element-bounds",function(){return r(e.element)}),s=n.height,a=n.width,f=this.getTargetBounds(),h=o+s,l=i+a,d=[];o<=f.bottom&&h>=f.top&&["left","right"].forEach(function(t){var e=f[t];e!==i&&e!==l||d.push(t)}),i<=f.right&&l>=f.left&&["top","bottom"].forEach(function(t){var e=f[t];e!==o&&e!==h||d.push(t)});var p=[],u=[],g=["left","top","right","bottom"];return p.push(this.getClass("abutted")),g.forEach(function(t){p.push(e.getClass("abutted")+"-"+t)}),d.length&&u.push(this.getClass("abutted")),d.forEach(function(t){u.push(e.getClass("abutted")+"-"+t)}),T(function(){e.options.addTargetClasses!==!1&&c(e.target,u,p),c(e.element,u,p)}),!0}});var M=function(){function t(t,e){var o=[],i=!0,n=!1,r=void 0;try{for(var s,a=t[Symbol.iterator]();!(i=(s=a.next()).done)&&(o.push(s.value),!e||o.length!==e);i=!0);}catch(f){n=!0,r=f}finally{try{!i&&a["return"]&&a["return"]()}finally{if(n)throw r}}return o}return function(e,o){if(Array.isArray(e))return e;if(Symbol.iterator in Object(e))return t(e,o);throw new TypeError("Invalid attempt to destructure non-iterable instance")}}();return C.modules.push({position:function(t){var e=t.top,o=t.left;if(this.options.shift){var i=this.options.shift;"function"==typeof this.options.shift&&(i=this.options.shift.call(this,{top:e,left:o}));var n=void 0,r=void 0;if("string"==typeof i){i=i.split(" "),i[1]=i[1]||i[0];var s=i,a=M(s,2);n=a[0],r=a[1],n=parseFloat(n,10),r=parseFloat(r,10)}else n=i.top,r=i.left;return e+=n,o+=r,{top:e,left:o}}}}),R}); \ No newline at end of file +!function(t,e){"function"==typeof define&&define.amd?define(e):"object"==typeof exports?module.exports=e(require,exports,module):t.Tether=e()}(this,function(t,e,o){"use strict";function n(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}function i(t){var e=getComputedStyle(t)||{},o=e.position,n=[];if("fixed"===o)return[t];for(var i=t;(i=i.parentNode)&&i&&1===i.nodeType;){var r=void 0;try{r=getComputedStyle(i)}catch(s){}if("undefined"==typeof r||null===r)return n.push(i),n;var a=r,f=a.overflow,l=a.overflowX,h=a.overflowY;/(auto|scroll)/.test(f+h+l)&&("absolute"!==o||["relative","absolute","fixed"].indexOf(r.position)>=0)&&n.push(i)}return n.push(document.body),n}function r(){document.body.removeChild(x),x=void 0}function s(t){var e=void 0;t===document?(e=document,t=document.documentElement):e=t.ownerDocument;var o=e.documentElement,n={},i=t.getBoundingClientRect();for(var r in i)n[r]=i[r];var s=S();return n.top-=s.top,n.left-=s.left,"undefined"==typeof n.width&&(n.width=document.body.scrollWidth-n.left-n.right),"undefined"==typeof n.height&&(n.height=document.body.scrollHeight-n.top-n.bottom),n.top=n.top-o.clientTop,n.left=n.left-o.clientLeft,n.right=e.body.clientWidth-n.width-n.left,n.bottom=e.body.clientHeight-n.height-n.top,n}function a(t){return t.offsetParent||document.documentElement}function f(){var t=document.createElement("div");t.style.width="100%",t.style.height="200px";var e=document.createElement("div");l(e.style,{position:"absolute",top:0,left:0,pointerEvents:"none",visibility:"hidden",width:"200px",height:"150px",overflow:"hidden"}),e.appendChild(t),document.body.appendChild(e);var o=t.offsetWidth;e.style.overflow="scroll";var n=t.offsetWidth;o===n&&(n=e.clientWidth),document.body.removeChild(e);var i=o-n;return{width:i,height:i}}function l(){var t=arguments.length<=0||void 0===arguments[0]?{}:arguments[0],e=[];return Array.prototype.push.apply(e,arguments),e.slice(1).forEach(function(e){if(e)for(var o in e)({}).hasOwnProperty.call(e,o)&&(t[o]=e[o])}),t}function h(t,e){if("undefined"!=typeof t.classList)e.split(" ").forEach(function(e){e.trim()&&t.classList.remove(e)});else{var o=new RegExp("(^| )"+e.split(" ").join("|")+"( |$)","gi"),n=p(t).replace(o," ");c(t,n)}}function d(t,e){if("undefined"!=typeof t.classList)e.split(" ").forEach(function(e){e.trim()&&t.classList.add(e)});else{h(t,e);var o=p(t)+(" "+e);c(t,o)}}function u(t,e){if("undefined"!=typeof t.classList)return t.classList.contains(e);var o=p(t);return new RegExp("(^| )"+e+"( |$)","gi").test(o)}function p(t){return t.className instanceof SVGAnimatedString?t.className.baseVal:t.className}function c(t,e){t.setAttribute("class",e)}function g(t,e,o){o.forEach(function(o){-1===e.indexOf(o)&&u(t,o)&&h(t,o)}),e.forEach(function(e){u(t,e)||d(t,e)})}function n(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}function m(t,e){if("function"!=typeof e&&null!==e)throw new TypeError("Super expression must either be null or a function, not "+typeof e);t.prototype=Object.create(e&&e.prototype,{constructor:{value:t,enumerable:!1,writable:!0,configurable:!0}}),e&&(Object.setPrototypeOf?Object.setPrototypeOf(t,e):t.__proto__=e)}function v(t,e){var o=arguments.length<=2||void 0===arguments[2]?1:arguments[2];return t+o>=e&&e>=t-o}function y(){return"undefined"!=typeof performance&&"undefined"!=typeof performance.now?performance.now():+new Date}function b(){for(var t={top:0,left:0},e=arguments.length,o=Array(e),n=0;e>n;n++)o[n]=arguments[n];return o.forEach(function(e){var o=e.top,n=e.left;"string"==typeof o&&(o=parseFloat(o,10)),"string"==typeof n&&(n=parseFloat(n,10)),t.top+=o,t.left+=n}),t}function w(t,e){return"string"==typeof t.left&&-1!==t.left.indexOf("%")&&(t.left=parseFloat(t.left,10)/100*e.width),"string"==typeof t.top&&-1!==t.top.indexOf("%")&&(t.top=parseFloat(t.top,10)/100*e.height),t}function C(t,e){return"scrollParent"===e?e=t.scrollParents[0]:"window"===e&&(e=[pageXOffset,pageYOffset,innerWidth+pageXOffset,innerHeight+pageYOffset]),e===document&&(e=e.documentElement),"undefined"!=typeof e.nodeType&&!function(){var t=s(e),o=t,n=getComputedStyle(e);e=[o.left,o.top,t.width+o.left,t.height+o.top],V.forEach(function(t,o){t=t[0].toUpperCase()+t.substr(1),"Top"===t||"Left"===t?e[o]+=parseFloat(n["border"+t+"Width"]):e[o]-=parseFloat(n["border"+t+"Width"])})}(),e}var O=function(){function t(t,e){for(var o=0;o1?o-1:0),i=1;o>i;i++)n[i-1]=arguments[i];for(;e16?(e=Math.min(e-16,250),void(o=setTimeout(i,250))):void("undefined"!=typeof t&&y()-t<10||("undefined"!=typeof o&&(clearTimeout(o),o=null),t=y(),Y(),e=y()-t))};"undefined"!=typeof window&&"undefined"!=typeof window.addEventListener&&["resize","scroll","touchmove"].forEach(function(t){window.addEventListener(t,n)})}();var F={center:"center",left:"right",right:"left"},H={middle:"middle",top:"bottom",bottom:"top"},X={top:0,left:0,middle:"50%",center:"50%",bottom:"100%",right:"100%"},N=function(t,e){var o=t.left,n=t.top;return"auto"===o&&(o=F[e.left]),"auto"===n&&(n=H[e.top]),{left:o,top:n}},U=function(t){var e=t.left,o=t.top;return"undefined"!=typeof X[t.left]&&(e=X[t.left]),"undefined"!=typeof X[t.top]&&(o=X[t.top]),{left:e,top:o}},R=function(t){var e=t.split(" "),o=k(e,2),n=o[0],i=o[1];return{top:n,left:i}},q=R,D=function(t){function e(t){var o=this;n(this,e),B(Object.getPrototypeOf(e.prototype),"constructor",this).call(this),this.position=this.position.bind(this),L.push(this),this.history=[],this.setOptions(t,!1),E.modules.forEach(function(t){"undefined"!=typeof t.initialize&&t.initialize.call(o)}),this.position()}return m(e,t),O(e,[{key:"getClass",value:function(){var t=arguments.length<=0||void 0===arguments[0]?"":arguments[0],e=this.options.classes;return"undefined"!=typeof e&&e[t]?this.options.classes[t]:this.options.classPrefix?this.options.classPrefix+"-"+t:t}},{key:"setOptions",value:function(t){var e=this,o=arguments.length<=1||void 0===arguments[1]?!0:arguments[1],n={offset:"0 0",targetOffset:"0 0",targetAttachment:"auto auto",classPrefix:"tether"};this.options=l(n,t);var r=this.options,s=r.element,a=r.target,f=r.targetModifier;if(this.element=s,this.target=a,this.targetModifier=f,"viewport"===this.target?(this.target=document.body,this.targetModifier="visible"):"scroll-handle"===this.target&&(this.target=document.body,this.targetModifier="scroll-handle"),["element","target"].forEach(function(t){if("undefined"==typeof e[t])throw new Error("Tether Error: Both element and target must be defined");"undefined"!=typeof e[t].jquery?e[t]=e[t][0]:"string"==typeof e[t]&&(e[t]=document.querySelector(e[t]))}),d(this.element,this.getClass("element")),this.options.addTargetClasses!==!1&&d(this.target,this.getClass("target")),!this.options.attachment)throw new Error("Tether Error: You must provide an attachment");this.targetAttachment=q(this.options.targetAttachment),this.attachment=q(this.options.attachment),this.offset=R(this.options.offset),this.targetOffset=R(this.options.targetOffset),"undefined"!=typeof this.scrollParents&&this.disable(),"scroll-handle"===this.targetModifier?this.scrollParents=[this.target]:this.scrollParents=i(this.target),this.options.enabled!==!1&&this.enable(o)}},{key:"getTargetBounds",value:function(){if("undefined"==typeof this.targetModifier)return s(this.target);if("visible"===this.targetModifier){if(this.target===document.body)return{top:pageYOffset,left:pageXOffset,height:innerHeight,width:innerWidth};var t=s(this.target),e={height:t.height,width:t.width,top:t.top,left:t.left};return e.height=Math.min(e.height,t.height-(pageYOffset-t.top)),e.height=Math.min(e.height,t.height-(t.top+t.height-(pageYOffset+innerHeight))),e.height=Math.min(innerHeight,e.height),e.height-=2,e.width=Math.min(e.width,t.width-(pageXOffset-t.left)),e.width=Math.min(e.width,t.width-(t.left+t.width-(pageXOffset+innerWidth))),e.width=Math.min(innerWidth,e.width),e.width-=2,e.topo.clientWidth||[n.overflow,n.overflowX].indexOf("scroll")>=0||this.target!==document.body,r=0;i&&(r=15);var a=t.height-parseFloat(n.borderTopWidth)-parseFloat(n.borderBottomWidth)-r,e={width:15,height:.975*a*(a/o.scrollHeight),left:t.left+t.width-parseFloat(n.borderLeftWidth)-15},f=0;408>a&&this.target===document.body&&(f=-11e-5*Math.pow(a,2)-.00727*a+22.58),this.target!==document.body&&(e.height=Math.max(e.height,24));var l=this.target.scrollTop/(o.scrollHeight-a);return e.top=l*(a-e.height-f)+t.top+parseFloat(n.borderTopWidth),this.target===document.body&&(e.height=Math.max(e.height,24)),e}}},{key:"clearCache",value:function(){this._cache={}}},{key:"cache",value:function(t,e){return"undefined"==typeof this._cache&&(this._cache={}),"undefined"==typeof this._cache[t]&&(this._cache[t]=e.call(this)),this._cache[t]}},{key:"enable",value:function(){var t=this,e=arguments.length<=0||void 0===arguments[0]?!0:arguments[0];this.options.addTargetClasses!==!1&&d(this.target,this.getClass("enabled")),d(this.element,this.getClass("enabled")),this.enabled=!0,this.scrollParents.forEach(function(e){e!==document&&e.addEventListener("scroll",t.position)}),e&&this.position()}},{key:"disable",value:function(){var t=this;h(this.target,this.getClass("enabled")),h(this.element,this.getClass("enabled")),this.enabled=!1,"undefined"!=typeof this.scrollParents&&this.scrollParents.forEach(function(e){e.removeEventListener("scroll",t.position)})}},{key:"destroy",value:function(){var t=this;this.disable(),L.forEach(function(e,o){e===t&&L.splice(o,1)}),0===L.length&&r()}},{key:"updateAttachClasses",value:function(t,e){var o=this;t=t||this.attachment,e=e||this.targetAttachment;var n=["left","top","bottom","right","middle","center"];"undefined"!=typeof this._addAttachClasses&&this._addAttachClasses.length&&this._addAttachClasses.splice(0,this._addAttachClasses.length),"undefined"==typeof this._addAttachClasses&&(this._addAttachClasses=[]);var i=this._addAttachClasses;t.top&&i.push(this.getClass("element-attached")+"-"+t.top),t.left&&i.push(this.getClass("element-attached")+"-"+t.left),e.top&&i.push(this.getClass("target-attached")+"-"+e.top),e.left&&i.push(this.getClass("target-attached")+"-"+e.left);var r=[];n.forEach(function(t){r.push(o.getClass("element-attached")+"-"+t),r.push(o.getClass("target-attached")+"-"+t)}),W(function(){"undefined"!=typeof o._addAttachClasses&&(g(o.element,o._addAttachClasses,r),o.options.addTargetClasses!==!1&&g(o.target,o._addAttachClasses,r),delete o._addAttachClasses)})}},{key:"position",value:function(){var t=this,e=arguments.length<=0||void 0===arguments[0]?!0:arguments[0];if(this.enabled){this.clearCache();var o=N(this.targetAttachment,this.attachment);this.updateAttachClasses(this.attachment,o);var n=this.cache("element-bounds",function(){return s(t.element)}),i=n.width,r=n.height;if(0===i&&0===r&&"undefined"!=typeof this.lastSize){var l=this.lastSize;i=l.width,r=l.height}else this.lastSize={width:i,height:r};var h=this.cache("target-bounds",function(){return t.getTargetBounds()}),d=h,u=w(U(this.attachment),{width:i,height:r}),p=w(U(o),d),c=w(this.offset,{width:i,height:r}),g=w(this.targetOffset,d);u=b(u,c),p=b(p,g);for(var m=h.left+p.left-u.left,v=h.top+p.top-u.top,y=0;ywindow.innerWidth&&(T=this.cache("scrollbar-size",f),x.viewport.bottom-=T.height),document.body.scrollHeight>window.innerHeight&&(T=this.cache("scrollbar-size",f),x.viewport.right-=T.width),(-1===["","static"].indexOf(document.body.style.position)||-1===["","static"].indexOf(document.body.parentElement.style.position))&&(x.page.bottom=document.body.scrollHeight-v-r,x.page.right=document.body.scrollWidth-m-i),"undefined"!=typeof this.options.optimizations&&this.options.optimizations.moveElement!==!1&&"undefined"==typeof this.targetModifier&&!function(){var e=t.cache("target-offsetparent",function(){return a(t.target)}),o=t.cache("target-offsetparent-bounds",function(){return s(e)}),n=getComputedStyle(e),i=o,r={};if(["Top","Left","Bottom","Right"].forEach(function(t){r[t.toLowerCase()]=parseFloat(n["border"+t+"Width"])}),o.right=document.body.scrollWidth-o.left-i.width+r.right,o.bottom=document.body.scrollHeight-o.top-i.height+r.bottom,x.page.top>=o.top+r.top&&x.page.bottom>=o.bottom&&x.page.left>=o.left+r.left&&x.page.right>=o.right){var f=e.scrollTop,l=e.scrollLeft;x.offset={top:x.page.top-o.top+f-r.top,left:x.page.left-o.left+l-r.left}}}(),this.move(x),this.history.unshift(x),this.history.length>3&&this.history.pop(),e&&M(),!0}}},{key:"move",value:function(t){var e=this;if("undefined"!=typeof this.element.parentNode){var o={};for(var n in t){o[n]={};for(var i in t[n]){for(var r=!1,s=0;s=0){var c=s.split(" "),g=k(c,2);d=g[0],h=g[1]}else h=d=s;var b=C(e,r);("target"===d||"both"===d)&&(ob[3]&&"bottom"===v.top&&(o-=u,v.top="top")),"together"===d&&("top"===v.top&&("bottom"===y.top&&ob[3]&&o-(a-u)>=b[1]&&(o-=a-u,v.top="bottom",y.top="bottom")),"bottom"===v.top&&("top"===y.top&&o+a>b[3]?(o-=u,v.top="top",o-=a,y.top="bottom"):"bottom"===y.top&&ob[3]&&"top"===y.top?(o-=a,y.top="bottom"):ob[2]&&"right"===v.left&&(n-=p,v.left="left")),"together"===h&&(nb[2]&&"right"===v.left?"left"===y.left?(n-=p,v.left="left",n-=f,y.left="right"):"right"===y.left&&(n-=p,v.left="left",n+=f,y.left="left"):"center"===v.left&&(n+f>b[2]&&"left"===y.left?(n-=f,y.left="right"):nb[3]&&"top"===y.top&&(o-=a,y.top="bottom")),("element"===h||"both"===h)&&(nb[2]&&("left"===y.left?(n-=f,y.left="right"):"center"===y.left&&(n-=f/2,y.left="right"))),"string"==typeof l?l=l.split(",").map(function(t){return t.trim()}):l===!0&&(l=["top","left","right","bottom"]),l=l||[];var w=[],O=[];o=0?(o=b[1],w.push("top")):O.push("top")),o+a>b[3]&&(l.indexOf("bottom")>=0?(o=b[3]-a,w.push("bottom")):O.push("bottom")),n=0?(n=b[0],w.push("left")):O.push("left")),n+f>b[2]&&(l.indexOf("right")>=0?(n=b[2]-f,w.push("right")):O.push("right")),w.length&&!function(){var t=void 0;t="undefined"!=typeof e.options.pinnedClass?e.options.pinnedClass:e.getClass("pinned"),m.push(t),w.forEach(function(e){m.push(t+"-"+e)})}(),O.length&&!function(){var t=void 0;t="undefined"!=typeof e.options.outOfBoundsClass?e.options.outOfBoundsClass:e.getClass("out-of-bounds"),m.push(t),O.forEach(function(e){m.push(t+"-"+e)})}(),(w.indexOf("left")>=0||w.indexOf("right")>=0)&&(y.left=v.left=!1),(w.indexOf("top")>=0||w.indexOf("bottom")>=0)&&(y.top=v.top=!1),(v.top!==i.top||v.left!==i.left||y.top!==e.attachment.top||y.left!==e.attachment.left)&&(e.updateAttachClasses(y,v),e.trigger("update",{attachment:y,targetAttachment:v}))}),W(function(){e.options.addTargetClasses!==!1&&g(e.target,m,c),g(e.element,m,c)}),{top:o,left:n}}});var z=E.Utils,s=z.getBounds,g=z.updateClasses,W=z.defer;E.modules.push({position:function(t){var e=this,o=t.top,n=t.left,i=this.cache("element-bounds",function(){return s(e.element)}),r=i.height,a=i.width,f=this.getTargetBounds(),l=o+r,h=n+a,d=[];o<=f.bottom&&l>=f.top&&["left","right"].forEach(function(t){var e=f[t];(e===n||e===h)&&d.push(t)}),n<=f.right&&h>=f.left&&["top","bottom"].forEach(function(t){var e=f[t];(e===o||e===l)&&d.push(t)});var u=[],p=[],c=["left","top","right","bottom"];return u.push(this.getClass("abutted")),c.forEach(function(t){u.push(e.getClass("abutted")+"-"+t)}),d.length&&p.push(this.getClass("abutted")),d.forEach(function(t){p.push(e.getClass("abutted")+"-"+t)}),W(function(){e.options.addTargetClasses!==!1&&g(e.target,p,u),g(e.element,p,u)}),!0}});var k=function(){function t(t,e){var o=[],n=!0,i=!1,r=void 0;try{for(var s,a=t[Symbol.iterator]();!(n=(s=a.next()).done)&&(o.push(s.value),!e||o.length!==e);n=!0);}catch(f){i=!0,r=f}finally{try{!n&&a["return"]&&a["return"]()}finally{if(i)throw r}}return o}return function(e,o){if(Array.isArray(e))return e;if(Symbol.iterator in Object(e))return t(e,o);throw new TypeError("Invalid attempt to destructure non-iterable instance")}}();return E.modules.push({position:function(t){var e=t.top,o=t.left;if(this.options.shift){var n=this.options.shift;"function"==typeof this.options.shift&&(n=this.options.shift.call(this,{top:e,left:o}));var i=void 0,r=void 0;if("string"==typeof n){n=n.split(" "),n[1]=n[1]||n[0];var s=n,a=k(s,2);i=a[0],r=a[1],i=parseFloat(i,10),r=parseFloat(r,10)}else i=n.top,r=n.left;return e+=i,o+=r,{top:e,left:o}}}}),I}); \ No newline at end of file diff --git a/examples/element-scroll/index.html b/examples/element-scroll/index.html index 216138909..e93181aed 100644 --- a/examples/element-scroll/index.html +++ b/examples/element-scroll/index.html @@ -441,7 +441,7 @@ } - + diff --git a/index.html b/index.html index d77b9f91d..e9e0d6b6b 100644 --- a/index.html +++ b/index.html @@ -28,7 +28,7 @@
          -

          Tether

          A client-side library to make absolutely positioned elements attach to elements in the page efficiently.

          1.2.2

          +

          Tether

          A client-side library to make absolutely positioned elements attach to elements in the page efficiently.

          1.3.1

          From dd5da48a5f94bbe13648190437d4a96e8db01964 Mon Sep 17 00:00:00 2001 From: Nick Hwang Date: Mon, 25 Jul 2016 16:08:33 -0400 Subject: [PATCH 14/40] Rebuild docs --- advanced/embedding_tether/index.html | 4 +- advanced/extending_tether/index.html | 4 +- dist/css/tether-theme-arrows-dark.css | 48 ++++++--- dist/css/tether-theme-arrows-dark.min.css | 2 +- dist/css/tether-theme-arrows.css | 48 ++++++--- dist/css/tether-theme-arrows.min.css | 2 +- dist/js/tether.js | 100 ++++++++++++------ dist/js/tether.min.js | 2 +- docs/intro.html | 4 +- docs/welcome/js/jquery.js | 4 +- examples/chosen/chosen-sprite@2x.png | Bin 0 -> 738 bytes examples/list_of_examples/index.html | 4 +- examples/projects_using_tether/index.html | 4 +- examples/resources/js/jquery.js | 4 +- index.html | 4 +- overview/repositioning/index.html | 4 +- overview/why_we_dont_support_ie_8/index.html | 4 +- overview/why_you_should_use_tether/index.html | 4 +- 18 files changed, 158 insertions(+), 88 deletions(-) create mode 100644 examples/chosen/chosen-sprite@2x.png diff --git a/advanced/embedding_tether/index.html b/advanced/embedding_tether/index.html index 5428b4426..feddf0302 100644 --- a/advanced/embedding_tether/index.html +++ b/advanced/embedding_tether/index.html @@ -1,4 +1,4 @@ -Tether -

          Embedding Tether

          +

          Embedding Tether

          Tether is designed to be embeddable in other libraries.

          There is one thing you should think about doing to create an embedded Tether:

            diff --git a/advanced/extending_tether/index.html b/advanced/extending_tether/index.html index 165d8bcdd..05c271065 100644 --- a/advanced/extending_tether/index.html +++ b/advanced/extending_tether/index.html @@ -1,4 +1,4 @@ -Tether -

            Extending Tether

            +

            Extending Tether

            Tether has a module system which can be used to modify Tether's positioning, or just do something each time the Tether is moved.

            Tether has an array called Tether.modules, push onto it to add a module:

            Tether.modules.push
            diff --git a/dist/css/tether-theme-arrows-dark.css b/dist/css/tether-theme-arrows-dark.css
            index e44b0e8af..c000dd740 100644
            --- a/dist/css/tether-theme-arrows-dark.css
            +++ b/dist/css/tether-theme-arrows-dark.css
            @@ -34,28 +34,32 @@
                   top: 100%;
                   left: 50%;
                   margin-left: -16px;
            -      border-top-color: #000; }
            +      border-top-color: #000;
            +      border-bottom: 0; }
               .tether-element.tether-theme-arrows-dark.tether-element-attached-top.tether-element-attached-center .tether-content {
                 margin-top: 16px; }
                 .tether-element.tether-theme-arrows-dark.tether-element-attached-top.tether-element-attached-center .tether-content:before {
                   bottom: 100%;
                   left: 50%;
                   margin-left: -16px;
            -      border-bottom-color: #000; }
            +      border-bottom-color: #000;
            +      border-top: 0; }
               .tether-element.tether-theme-arrows-dark.tether-element-attached-right.tether-element-attached-middle .tether-content {
                 margin-right: 16px; }
                 .tether-element.tether-theme-arrows-dark.tether-element-attached-right.tether-element-attached-middle .tether-content:before {
                   left: 100%;
                   top: 50%;
                   margin-top: -16px;
            -      border-left-color: #000; }
            +      border-left-color: #000;
            +      border-right: 0; }
               .tether-element.tether-theme-arrows-dark.tether-element-attached-left.tether-element-attached-middle .tether-content {
                 margin-left: 16px; }
                 .tether-element.tether-theme-arrows-dark.tether-element-attached-left.tether-element-attached-middle .tether-content:before {
                   right: 100%;
                   top: 50%;
                   margin-top: -16px;
            -      border-right-color: #000; }
            +      border-right-color: #000;
            +      border-left: 0; }
               .tether-element.tether-theme-arrows-dark.tether-element-attached-left.tether-target-attached-center .tether-content {
                 left: -32px; }
               .tether-element.tether-theme-arrows-dark.tether-element-attached-right.tether-target-attached-center .tether-content {
            @@ -65,70 +69,82 @@
                 .tether-element.tether-theme-arrows-dark.tether-element-attached-top.tether-element-attached-left.tether-target-attached-middle .tether-content:before {
                   bottom: 100%;
                   left: 16px;
            -      border-bottom-color: #000; }
            +      border-bottom-color: #000;
            +      border-top: 0; }
               .tether-element.tether-theme-arrows-dark.tether-element-attached-top.tether-element-attached-right.tether-target-attached-middle .tether-content {
                 margin-top: 16px; }
                 .tether-element.tether-theme-arrows-dark.tether-element-attached-top.tether-element-attached-right.tether-target-attached-middle .tether-content:before {
                   bottom: 100%;
                   right: 16px;
            -      border-bottom-color: #000; }
            +      border-bottom-color: #000;
            +      border-top: 0; }
               .tether-element.tether-theme-arrows-dark.tether-element-attached-bottom.tether-element-attached-left.tether-target-attached-middle .tether-content {
                 margin-bottom: 16px; }
                 .tether-element.tether-theme-arrows-dark.tether-element-attached-bottom.tether-element-attached-left.tether-target-attached-middle .tether-content:before {
                   top: 100%;
                   left: 16px;
            -      border-top-color: #000; }
            +      border-top-color: #000;
            +      border-bottom: 0; }
               .tether-element.tether-theme-arrows-dark.tether-element-attached-bottom.tether-element-attached-right.tether-target-attached-middle .tether-content {
                 margin-bottom: 16px; }
                 .tether-element.tether-theme-arrows-dark.tether-element-attached-bottom.tether-element-attached-right.tether-target-attached-middle .tether-content:before {
                   top: 100%;
                   right: 16px;
            -      border-top-color: #000; }
            +      border-top-color: #000;
            +      border-bottom: 0; }
               .tether-element.tether-theme-arrows-dark.tether-element-attached-top.tether-element-attached-left.tether-target-attached-bottom .tether-content {
                 margin-top: 16px; }
                 .tether-element.tether-theme-arrows-dark.tether-element-attached-top.tether-element-attached-left.tether-target-attached-bottom .tether-content:before {
                   bottom: 100%;
                   left: 16px;
            -      border-bottom-color: #000; }
            +      border-bottom-color: #000;
            +      border-top: 0; }
               .tether-element.tether-theme-arrows-dark.tether-element-attached-top.tether-element-attached-right.tether-target-attached-bottom .tether-content {
                 margin-top: 16px; }
                 .tether-element.tether-theme-arrows-dark.tether-element-attached-top.tether-element-attached-right.tether-target-attached-bottom .tether-content:before {
                   bottom: 100%;
                   right: 16px;
            -      border-bottom-color: #000; }
            +      border-bottom-color: #000;
            +      border-top: 0; }
               .tether-element.tether-theme-arrows-dark.tether-element-attached-bottom.tether-element-attached-left.tether-target-attached-top .tether-content {
                 margin-bottom: 16px; }
                 .tether-element.tether-theme-arrows-dark.tether-element-attached-bottom.tether-element-attached-left.tether-target-attached-top .tether-content:before {
                   top: 100%;
                   left: 16px;
            -      border-top-color: #000; }
            +      border-top-color: #000;
            +      border-bottom: 0; }
               .tether-element.tether-theme-arrows-dark.tether-element-attached-bottom.tether-element-attached-right.tether-target-attached-top .tether-content {
                 margin-bottom: 16px; }
                 .tether-element.tether-theme-arrows-dark.tether-element-attached-bottom.tether-element-attached-right.tether-target-attached-top .tether-content:before {
                   top: 100%;
                   right: 16px;
            -      border-top-color: #000; }
            +      border-top-color: #000;
            +      border-bottom: 0; }
               .tether-element.tether-theme-arrows-dark.tether-element-attached-top.tether-element-attached-right.tether-target-attached-left .tether-content {
                 margin-right: 16px; }
                 .tether-element.tether-theme-arrows-dark.tether-element-attached-top.tether-element-attached-right.tether-target-attached-left .tether-content:before {
                   top: 16px;
                   left: 100%;
            -      border-left-color: #000; }
            +      border-left-color: #000;
            +      border-right: 0; }
               .tether-element.tether-theme-arrows-dark.tether-element-attached-top.tether-element-attached-left.tether-target-attached-right .tether-content {
                 margin-left: 16px; }
                 .tether-element.tether-theme-arrows-dark.tether-element-attached-top.tether-element-attached-left.tether-target-attached-right .tether-content:before {
                   top: 16px;
                   right: 100%;
            -      border-right-color: #000; }
            +      border-right-color: #000;
            +      border-left: 0; }
               .tether-element.tether-theme-arrows-dark.tether-element-attached-bottom.tether-element-attached-right.tether-target-attached-left .tether-content {
                 margin-right: 16px; }
                 .tether-element.tether-theme-arrows-dark.tether-element-attached-bottom.tether-element-attached-right.tether-target-attached-left .tether-content:before {
                   bottom: 16px;
                   left: 100%;
            -      border-left-color: #000; }
            +      border-left-color: #000;
            +      border-right: 0; }
               .tether-element.tether-theme-arrows-dark.tether-element-attached-bottom.tether-element-attached-left.tether-target-attached-right .tether-content {
                 margin-left: 16px; }
                 .tether-element.tether-theme-arrows-dark.tether-element-attached-bottom.tether-element-attached-left.tether-target-attached-right .tether-content:before {
                   bottom: 16px;
                   right: 100%;
            -      border-right-color: #000; }
            +      border-right-color: #000;
            +      border-left: 0; }
            diff --git a/dist/css/tether-theme-arrows-dark.min.css b/dist/css/tether-theme-arrows-dark.min.css
            index fd389a6f2..73d263e98 100644
            --- a/dist/css/tether-theme-arrows-dark.min.css
            +++ b/dist/css/tether-theme-arrows-dark.min.css
            @@ -1 +1 @@
            -.tether-element.tether-theme-arrows-dark.tether-element-attached-bottom.tether-element-attached-center .tether-content,.tether-element.tether-theme-arrows-dark.tether-element-attached-bottom.tether-element-attached-left.tether-target-attached-middle .tether-content,.tether-element.tether-theme-arrows-dark.tether-element-attached-bottom.tether-element-attached-left.tether-target-attached-top .tether-content,.tether-element.tether-theme-arrows-dark.tether-element-attached-bottom.tether-element-attached-right.tether-target-attached-middle .tether-content,.tether-element.tether-theme-arrows-dark.tether-element-attached-bottom.tether-element-attached-right.tether-target-attached-top .tether-content{margin-bottom:16px}.tether-element.tether-theme-arrows-dark.tether-element-attached-bottom.tether-element-attached-right.tether-target-attached-left .tether-content,.tether-element.tether-theme-arrows-dark.tether-element-attached-right.tether-element-attached-middle .tether-content,.tether-element.tether-theme-arrows-dark.tether-element-attached-top.tether-element-attached-right.tether-target-attached-left .tether-content{margin-right:16px}.tether-element,.tether-element *,.tether-element :after,.tether-element :before,.tether-element:after,.tether-element:before{box-sizing:border-box}.tether-element{position:absolute;display:none}.tether-element.tether-open{display:block}.tether-element.tether-theme-arrows-dark{max-width:100%;max-height:100%}.tether-element.tether-theme-arrows-dark .tether-content{border-radius:5px;position:relative;font-family:inherit;background:#000;color:#fff;padding:1em;font-size:1.1em;line-height:1.5em}.tether-element.tether-theme-arrows-dark .tether-content:before{content:"";display:block;position:absolute;width:0;height:0;border-color:transparent;border-width:16px;border-style:solid}.tether-element.tether-theme-arrows-dark.tether-element-attached-bottom.tether-element-attached-center .tether-content:before{top:100%;left:50%;margin-left:-16px;border-top-color:#000}.tether-element.tether-theme-arrows-dark.tether-element-attached-top.tether-element-attached-center .tether-content{margin-top:16px}.tether-element.tether-theme-arrows-dark.tether-element-attached-top.tether-element-attached-center .tether-content:before{bottom:100%;left:50%;margin-left:-16px;border-bottom-color:#000}.tether-element.tether-theme-arrows-dark.tether-element-attached-bottom.tether-element-attached-left.tether-target-attached-right .tether-content,.tether-element.tether-theme-arrows-dark.tether-element-attached-left.tether-element-attached-middle .tether-content,.tether-element.tether-theme-arrows-dark.tether-element-attached-top.tether-element-attached-left.tether-target-attached-right .tether-content{margin-left:16px}.tether-element.tether-theme-arrows-dark.tether-element-attached-right.tether-element-attached-middle .tether-content:before{left:100%;top:50%;margin-top:-16px;border-left-color:#000}.tether-element.tether-theme-arrows-dark.tether-element-attached-left.tether-element-attached-middle .tether-content:before{right:100%;top:50%;margin-top:-16px;border-right-color:#000}.tether-element.tether-theme-arrows-dark.tether-element-attached-top.tether-element-attached-left.tether-target-attached-bottom .tether-content,.tether-element.tether-theme-arrows-dark.tether-element-attached-top.tether-element-attached-left.tether-target-attached-middle .tether-content,.tether-element.tether-theme-arrows-dark.tether-element-attached-top.tether-element-attached-right.tether-target-attached-bottom .tether-content,.tether-element.tether-theme-arrows-dark.tether-element-attached-top.tether-element-attached-right.tether-target-attached-middle .tether-content{margin-top:16px}.tether-element.tether-theme-arrows-dark.tether-element-attached-left.tether-target-attached-center .tether-content{left:-32px}.tether-element.tether-theme-arrows-dark.tether-element-attached-right.tether-target-attached-center .tether-content{left:32px}.tether-element.tether-theme-arrows-dark.tether-element-attached-top.tether-element-attached-left.tether-target-attached-middle .tether-content:before{bottom:100%;left:16px;border-bottom-color:#000}.tether-element.tether-theme-arrows-dark.tether-element-attached-top.tether-element-attached-right.tether-target-attached-middle .tether-content:before{bottom:100%;right:16px;border-bottom-color:#000}.tether-element.tether-theme-arrows-dark.tether-element-attached-bottom.tether-element-attached-left.tether-target-attached-middle .tether-content:before{top:100%;left:16px;border-top-color:#000}.tether-element.tether-theme-arrows-dark.tether-element-attached-bottom.tether-element-attached-right.tether-target-attached-middle .tether-content:before{top:100%;right:16px;border-top-color:#000}.tether-element.tether-theme-arrows-dark.tether-element-attached-top.tether-element-attached-left.tether-target-attached-bottom .tether-content:before{bottom:100%;left:16px;border-bottom-color:#000}.tether-element.tether-theme-arrows-dark.tether-element-attached-top.tether-element-attached-right.tether-target-attached-bottom .tether-content:before{bottom:100%;right:16px;border-bottom-color:#000}.tether-element.tether-theme-arrows-dark.tether-element-attached-bottom.tether-element-attached-left.tether-target-attached-top .tether-content:before{top:100%;left:16px;border-top-color:#000}.tether-element.tether-theme-arrows-dark.tether-element-attached-bottom.tether-element-attached-right.tether-target-attached-top .tether-content:before{top:100%;right:16px;border-top-color:#000}.tether-element.tether-theme-arrows-dark.tether-element-attached-top.tether-element-attached-right.tether-target-attached-left .tether-content:before{top:16px;left:100%;border-left-color:#000}.tether-element.tether-theme-arrows-dark.tether-element-attached-top.tether-element-attached-left.tether-target-attached-right .tether-content:before{top:16px;right:100%;border-right-color:#000}.tether-element.tether-theme-arrows-dark.tether-element-attached-bottom.tether-element-attached-right.tether-target-attached-left .tether-content:before{bottom:16px;left:100%;border-left-color:#000}.tether-element.tether-theme-arrows-dark.tether-element-attached-bottom.tether-element-attached-left.tether-target-attached-right .tether-content:before{bottom:16px;right:100%;border-right-color:#000}
            \ No newline at end of file
            +.tether-element.tether-theme-arrows-dark.tether-element-attached-bottom.tether-element-attached-center .tether-content,.tether-element.tether-theme-arrows-dark.tether-element-attached-bottom.tether-element-attached-left.tether-target-attached-middle .tether-content,.tether-element.tether-theme-arrows-dark.tether-element-attached-bottom.tether-element-attached-left.tether-target-attached-top .tether-content,.tether-element.tether-theme-arrows-dark.tether-element-attached-bottom.tether-element-attached-right.tether-target-attached-middle .tether-content,.tether-element.tether-theme-arrows-dark.tether-element-attached-bottom.tether-element-attached-right.tether-target-attached-top .tether-content{margin-bottom:16px}.tether-element.tether-theme-arrows-dark.tether-element-attached-bottom.tether-element-attached-right.tether-target-attached-left .tether-content,.tether-element.tether-theme-arrows-dark.tether-element-attached-right.tether-element-attached-middle .tether-content,.tether-element.tether-theme-arrows-dark.tether-element-attached-top.tether-element-attached-right.tether-target-attached-left .tether-content{margin-right:16px}.tether-element,.tether-element *,.tether-element :after,.tether-element :before,.tether-element:after,.tether-element:before{box-sizing:border-box}.tether-element{position:absolute;display:none}.tether-element.tether-open{display:block}.tether-element.tether-theme-arrows-dark{max-width:100%;max-height:100%}.tether-element.tether-theme-arrows-dark .tether-content{border-radius:5px;position:relative;font-family:inherit;background:#000;color:#fff;padding:1em;font-size:1.1em;line-height:1.5em}.tether-element.tether-theme-arrows-dark .tether-content:before{content:"";display:block;position:absolute;width:0;height:0;border-color:transparent;border-width:16px;border-style:solid}.tether-element.tether-theme-arrows-dark.tether-element-attached-bottom.tether-element-attached-center .tether-content:before{top:100%;left:50%;margin-left:-16px;border-top-color:#000;border-bottom:0}.tether-element.tether-theme-arrows-dark.tether-element-attached-top.tether-element-attached-center .tether-content{margin-top:16px}.tether-element.tether-theme-arrows-dark.tether-element-attached-top.tether-element-attached-center .tether-content:before{bottom:100%;left:50%;margin-left:-16px;border-bottom-color:#000;border-top:0}.tether-element.tether-theme-arrows-dark.tether-element-attached-bottom.tether-element-attached-left.tether-target-attached-right .tether-content,.tether-element.tether-theme-arrows-dark.tether-element-attached-left.tether-element-attached-middle .tether-content,.tether-element.tether-theme-arrows-dark.tether-element-attached-top.tether-element-attached-left.tether-target-attached-right .tether-content{margin-left:16px}.tether-element.tether-theme-arrows-dark.tether-element-attached-right.tether-element-attached-middle .tether-content:before{left:100%;top:50%;margin-top:-16px;border-left-color:#000;border-right:0}.tether-element.tether-theme-arrows-dark.tether-element-attached-left.tether-element-attached-middle .tether-content:before{right:100%;top:50%;margin-top:-16px;border-right-color:#000;border-left:0}.tether-element.tether-theme-arrows-dark.tether-element-attached-top.tether-element-attached-left.tether-target-attached-bottom .tether-content,.tether-element.tether-theme-arrows-dark.tether-element-attached-top.tether-element-attached-left.tether-target-attached-middle .tether-content,.tether-element.tether-theme-arrows-dark.tether-element-attached-top.tether-element-attached-right.tether-target-attached-bottom .tether-content,.tether-element.tether-theme-arrows-dark.tether-element-attached-top.tether-element-attached-right.tether-target-attached-middle .tether-content{margin-top:16px}.tether-element.tether-theme-arrows-dark.tether-element-attached-left.tether-target-attached-center .tether-content{left:-32px}.tether-element.tether-theme-arrows-dark.tether-element-attached-right.tether-target-attached-center .tether-content{left:32px}.tether-element.tether-theme-arrows-dark.tether-element-attached-top.tether-element-attached-left.tether-target-attached-middle .tether-content:before{bottom:100%;left:16px;border-bottom-color:#000;border-top:0}.tether-element.tether-theme-arrows-dark.tether-element-attached-top.tether-element-attached-right.tether-target-attached-middle .tether-content:before{bottom:100%;right:16px;border-bottom-color:#000;border-top:0}.tether-element.tether-theme-arrows-dark.tether-element-attached-bottom.tether-element-attached-left.tether-target-attached-middle .tether-content:before{top:100%;left:16px;border-top-color:#000;border-bottom:0}.tether-element.tether-theme-arrows-dark.tether-element-attached-bottom.tether-element-attached-right.tether-target-attached-middle .tether-content:before{top:100%;right:16px;border-top-color:#000;border-bottom:0}.tether-element.tether-theme-arrows-dark.tether-element-attached-top.tether-element-attached-left.tether-target-attached-bottom .tether-content:before{bottom:100%;left:16px;border-bottom-color:#000;border-top:0}.tether-element.tether-theme-arrows-dark.tether-element-attached-top.tether-element-attached-right.tether-target-attached-bottom .tether-content:before{bottom:100%;right:16px;border-bottom-color:#000;border-top:0}.tether-element.tether-theme-arrows-dark.tether-element-attached-bottom.tether-element-attached-left.tether-target-attached-top .tether-content:before{top:100%;left:16px;border-top-color:#000;border-bottom:0}.tether-element.tether-theme-arrows-dark.tether-element-attached-bottom.tether-element-attached-right.tether-target-attached-top .tether-content:before{top:100%;right:16px;border-top-color:#000;border-bottom:0}.tether-element.tether-theme-arrows-dark.tether-element-attached-top.tether-element-attached-right.tether-target-attached-left .tether-content:before{top:16px;left:100%;border-left-color:#000;border-right:0}.tether-element.tether-theme-arrows-dark.tether-element-attached-top.tether-element-attached-left.tether-target-attached-right .tether-content:before{top:16px;right:100%;border-right-color:#000;border-left:0}.tether-element.tether-theme-arrows-dark.tether-element-attached-bottom.tether-element-attached-right.tether-target-attached-left .tether-content:before{bottom:16px;left:100%;border-left-color:#000;border-right:0}.tether-element.tether-theme-arrows-dark.tether-element-attached-bottom.tether-element-attached-left.tether-target-attached-right .tether-content:before{bottom:16px;right:100%;border-right-color:#000;border-left:0}
            \ No newline at end of file
            diff --git a/dist/css/tether-theme-arrows.css b/dist/css/tether-theme-arrows.css
            index 6f9549289..e9e3bbfab 100644
            --- a/dist/css/tether-theme-arrows.css
            +++ b/dist/css/tether-theme-arrows.css
            @@ -38,28 +38,32 @@
                   top: 100%;
                   left: 50%;
                   margin-left: -16px;
            -      border-top-color: #fff; }
            +      border-top-color: #fff;
            +      border-bottom: 0; }
               .tether-element.tether-theme-arrows.tether-element-attached-top.tether-element-attached-center .tether-content {
                 margin-top: 16px; }
                 .tether-element.tether-theme-arrows.tether-element-attached-top.tether-element-attached-center .tether-content:before {
                   bottom: 100%;
                   left: 50%;
                   margin-left: -16px;
            -      border-bottom-color: #fff; }
            +      border-bottom-color: #fff;
            +      border-top: 0; }
               .tether-element.tether-theme-arrows.tether-element-attached-right.tether-element-attached-middle .tether-content {
                 margin-right: 16px; }
                 .tether-element.tether-theme-arrows.tether-element-attached-right.tether-element-attached-middle .tether-content:before {
                   left: 100%;
                   top: 50%;
                   margin-top: -16px;
            -      border-left-color: #fff; }
            +      border-left-color: #fff;
            +      border-right: 0; }
               .tether-element.tether-theme-arrows.tether-element-attached-left.tether-element-attached-middle .tether-content {
                 margin-left: 16px; }
                 .tether-element.tether-theme-arrows.tether-element-attached-left.tether-element-attached-middle .tether-content:before {
                   right: 100%;
                   top: 50%;
                   margin-top: -16px;
            -      border-right-color: #fff; }
            +      border-right-color: #fff;
            +      border-left: 0; }
               .tether-element.tether-theme-arrows.tether-element-attached-left.tether-target-attached-center .tether-content {
                 left: -32px; }
               .tether-element.tether-theme-arrows.tether-element-attached-right.tether-target-attached-center .tether-content {
            @@ -69,70 +73,82 @@
                 .tether-element.tether-theme-arrows.tether-element-attached-top.tether-element-attached-left.tether-target-attached-middle .tether-content:before {
                   bottom: 100%;
                   left: 16px;
            -      border-bottom-color: #fff; }
            +      border-bottom-color: #fff;
            +      border-top: 0; }
               .tether-element.tether-theme-arrows.tether-element-attached-top.tether-element-attached-right.tether-target-attached-middle .tether-content {
                 margin-top: 16px; }
                 .tether-element.tether-theme-arrows.tether-element-attached-top.tether-element-attached-right.tether-target-attached-middle .tether-content:before {
                   bottom: 100%;
                   right: 16px;
            -      border-bottom-color: #fff; }
            +      border-bottom-color: #fff;
            +      border-top: 0; }
               .tether-element.tether-theme-arrows.tether-element-attached-bottom.tether-element-attached-left.tether-target-attached-middle .tether-content {
                 margin-bottom: 16px; }
                 .tether-element.tether-theme-arrows.tether-element-attached-bottom.tether-element-attached-left.tether-target-attached-middle .tether-content:before {
                   top: 100%;
                   left: 16px;
            -      border-top-color: #fff; }
            +      border-top-color: #fff;
            +      border-bottom: 0; }
               .tether-element.tether-theme-arrows.tether-element-attached-bottom.tether-element-attached-right.tether-target-attached-middle .tether-content {
                 margin-bottom: 16px; }
                 .tether-element.tether-theme-arrows.tether-element-attached-bottom.tether-element-attached-right.tether-target-attached-middle .tether-content:before {
                   top: 100%;
                   right: 16px;
            -      border-top-color: #fff; }
            +      border-top-color: #fff;
            +      border-bottom: 0; }
               .tether-element.tether-theme-arrows.tether-element-attached-top.tether-element-attached-left.tether-target-attached-bottom .tether-content {
                 margin-top: 16px; }
                 .tether-element.tether-theme-arrows.tether-element-attached-top.tether-element-attached-left.tether-target-attached-bottom .tether-content:before {
                   bottom: 100%;
                   left: 16px;
            -      border-bottom-color: #fff; }
            +      border-bottom-color: #fff;
            +      border-top: 0; }
               .tether-element.tether-theme-arrows.tether-element-attached-top.tether-element-attached-right.tether-target-attached-bottom .tether-content {
                 margin-top: 16px; }
                 .tether-element.tether-theme-arrows.tether-element-attached-top.tether-element-attached-right.tether-target-attached-bottom .tether-content:before {
                   bottom: 100%;
                   right: 16px;
            -      border-bottom-color: #fff; }
            +      border-bottom-color: #fff;
            +      border-top: 0; }
               .tether-element.tether-theme-arrows.tether-element-attached-bottom.tether-element-attached-left.tether-target-attached-top .tether-content {
                 margin-bottom: 16px; }
                 .tether-element.tether-theme-arrows.tether-element-attached-bottom.tether-element-attached-left.tether-target-attached-top .tether-content:before {
                   top: 100%;
                   left: 16px;
            -      border-top-color: #fff; }
            +      border-top-color: #fff;
            +      border-bottom: 0; }
               .tether-element.tether-theme-arrows.tether-element-attached-bottom.tether-element-attached-right.tether-target-attached-top .tether-content {
                 margin-bottom: 16px; }
                 .tether-element.tether-theme-arrows.tether-element-attached-bottom.tether-element-attached-right.tether-target-attached-top .tether-content:before {
                   top: 100%;
                   right: 16px;
            -      border-top-color: #fff; }
            +      border-top-color: #fff;
            +      border-bottom: 0; }
               .tether-element.tether-theme-arrows.tether-element-attached-top.tether-element-attached-right.tether-target-attached-left .tether-content {
                 margin-right: 16px; }
                 .tether-element.tether-theme-arrows.tether-element-attached-top.tether-element-attached-right.tether-target-attached-left .tether-content:before {
                   top: 16px;
                   left: 100%;
            -      border-left-color: #fff; }
            +      border-left-color: #fff;
            +      border-right: 0; }
               .tether-element.tether-theme-arrows.tether-element-attached-top.tether-element-attached-left.tether-target-attached-right .tether-content {
                 margin-left: 16px; }
                 .tether-element.tether-theme-arrows.tether-element-attached-top.tether-element-attached-left.tether-target-attached-right .tether-content:before {
                   top: 16px;
                   right: 100%;
            -      border-right-color: #fff; }
            +      border-right-color: #fff;
            +      border-left: 0; }
               .tether-element.tether-theme-arrows.tether-element-attached-bottom.tether-element-attached-right.tether-target-attached-left .tether-content {
                 margin-right: 16px; }
                 .tether-element.tether-theme-arrows.tether-element-attached-bottom.tether-element-attached-right.tether-target-attached-left .tether-content:before {
                   bottom: 16px;
                   left: 100%;
            -      border-left-color: #fff; }
            +      border-left-color: #fff;
            +      border-right: 0; }
               .tether-element.tether-theme-arrows.tether-element-attached-bottom.tether-element-attached-left.tether-target-attached-right .tether-content {
                 margin-left: 16px; }
                 .tether-element.tether-theme-arrows.tether-element-attached-bottom.tether-element-attached-left.tether-target-attached-right .tether-content:before {
                   bottom: 16px;
                   right: 100%;
            -      border-right-color: #fff; }
            +      border-right-color: #fff;
            +      border-left: 0; }
            diff --git a/dist/css/tether-theme-arrows.min.css b/dist/css/tether-theme-arrows.min.css
            index 19f0a902d..61994a9c4 100644
            --- a/dist/css/tether-theme-arrows.min.css
            +++ b/dist/css/tether-theme-arrows.min.css
            @@ -1 +1 @@
            -.tether-element.tether-theme-arrows.tether-element-attached-bottom.tether-element-attached-center .tether-content,.tether-element.tether-theme-arrows.tether-element-attached-bottom.tether-element-attached-left.tether-target-attached-middle .tether-content,.tether-element.tether-theme-arrows.tether-element-attached-bottom.tether-element-attached-left.tether-target-attached-top .tether-content,.tether-element.tether-theme-arrows.tether-element-attached-bottom.tether-element-attached-right.tether-target-attached-middle .tether-content,.tether-element.tether-theme-arrows.tether-element-attached-bottom.tether-element-attached-right.tether-target-attached-top .tether-content{margin-bottom:16px}.tether-element.tether-theme-arrows.tether-element-attached-bottom.tether-element-attached-right.tether-target-attached-left .tether-content,.tether-element.tether-theme-arrows.tether-element-attached-right.tether-element-attached-middle .tether-content,.tether-element.tether-theme-arrows.tether-element-attached-top.tether-element-attached-right.tether-target-attached-left .tether-content{margin-right:16px}.tether-element,.tether-element *,.tether-element :after,.tether-element :before,.tether-element:after,.tether-element:before{box-sizing:border-box}.tether-element{position:absolute;display:none}.tether-element.tether-open{display:block}.tether-element.tether-theme-arrows{max-width:100%;max-height:100%}.tether-element.tether-theme-arrows .tether-content{border-radius:5px;position:relative;font-family:inherit;background:#fff;color:inherit;padding:1em;font-size:1.1em;line-height:1.5em;-webkit-transform:translateZ(0);transform:translateZ(0);-webkit-filter:drop-shadow(0 1px 4px rgba(0, 0, 0, .2));filter:drop-shadow(0 1px 4px rgba(0, 0, 0, .2))}.tether-element.tether-theme-arrows .tether-content:before{content:"";display:block;position:absolute;width:0;height:0;border-color:transparent;border-width:16px;border-style:solid}.tether-element.tether-theme-arrows.tether-element-attached-bottom.tether-element-attached-center .tether-content:before{top:100%;left:50%;margin-left:-16px;border-top-color:#fff}.tether-element.tether-theme-arrows.tether-element-attached-top.tether-element-attached-center .tether-content{margin-top:16px}.tether-element.tether-theme-arrows.tether-element-attached-top.tether-element-attached-center .tether-content:before{bottom:100%;left:50%;margin-left:-16px;border-bottom-color:#fff}.tether-element.tether-theme-arrows.tether-element-attached-bottom.tether-element-attached-left.tether-target-attached-right .tether-content,.tether-element.tether-theme-arrows.tether-element-attached-left.tether-element-attached-middle .tether-content,.tether-element.tether-theme-arrows.tether-element-attached-top.tether-element-attached-left.tether-target-attached-right .tether-content{margin-left:16px}.tether-element.tether-theme-arrows.tether-element-attached-right.tether-element-attached-middle .tether-content:before{left:100%;top:50%;margin-top:-16px;border-left-color:#fff}.tether-element.tether-theme-arrows.tether-element-attached-left.tether-element-attached-middle .tether-content:before{right:100%;top:50%;margin-top:-16px;border-right-color:#fff}.tether-element.tether-theme-arrows.tether-element-attached-top.tether-element-attached-left.tether-target-attached-bottom .tether-content,.tether-element.tether-theme-arrows.tether-element-attached-top.tether-element-attached-left.tether-target-attached-middle .tether-content,.tether-element.tether-theme-arrows.tether-element-attached-top.tether-element-attached-right.tether-target-attached-bottom .tether-content,.tether-element.tether-theme-arrows.tether-element-attached-top.tether-element-attached-right.tether-target-attached-middle .tether-content{margin-top:16px}.tether-element.tether-theme-arrows.tether-element-attached-left.tether-target-attached-center .tether-content{left:-32px}.tether-element.tether-theme-arrows.tether-element-attached-right.tether-target-attached-center .tether-content{left:32px}.tether-element.tether-theme-arrows.tether-element-attached-top.tether-element-attached-left.tether-target-attached-middle .tether-content:before{bottom:100%;left:16px;border-bottom-color:#fff}.tether-element.tether-theme-arrows.tether-element-attached-top.tether-element-attached-right.tether-target-attached-middle .tether-content:before{bottom:100%;right:16px;border-bottom-color:#fff}.tether-element.tether-theme-arrows.tether-element-attached-bottom.tether-element-attached-left.tether-target-attached-middle .tether-content:before{top:100%;left:16px;border-top-color:#fff}.tether-element.tether-theme-arrows.tether-element-attached-bottom.tether-element-attached-right.tether-target-attached-middle .tether-content:before{top:100%;right:16px;border-top-color:#fff}.tether-element.tether-theme-arrows.tether-element-attached-top.tether-element-attached-left.tether-target-attached-bottom .tether-content:before{bottom:100%;left:16px;border-bottom-color:#fff}.tether-element.tether-theme-arrows.tether-element-attached-top.tether-element-attached-right.tether-target-attached-bottom .tether-content:before{bottom:100%;right:16px;border-bottom-color:#fff}.tether-element.tether-theme-arrows.tether-element-attached-bottom.tether-element-attached-left.tether-target-attached-top .tether-content:before{top:100%;left:16px;border-top-color:#fff}.tether-element.tether-theme-arrows.tether-element-attached-bottom.tether-element-attached-right.tether-target-attached-top .tether-content:before{top:100%;right:16px;border-top-color:#fff}.tether-element.tether-theme-arrows.tether-element-attached-top.tether-element-attached-right.tether-target-attached-left .tether-content:before{top:16px;left:100%;border-left-color:#fff}.tether-element.tether-theme-arrows.tether-element-attached-top.tether-element-attached-left.tether-target-attached-right .tether-content:before{top:16px;right:100%;border-right-color:#fff}.tether-element.tether-theme-arrows.tether-element-attached-bottom.tether-element-attached-right.tether-target-attached-left .tether-content:before{bottom:16px;left:100%;border-left-color:#fff}.tether-element.tether-theme-arrows.tether-element-attached-bottom.tether-element-attached-left.tether-target-attached-right .tether-content:before{bottom:16px;right:100%;border-right-color:#fff}
            \ No newline at end of file
            +.tether-element.tether-theme-arrows.tether-element-attached-bottom.tether-element-attached-center .tether-content,.tether-element.tether-theme-arrows.tether-element-attached-bottom.tether-element-attached-left.tether-target-attached-middle .tether-content,.tether-element.tether-theme-arrows.tether-element-attached-bottom.tether-element-attached-left.tether-target-attached-top .tether-content,.tether-element.tether-theme-arrows.tether-element-attached-bottom.tether-element-attached-right.tether-target-attached-middle .tether-content,.tether-element.tether-theme-arrows.tether-element-attached-bottom.tether-element-attached-right.tether-target-attached-top .tether-content{margin-bottom:16px}.tether-element.tether-theme-arrows.tether-element-attached-bottom.tether-element-attached-right.tether-target-attached-left .tether-content,.tether-element.tether-theme-arrows.tether-element-attached-right.tether-element-attached-middle .tether-content,.tether-element.tether-theme-arrows.tether-element-attached-top.tether-element-attached-right.tether-target-attached-left .tether-content{margin-right:16px}.tether-element,.tether-element *,.tether-element :after,.tether-element :before,.tether-element:after,.tether-element:before{box-sizing:border-box}.tether-element{position:absolute;display:none}.tether-element.tether-open{display:block}.tether-element.tether-theme-arrows{max-width:100%;max-height:100%}.tether-element.tether-theme-arrows .tether-content{border-radius:5px;position:relative;font-family:inherit;background:#fff;color:inherit;padding:1em;font-size:1.1em;line-height:1.5em;-webkit-transform:translateZ(0);transform:translateZ(0);-webkit-filter:drop-shadow(0 1px 4px rgba(0, 0, 0, .2));filter:drop-shadow(0 1px 4px rgba(0, 0, 0, .2))}.tether-element.tether-theme-arrows .tether-content:before{content:"";display:block;position:absolute;width:0;height:0;border-color:transparent;border-width:16px;border-style:solid}.tether-element.tether-theme-arrows.tether-element-attached-bottom.tether-element-attached-center .tether-content:before{top:100%;left:50%;margin-left:-16px;border-top-color:#fff;border-bottom:0}.tether-element.tether-theme-arrows.tether-element-attached-top.tether-element-attached-center .tether-content{margin-top:16px}.tether-element.tether-theme-arrows.tether-element-attached-top.tether-element-attached-center .tether-content:before{bottom:100%;left:50%;margin-left:-16px;border-bottom-color:#fff;border-top:0}.tether-element.tether-theme-arrows.tether-element-attached-bottom.tether-element-attached-left.tether-target-attached-right .tether-content,.tether-element.tether-theme-arrows.tether-element-attached-left.tether-element-attached-middle .tether-content,.tether-element.tether-theme-arrows.tether-element-attached-top.tether-element-attached-left.tether-target-attached-right .tether-content{margin-left:16px}.tether-element.tether-theme-arrows.tether-element-attached-right.tether-element-attached-middle .tether-content:before{left:100%;top:50%;margin-top:-16px;border-left-color:#fff;border-right:0}.tether-element.tether-theme-arrows.tether-element-attached-left.tether-element-attached-middle .tether-content:before{right:100%;top:50%;margin-top:-16px;border-right-color:#fff;border-left:0}.tether-element.tether-theme-arrows.tether-element-attached-top.tether-element-attached-left.tether-target-attached-bottom .tether-content,.tether-element.tether-theme-arrows.tether-element-attached-top.tether-element-attached-left.tether-target-attached-middle .tether-content,.tether-element.tether-theme-arrows.tether-element-attached-top.tether-element-attached-right.tether-target-attached-bottom .tether-content,.tether-element.tether-theme-arrows.tether-element-attached-top.tether-element-attached-right.tether-target-attached-middle .tether-content{margin-top:16px}.tether-element.tether-theme-arrows.tether-element-attached-left.tether-target-attached-center .tether-content{left:-32px}.tether-element.tether-theme-arrows.tether-element-attached-right.tether-target-attached-center .tether-content{left:32px}.tether-element.tether-theme-arrows.tether-element-attached-top.tether-element-attached-left.tether-target-attached-middle .tether-content:before{bottom:100%;left:16px;border-bottom-color:#fff;border-top:0}.tether-element.tether-theme-arrows.tether-element-attached-top.tether-element-attached-right.tether-target-attached-middle .tether-content:before{bottom:100%;right:16px;border-bottom-color:#fff;border-top:0}.tether-element.tether-theme-arrows.tether-element-attached-bottom.tether-element-attached-left.tether-target-attached-middle .tether-content:before{top:100%;left:16px;border-top-color:#fff;border-bottom:0}.tether-element.tether-theme-arrows.tether-element-attached-bottom.tether-element-attached-right.tether-target-attached-middle .tether-content:before{top:100%;right:16px;border-top-color:#fff;border-bottom:0}.tether-element.tether-theme-arrows.tether-element-attached-top.tether-element-attached-left.tether-target-attached-bottom .tether-content:before{bottom:100%;left:16px;border-bottom-color:#fff;border-top:0}.tether-element.tether-theme-arrows.tether-element-attached-top.tether-element-attached-right.tether-target-attached-bottom .tether-content:before{bottom:100%;right:16px;border-bottom-color:#fff;border-top:0}.tether-element.tether-theme-arrows.tether-element-attached-bottom.tether-element-attached-left.tether-target-attached-top .tether-content:before{top:100%;left:16px;border-top-color:#fff;border-bottom:0}.tether-element.tether-theme-arrows.tether-element-attached-bottom.tether-element-attached-right.tether-target-attached-top .tether-content:before{top:100%;right:16px;border-top-color:#fff;border-bottom:0}.tether-element.tether-theme-arrows.tether-element-attached-top.tether-element-attached-right.tether-target-attached-left .tether-content:before{top:16px;left:100%;border-left-color:#fff;border-right:0}.tether-element.tether-theme-arrows.tether-element-attached-top.tether-element-attached-left.tether-target-attached-right .tether-content:before{top:16px;right:100%;border-right-color:#fff;border-left:0}.tether-element.tether-theme-arrows.tether-element-attached-bottom.tether-element-attached-right.tether-target-attached-left .tether-content:before{bottom:16px;left:100%;border-left-color:#fff;border-right:0}.tether-element.tether-theme-arrows.tether-element-attached-bottom.tether-element-attached-left.tether-target-attached-right .tether-content:before{bottom:16px;right:100%;border-right-color:#fff;border-left:0}
            \ No newline at end of file
            diff --git a/dist/js/tether.js b/dist/js/tether.js
            index 5176a7786..f61b90ed7 100644
            --- a/dist/js/tether.js
            +++ b/dist/js/tether.js
            @@ -1,4 +1,4 @@
            -/*! tether 1.3.0 */
            +/*! tether 1.3.3 */
             
             (function(root, factory) {
               if (typeof define === 'function' && define.amd) {
            @@ -23,6 +23,32 @@ if (typeof TetherBase === 'undefined') {
             
             var zeroElement = null;
             
            +// Same as native getBoundingClientRect, except it takes into account parent  offsets
            +// if the element lies within a nested document ( or 

            +

            Tether

            A client-side library to make absolutely positioned elements attach to elements in the page efficiently.

            1.3.3

            diff --git a/overview/repositioning/index.html b/overview/repositioning/index.html index f3be63046..adb9b2505 100644 --- a/overview/repositioning/index.html +++ b/overview/repositioning/index.html @@ -1,4 +1,4 @@ -Tether -

            Repositioning

            +

            Repositioning

            Tethers will be automatically repositioned when the page is resized, and when any element containing the Tether is scrolled. If the element moves for some other reason (e.g. with JavaScript), Tether won't know to reposition the element.

            Manually Repositioning

            diff --git a/overview/why_we_dont_support_ie_8/index.html b/overview/why_we_dont_support_ie_8/index.html index 4253154aa..4fef63cf2 100644 --- a/overview/why_we_dont_support_ie_8/index.html +++ b/overview/why_we_dont_support_ie_8/index.html @@ -1,4 +1,4 @@ -Tether -

            Why we don't support IE 8

            +

            Why we don't support IE 8

            We've been living in 2007 for a while now, pretending that new browser features don't exist because they aren't in IE8. You might not even know about some of these features, or think they are only enabled by jQuery or underscore, simply because it hasn't diff --git a/overview/why_you_should_use_tether/index.html b/overview/why_you_should_use_tether/index.html index faa96a403..5a3f7cf93 100644 --- a/overview/why_you_should_use_tether/index.html +++ b/overview/why_you_should_use_tether/index.html @@ -1,4 +1,4 @@ -Tether

            -

            Why You Should Use Tether

            +

            Why You Should Use Tether

            Virtually every app includes some sort of overlay attached to an element on the page. Things like tooltips, dropdowns, hover-activated info boxes, etc.

            From 493ee96a43acc975f52bc9cd8df318850d788413 Mon Sep 17 00:00:00 2001 From: Robert Wagner Date: Tue, 17 Sep 2019 23:35:31 -0400 Subject: [PATCH 15/40] Rebuild docs --- advanced/embedding_tether/index.html | 4 +- advanced/extending_tether/index.html | 4 +- dist/css/tether-theme-arrows-dark.css | 326 ++- dist/css/tether-theme-arrows-dark.min.css | 2 +- dist/css/tether-theme-arrows.css | 332 ++- dist/css/tether-theme-arrows.min.css | 2 +- dist/css/tether-theme-basic.css | 33 +- dist/css/tether-theme-basic.min.css | 2 +- dist/css/tether.css | 11 +- dist/css/tether.min.css | 2 +- dist/js/tether.esm.js | 1799 ++++++++++++ dist/js/tether.esm.min.js | 4 + dist/js/tether.js | 2437 +++++++++-------- dist/js/tether.min.js | 5 +- docs/intro.html | 4 +- examples/content-visible/index.html | 2 +- examples/dolls/index.html | 2 +- examples/element-scroll/index.html | 2 +- examples/enable-disable/index.html | 2 +- examples/list_of_examples/index.html | 4 +- examples/out-of-bounds/index.html | 2 +- examples/pin/index.html | 2 +- examples/projects_using_tether/index.html | 24 +- examples/scroll/index.html | 4 +- examples/simple/index.html | 2 +- examples/testbed/index.html | 2 +- examples/viewport/index.html | 2 +- index.html | 4 +- overview/repositioning/index.html | 4 +- overview/why_we_dont_support_ie_8/index.html | 6 +- overview/why_you_should_use_tether/index.html | 4 +- resources/templates/base.jade | 2 +- 32 files changed, 3475 insertions(+), 1562 deletions(-) create mode 100644 dist/js/tether.esm.js create mode 100644 dist/js/tether.esm.min.js diff --git a/advanced/embedding_tether/index.html b/advanced/embedding_tether/index.html index feddf0302..c51609265 100644 --- a/advanced/embedding_tether/index.html +++ b/advanced/embedding_tether/index.html @@ -1,4 +1,4 @@ -Tether -

            Embedding Tether

            +

            Embedding Tether

            Tether is designed to be embeddable in other libraries.

            There is one thing you should think about doing to create an embedded Tether:

              diff --git a/advanced/extending_tether/index.html b/advanced/extending_tether/index.html index 05c271065..afaba4621 100644 --- a/advanced/extending_tether/index.html +++ b/advanced/extending_tether/index.html @@ -1,4 +1,4 @@ -Tether -

              Extending Tether

              +

              Extending Tether

              Tether has a module system which can be used to modify Tether's positioning, or just do something each time the Tether is moved.

              Tether has an array called Tether.modules, push onto it to add a module:

              Tether.modules.push
              diff --git a/dist/css/tether-theme-arrows-dark.css b/dist/css/tether-theme-arrows-dark.css
              index c000dd740..0ac6b5abe 100644
              --- a/dist/css/tether-theme-arrows-dark.css
              +++ b/dist/css/tether-theme-arrows-dark.css
              @@ -1,150 +1,190 @@
               .tether-element, .tether-element:after, .tether-element:before, .tether-element *, .tether-element *:after, .tether-element *:before {
              -  box-sizing: border-box; }
              +  box-sizing: border-box;
              +}
               
               .tether-element {
                 position: absolute;
              -  display: none; }
              -  .tether-element.tether-open {
              -    display: block; }
              +  display: none;
              +}
              +.tether-element.tether-open {
              +  display: block;
              +}
               
               .tether-element.tether-theme-arrows-dark {
                 max-width: 100%;
              -  max-height: 100%; }
              -  .tether-element.tether-theme-arrows-dark .tether-content {
              -    border-radius: 5px;
              -    position: relative;
              -    font-family: inherit;
              -    background: #000;
              -    color: #fff;
              -    padding: 1em;
              -    font-size: 1.1em;
              -    line-height: 1.5em; }
              -    .tether-element.tether-theme-arrows-dark .tether-content:before {
              -      content: "";
              -      display: block;
              -      position: absolute;
              -      width: 0;
              -      height: 0;
              -      border-color: transparent;
              -      border-width: 16px;
              -      border-style: solid; }
              -  .tether-element.tether-theme-arrows-dark.tether-element-attached-bottom.tether-element-attached-center .tether-content {
              -    margin-bottom: 16px; }
              -    .tether-element.tether-theme-arrows-dark.tether-element-attached-bottom.tether-element-attached-center .tether-content:before {
              -      top: 100%;
              -      left: 50%;
              -      margin-left: -16px;
              -      border-top-color: #000;
              -      border-bottom: 0; }
              -  .tether-element.tether-theme-arrows-dark.tether-element-attached-top.tether-element-attached-center .tether-content {
              -    margin-top: 16px; }
              -    .tether-element.tether-theme-arrows-dark.tether-element-attached-top.tether-element-attached-center .tether-content:before {
              -      bottom: 100%;
              -      left: 50%;
              -      margin-left: -16px;
              -      border-bottom-color: #000;
              -      border-top: 0; }
              -  .tether-element.tether-theme-arrows-dark.tether-element-attached-right.tether-element-attached-middle .tether-content {
              -    margin-right: 16px; }
              -    .tether-element.tether-theme-arrows-dark.tether-element-attached-right.tether-element-attached-middle .tether-content:before {
              -      left: 100%;
              -      top: 50%;
              -      margin-top: -16px;
              -      border-left-color: #000;
              -      border-right: 0; }
              -  .tether-element.tether-theme-arrows-dark.tether-element-attached-left.tether-element-attached-middle .tether-content {
              -    margin-left: 16px; }
              -    .tether-element.tether-theme-arrows-dark.tether-element-attached-left.tether-element-attached-middle .tether-content:before {
              -      right: 100%;
              -      top: 50%;
              -      margin-top: -16px;
              -      border-right-color: #000;
              -      border-left: 0; }
              -  .tether-element.tether-theme-arrows-dark.tether-element-attached-left.tether-target-attached-center .tether-content {
              -    left: -32px; }
              -  .tether-element.tether-theme-arrows-dark.tether-element-attached-right.tether-target-attached-center .tether-content {
              -    left: 32px; }
              -  .tether-element.tether-theme-arrows-dark.tether-element-attached-top.tether-element-attached-left.tether-target-attached-middle .tether-content {
              -    margin-top: 16px; }
              -    .tether-element.tether-theme-arrows-dark.tether-element-attached-top.tether-element-attached-left.tether-target-attached-middle .tether-content:before {
              -      bottom: 100%;
              -      left: 16px;
              -      border-bottom-color: #000;
              -      border-top: 0; }
              -  .tether-element.tether-theme-arrows-dark.tether-element-attached-top.tether-element-attached-right.tether-target-attached-middle .tether-content {
              -    margin-top: 16px; }
              -    .tether-element.tether-theme-arrows-dark.tether-element-attached-top.tether-element-attached-right.tether-target-attached-middle .tether-content:before {
              -      bottom: 100%;
              -      right: 16px;
              -      border-bottom-color: #000;
              -      border-top: 0; }
              -  .tether-element.tether-theme-arrows-dark.tether-element-attached-bottom.tether-element-attached-left.tether-target-attached-middle .tether-content {
              -    margin-bottom: 16px; }
              -    .tether-element.tether-theme-arrows-dark.tether-element-attached-bottom.tether-element-attached-left.tether-target-attached-middle .tether-content:before {
              -      top: 100%;
              -      left: 16px;
              -      border-top-color: #000;
              -      border-bottom: 0; }
              -  .tether-element.tether-theme-arrows-dark.tether-element-attached-bottom.tether-element-attached-right.tether-target-attached-middle .tether-content {
              -    margin-bottom: 16px; }
              -    .tether-element.tether-theme-arrows-dark.tether-element-attached-bottom.tether-element-attached-right.tether-target-attached-middle .tether-content:before {
              -      top: 100%;
              -      right: 16px;
              -      border-top-color: #000;
              -      border-bottom: 0; }
              -  .tether-element.tether-theme-arrows-dark.tether-element-attached-top.tether-element-attached-left.tether-target-attached-bottom .tether-content {
              -    margin-top: 16px; }
              -    .tether-element.tether-theme-arrows-dark.tether-element-attached-top.tether-element-attached-left.tether-target-attached-bottom .tether-content:before {
              -      bottom: 100%;
              -      left: 16px;
              -      border-bottom-color: #000;
              -      border-top: 0; }
              -  .tether-element.tether-theme-arrows-dark.tether-element-attached-top.tether-element-attached-right.tether-target-attached-bottom .tether-content {
              -    margin-top: 16px; }
              -    .tether-element.tether-theme-arrows-dark.tether-element-attached-top.tether-element-attached-right.tether-target-attached-bottom .tether-content:before {
              -      bottom: 100%;
              -      right: 16px;
              -      border-bottom-color: #000;
              -      border-top: 0; }
              -  .tether-element.tether-theme-arrows-dark.tether-element-attached-bottom.tether-element-attached-left.tether-target-attached-top .tether-content {
              -    margin-bottom: 16px; }
              -    .tether-element.tether-theme-arrows-dark.tether-element-attached-bottom.tether-element-attached-left.tether-target-attached-top .tether-content:before {
              -      top: 100%;
              -      left: 16px;
              -      border-top-color: #000;
              -      border-bottom: 0; }
              -  .tether-element.tether-theme-arrows-dark.tether-element-attached-bottom.tether-element-attached-right.tether-target-attached-top .tether-content {
              -    margin-bottom: 16px; }
              -    .tether-element.tether-theme-arrows-dark.tether-element-attached-bottom.tether-element-attached-right.tether-target-attached-top .tether-content:before {
              -      top: 100%;
              -      right: 16px;
              -      border-top-color: #000;
              -      border-bottom: 0; }
              -  .tether-element.tether-theme-arrows-dark.tether-element-attached-top.tether-element-attached-right.tether-target-attached-left .tether-content {
              -    margin-right: 16px; }
              -    .tether-element.tether-theme-arrows-dark.tether-element-attached-top.tether-element-attached-right.tether-target-attached-left .tether-content:before {
              -      top: 16px;
              -      left: 100%;
              -      border-left-color: #000;
              -      border-right: 0; }
              -  .tether-element.tether-theme-arrows-dark.tether-element-attached-top.tether-element-attached-left.tether-target-attached-right .tether-content {
              -    margin-left: 16px; }
              -    .tether-element.tether-theme-arrows-dark.tether-element-attached-top.tether-element-attached-left.tether-target-attached-right .tether-content:before {
              -      top: 16px;
              -      right: 100%;
              -      border-right-color: #000;
              -      border-left: 0; }
              -  .tether-element.tether-theme-arrows-dark.tether-element-attached-bottom.tether-element-attached-right.tether-target-attached-left .tether-content {
              -    margin-right: 16px; }
              -    .tether-element.tether-theme-arrows-dark.tether-element-attached-bottom.tether-element-attached-right.tether-target-attached-left .tether-content:before {
              -      bottom: 16px;
              -      left: 100%;
              -      border-left-color: #000;
              -      border-right: 0; }
              -  .tether-element.tether-theme-arrows-dark.tether-element-attached-bottom.tether-element-attached-left.tether-target-attached-right .tether-content {
              -    margin-left: 16px; }
              -    .tether-element.tether-theme-arrows-dark.tether-element-attached-bottom.tether-element-attached-left.tether-target-attached-right .tether-content:before {
              -      bottom: 16px;
              -      right: 100%;
              -      border-right-color: #000;
              -      border-left: 0; }
              +  max-height: 100%;
              +}
              +.tether-element.tether-theme-arrows-dark .tether-content {
              +  border-radius: 5px;
              +  position: relative;
              +  font-family: inherit;
              +  background: #000;
              +  color: #fff;
              +  padding: 1em;
              +  font-size: 1.1em;
              +  line-height: 1.5em;
              +}
              +.tether-element.tether-theme-arrows-dark .tether-content:before {
              +  content: "";
              +  display: block;
              +  position: absolute;
              +  width: 0;
              +  height: 0;
              +  border-color: transparent;
              +  border-width: 16px;
              +  border-style: solid;
              +}
              +.tether-element.tether-theme-arrows-dark.tether-element-attached-bottom.tether-element-attached-center .tether-content {
              +  margin-bottom: 16px;
              +}
              +.tether-element.tether-theme-arrows-dark.tether-element-attached-bottom.tether-element-attached-center .tether-content:before {
              +  top: 100%;
              +  left: 50%;
              +  margin-left: -16px;
              +  border-top-color: #000;
              +  border-bottom: 0;
              +}
              +.tether-element.tether-theme-arrows-dark.tether-element-attached-top.tether-element-attached-center .tether-content {
              +  margin-top: 16px;
              +}
              +.tether-element.tether-theme-arrows-dark.tether-element-attached-top.tether-element-attached-center .tether-content:before {
              +  bottom: 100%;
              +  left: 50%;
              +  margin-left: -16px;
              +  border-bottom-color: #000;
              +  border-top: 0;
              +}
              +.tether-element.tether-theme-arrows-dark.tether-element-attached-right.tether-element-attached-middle .tether-content {
              +  margin-right: 16px;
              +}
              +.tether-element.tether-theme-arrows-dark.tether-element-attached-right.tether-element-attached-middle .tether-content:before {
              +  left: 100%;
              +  top: 50%;
              +  margin-top: -16px;
              +  border-left-color: #000;
              +  border-right: 0;
              +}
              +.tether-element.tether-theme-arrows-dark.tether-element-attached-left.tether-element-attached-middle .tether-content {
              +  margin-left: 16px;
              +}
              +.tether-element.tether-theme-arrows-dark.tether-element-attached-left.tether-element-attached-middle .tether-content:before {
              +  right: 100%;
              +  top: 50%;
              +  margin-top: -16px;
              +  border-right-color: #000;
              +  border-left: 0;
              +}
              +.tether-element.tether-theme-arrows-dark.tether-element-attached-left.tether-target-attached-center .tether-content {
              +  left: -32px;
              +}
              +.tether-element.tether-theme-arrows-dark.tether-element-attached-right.tether-target-attached-center .tether-content {
              +  left: 32px;
              +}
              +.tether-element.tether-theme-arrows-dark.tether-element-attached-top.tether-element-attached-left.tether-target-attached-middle .tether-content {
              +  margin-top: 16px;
              +}
              +.tether-element.tether-theme-arrows-dark.tether-element-attached-top.tether-element-attached-left.tether-target-attached-middle .tether-content:before {
              +  bottom: 100%;
              +  left: 16px;
              +  border-bottom-color: #000;
              +  border-top: 0;
              +}
              +.tether-element.tether-theme-arrows-dark.tether-element-attached-top.tether-element-attached-right.tether-target-attached-middle .tether-content {
              +  margin-top: 16px;
              +}
              +.tether-element.tether-theme-arrows-dark.tether-element-attached-top.tether-element-attached-right.tether-target-attached-middle .tether-content:before {
              +  bottom: 100%;
              +  right: 16px;
              +  border-bottom-color: #000;
              +  border-top: 0;
              +}
              +.tether-element.tether-theme-arrows-dark.tether-element-attached-bottom.tether-element-attached-left.tether-target-attached-middle .tether-content {
              +  margin-bottom: 16px;
              +}
              +.tether-element.tether-theme-arrows-dark.tether-element-attached-bottom.tether-element-attached-left.tether-target-attached-middle .tether-content:before {
              +  top: 100%;
              +  left: 16px;
              +  border-top-color: #000;
              +  border-bottom: 0;
              +}
              +.tether-element.tether-theme-arrows-dark.tether-element-attached-bottom.tether-element-attached-right.tether-target-attached-middle .tether-content {
              +  margin-bottom: 16px;
              +}
              +.tether-element.tether-theme-arrows-dark.tether-element-attached-bottom.tether-element-attached-right.tether-target-attached-middle .tether-content:before {
              +  top: 100%;
              +  right: 16px;
              +  border-top-color: #000;
              +  border-bottom: 0;
              +}
              +.tether-element.tether-theme-arrows-dark.tether-element-attached-top.tether-element-attached-left.tether-target-attached-bottom .tether-content {
              +  margin-top: 16px;
              +}
              +.tether-element.tether-theme-arrows-dark.tether-element-attached-top.tether-element-attached-left.tether-target-attached-bottom .tether-content:before {
              +  bottom: 100%;
              +  left: 16px;
              +  border-bottom-color: #000;
              +  border-top: 0;
              +}
              +.tether-element.tether-theme-arrows-dark.tether-element-attached-top.tether-element-attached-right.tether-target-attached-bottom .tether-content {
              +  margin-top: 16px;
              +}
              +.tether-element.tether-theme-arrows-dark.tether-element-attached-top.tether-element-attached-right.tether-target-attached-bottom .tether-content:before {
              +  bottom: 100%;
              +  right: 16px;
              +  border-bottom-color: #000;
              +  border-top: 0;
              +}
              +.tether-element.tether-theme-arrows-dark.tether-element-attached-bottom.tether-element-attached-left.tether-target-attached-top .tether-content {
              +  margin-bottom: 16px;
              +}
              +.tether-element.tether-theme-arrows-dark.tether-element-attached-bottom.tether-element-attached-left.tether-target-attached-top .tether-content:before {
              +  top: 100%;
              +  left: 16px;
              +  border-top-color: #000;
              +  border-bottom: 0;
              +}
              +.tether-element.tether-theme-arrows-dark.tether-element-attached-bottom.tether-element-attached-right.tether-target-attached-top .tether-content {
              +  margin-bottom: 16px;
              +}
              +.tether-element.tether-theme-arrows-dark.tether-element-attached-bottom.tether-element-attached-right.tether-target-attached-top .tether-content:before {
              +  top: 100%;
              +  right: 16px;
              +  border-top-color: #000;
              +  border-bottom: 0;
              +}
              +.tether-element.tether-theme-arrows-dark.tether-element-attached-top.tether-element-attached-right.tether-target-attached-left .tether-content {
              +  margin-right: 16px;
              +}
              +.tether-element.tether-theme-arrows-dark.tether-element-attached-top.tether-element-attached-right.tether-target-attached-left .tether-content:before {
              +  top: 16px;
              +  left: 100%;
              +  border-left-color: #000;
              +  border-right: 0;
              +}
              +.tether-element.tether-theme-arrows-dark.tether-element-attached-top.tether-element-attached-left.tether-target-attached-right .tether-content {
              +  margin-left: 16px;
              +}
              +.tether-element.tether-theme-arrows-dark.tether-element-attached-top.tether-element-attached-left.tether-target-attached-right .tether-content:before {
              +  top: 16px;
              +  right: 100%;
              +  border-right-color: #000;
              +  border-left: 0;
              +}
              +.tether-element.tether-theme-arrows-dark.tether-element-attached-bottom.tether-element-attached-right.tether-target-attached-left .tether-content {
              +  margin-right: 16px;
              +}
              +.tether-element.tether-theme-arrows-dark.tether-element-attached-bottom.tether-element-attached-right.tether-target-attached-left .tether-content:before {
              +  bottom: 16px;
              +  left: 100%;
              +  border-left-color: #000;
              +  border-right: 0;
              +}
              +.tether-element.tether-theme-arrows-dark.tether-element-attached-bottom.tether-element-attached-left.tether-target-attached-right .tether-content {
              +  margin-left: 16px;
              +}
              +.tether-element.tether-theme-arrows-dark.tether-element-attached-bottom.tether-element-attached-left.tether-target-attached-right .tether-content:before {
              +  bottom: 16px;
              +  right: 100%;
              +  border-right-color: #000;
              +  border-left: 0;
              +}
              \ No newline at end of file
              diff --git a/dist/css/tether-theme-arrows-dark.min.css b/dist/css/tether-theme-arrows-dark.min.css
              index 73d263e98..c1b8baacd 100644
              --- a/dist/css/tether-theme-arrows-dark.min.css
              +++ b/dist/css/tether-theme-arrows-dark.min.css
              @@ -1 +1 @@
              -.tether-element.tether-theme-arrows-dark.tether-element-attached-bottom.tether-element-attached-center .tether-content,.tether-element.tether-theme-arrows-dark.tether-element-attached-bottom.tether-element-attached-left.tether-target-attached-middle .tether-content,.tether-element.tether-theme-arrows-dark.tether-element-attached-bottom.tether-element-attached-left.tether-target-attached-top .tether-content,.tether-element.tether-theme-arrows-dark.tether-element-attached-bottom.tether-element-attached-right.tether-target-attached-middle .tether-content,.tether-element.tether-theme-arrows-dark.tether-element-attached-bottom.tether-element-attached-right.tether-target-attached-top .tether-content{margin-bottom:16px}.tether-element.tether-theme-arrows-dark.tether-element-attached-bottom.tether-element-attached-right.tether-target-attached-left .tether-content,.tether-element.tether-theme-arrows-dark.tether-element-attached-right.tether-element-attached-middle .tether-content,.tether-element.tether-theme-arrows-dark.tether-element-attached-top.tether-element-attached-right.tether-target-attached-left .tether-content{margin-right:16px}.tether-element,.tether-element *,.tether-element :after,.tether-element :before,.tether-element:after,.tether-element:before{box-sizing:border-box}.tether-element{position:absolute;display:none}.tether-element.tether-open{display:block}.tether-element.tether-theme-arrows-dark{max-width:100%;max-height:100%}.tether-element.tether-theme-arrows-dark .tether-content{border-radius:5px;position:relative;font-family:inherit;background:#000;color:#fff;padding:1em;font-size:1.1em;line-height:1.5em}.tether-element.tether-theme-arrows-dark .tether-content:before{content:"";display:block;position:absolute;width:0;height:0;border-color:transparent;border-width:16px;border-style:solid}.tether-element.tether-theme-arrows-dark.tether-element-attached-bottom.tether-element-attached-center .tether-content:before{top:100%;left:50%;margin-left:-16px;border-top-color:#000;border-bottom:0}.tether-element.tether-theme-arrows-dark.tether-element-attached-top.tether-element-attached-center .tether-content{margin-top:16px}.tether-element.tether-theme-arrows-dark.tether-element-attached-top.tether-element-attached-center .tether-content:before{bottom:100%;left:50%;margin-left:-16px;border-bottom-color:#000;border-top:0}.tether-element.tether-theme-arrows-dark.tether-element-attached-bottom.tether-element-attached-left.tether-target-attached-right .tether-content,.tether-element.tether-theme-arrows-dark.tether-element-attached-left.tether-element-attached-middle .tether-content,.tether-element.tether-theme-arrows-dark.tether-element-attached-top.tether-element-attached-left.tether-target-attached-right .tether-content{margin-left:16px}.tether-element.tether-theme-arrows-dark.tether-element-attached-right.tether-element-attached-middle .tether-content:before{left:100%;top:50%;margin-top:-16px;border-left-color:#000;border-right:0}.tether-element.tether-theme-arrows-dark.tether-element-attached-left.tether-element-attached-middle .tether-content:before{right:100%;top:50%;margin-top:-16px;border-right-color:#000;border-left:0}.tether-element.tether-theme-arrows-dark.tether-element-attached-top.tether-element-attached-left.tether-target-attached-bottom .tether-content,.tether-element.tether-theme-arrows-dark.tether-element-attached-top.tether-element-attached-left.tether-target-attached-middle .tether-content,.tether-element.tether-theme-arrows-dark.tether-element-attached-top.tether-element-attached-right.tether-target-attached-bottom .tether-content,.tether-element.tether-theme-arrows-dark.tether-element-attached-top.tether-element-attached-right.tether-target-attached-middle .tether-content{margin-top:16px}.tether-element.tether-theme-arrows-dark.tether-element-attached-left.tether-target-attached-center .tether-content{left:-32px}.tether-element.tether-theme-arrows-dark.tether-element-attached-right.tether-target-attached-center .tether-content{left:32px}.tether-element.tether-theme-arrows-dark.tether-element-attached-top.tether-element-attached-left.tether-target-attached-middle .tether-content:before{bottom:100%;left:16px;border-bottom-color:#000;border-top:0}.tether-element.tether-theme-arrows-dark.tether-element-attached-top.tether-element-attached-right.tether-target-attached-middle .tether-content:before{bottom:100%;right:16px;border-bottom-color:#000;border-top:0}.tether-element.tether-theme-arrows-dark.tether-element-attached-bottom.tether-element-attached-left.tether-target-attached-middle .tether-content:before{top:100%;left:16px;border-top-color:#000;border-bottom:0}.tether-element.tether-theme-arrows-dark.tether-element-attached-bottom.tether-element-attached-right.tether-target-attached-middle .tether-content:before{top:100%;right:16px;border-top-color:#000;border-bottom:0}.tether-element.tether-theme-arrows-dark.tether-element-attached-top.tether-element-attached-left.tether-target-attached-bottom .tether-content:before{bottom:100%;left:16px;border-bottom-color:#000;border-top:0}.tether-element.tether-theme-arrows-dark.tether-element-attached-top.tether-element-attached-right.tether-target-attached-bottom .tether-content:before{bottom:100%;right:16px;border-bottom-color:#000;border-top:0}.tether-element.tether-theme-arrows-dark.tether-element-attached-bottom.tether-element-attached-left.tether-target-attached-top .tether-content:before{top:100%;left:16px;border-top-color:#000;border-bottom:0}.tether-element.tether-theme-arrows-dark.tether-element-attached-bottom.tether-element-attached-right.tether-target-attached-top .tether-content:before{top:100%;right:16px;border-top-color:#000;border-bottom:0}.tether-element.tether-theme-arrows-dark.tether-element-attached-top.tether-element-attached-right.tether-target-attached-left .tether-content:before{top:16px;left:100%;border-left-color:#000;border-right:0}.tether-element.tether-theme-arrows-dark.tether-element-attached-top.tether-element-attached-left.tether-target-attached-right .tether-content:before{top:16px;right:100%;border-right-color:#000;border-left:0}.tether-element.tether-theme-arrows-dark.tether-element-attached-bottom.tether-element-attached-right.tether-target-attached-left .tether-content:before{bottom:16px;left:100%;border-left-color:#000;border-right:0}.tether-element.tether-theme-arrows-dark.tether-element-attached-bottom.tether-element-attached-left.tether-target-attached-right .tether-content:before{bottom:16px;right:100%;border-right-color:#000;border-left:0}
              \ No newline at end of file
              +.tether-element,.tether-element *,.tether-element:after,.tether-element :after,.tether-element:before,.tether-element :before{box-sizing:border-box}.tether-element{position:absolute;display:none}.tether-element.tether-open{display:block}.tether-element.tether-theme-arrows-dark{max-width:100%;max-height:100%}.tether-element.tether-theme-arrows-dark .tether-content{border-radius:5px;position:relative;font-family:inherit;background:#000;color:#fff;padding:1em;font-size:1.1em;line-height:1.5em}.tether-element.tether-theme-arrows-dark .tether-content:before{content:"";display:block;position:absolute;width:0;height:0;border:16px solid transparent}.tether-element.tether-theme-arrows-dark.tether-element-attached-bottom.tether-element-attached-center .tether-content{margin-bottom:16px}.tether-element.tether-theme-arrows-dark.tether-element-attached-bottom.tether-element-attached-center .tether-content:before{top:100%;left:50%;margin-left:-16px;border-top-color:#000;border-bottom:0}.tether-element.tether-theme-arrows-dark.tether-element-attached-top.tether-element-attached-center .tether-content{margin-top:16px}.tether-element.tether-theme-arrows-dark.tether-element-attached-top.tether-element-attached-center .tether-content:before{bottom:100%;left:50%;margin-left:-16px;border-bottom-color:#000;border-top:0}.tether-element.tether-theme-arrows-dark.tether-element-attached-right.tether-element-attached-middle .tether-content{margin-right:16px}.tether-element.tether-theme-arrows-dark.tether-element-attached-right.tether-element-attached-middle .tether-content:before{left:100%;top:50%;margin-top:-16px;border-left-color:#000;border-right:0}.tether-element.tether-theme-arrows-dark.tether-element-attached-left.tether-element-attached-middle .tether-content{margin-left:16px}.tether-element.tether-theme-arrows-dark.tether-element-attached-left.tether-element-attached-middle .tether-content:before{right:100%;top:50%;margin-top:-16px;border-right-color:#000;border-left:0}.tether-element.tether-theme-arrows-dark.tether-element-attached-left.tether-target-attached-center .tether-content{left:-32px}.tether-element.tether-theme-arrows-dark.tether-element-attached-right.tether-target-attached-center .tether-content{left:32px}.tether-element.tether-theme-arrows-dark.tether-element-attached-top.tether-element-attached-left.tether-target-attached-middle .tether-content{margin-top:16px}.tether-element.tether-theme-arrows-dark.tether-element-attached-top.tether-element-attached-left.tether-target-attached-middle .tether-content:before{bottom:100%;left:16px;border-bottom-color:#000;border-top:0}.tether-element.tether-theme-arrows-dark.tether-element-attached-top.tether-element-attached-right.tether-target-attached-middle .tether-content{margin-top:16px}.tether-element.tether-theme-arrows-dark.tether-element-attached-top.tether-element-attached-right.tether-target-attached-middle .tether-content:before{bottom:100%;right:16px;border-bottom-color:#000;border-top:0}.tether-element.tether-theme-arrows-dark.tether-element-attached-bottom.tether-element-attached-left.tether-target-attached-middle .tether-content{margin-bottom:16px}.tether-element.tether-theme-arrows-dark.tether-element-attached-bottom.tether-element-attached-left.tether-target-attached-middle .tether-content:before{top:100%;left:16px;border-top-color:#000;border-bottom:0}.tether-element.tether-theme-arrows-dark.tether-element-attached-bottom.tether-element-attached-right.tether-target-attached-middle .tether-content{margin-bottom:16px}.tether-element.tether-theme-arrows-dark.tether-element-attached-bottom.tether-element-attached-right.tether-target-attached-middle .tether-content:before{top:100%;right:16px;border-top-color:#000;border-bottom:0}.tether-element.tether-theme-arrows-dark.tether-element-attached-top.tether-element-attached-left.tether-target-attached-bottom .tether-content{margin-top:16px}.tether-element.tether-theme-arrows-dark.tether-element-attached-top.tether-element-attached-left.tether-target-attached-bottom .tether-content:before{bottom:100%;left:16px;border-bottom-color:#000;border-top:0}.tether-element.tether-theme-arrows-dark.tether-element-attached-top.tether-element-attached-right.tether-target-attached-bottom .tether-content{margin-top:16px}.tether-element.tether-theme-arrows-dark.tether-element-attached-top.tether-element-attached-right.tether-target-attached-bottom .tether-content:before{bottom:100%;right:16px;border-bottom-color:#000;border-top:0}.tether-element.tether-theme-arrows-dark.tether-element-attached-bottom.tether-element-attached-left.tether-target-attached-top .tether-content{margin-bottom:16px}.tether-element.tether-theme-arrows-dark.tether-element-attached-bottom.tether-element-attached-left.tether-target-attached-top .tether-content:before{top:100%;left:16px;border-top-color:#000;border-bottom:0}.tether-element.tether-theme-arrows-dark.tether-element-attached-bottom.tether-element-attached-right.tether-target-attached-top .tether-content{margin-bottom:16px}.tether-element.tether-theme-arrows-dark.tether-element-attached-bottom.tether-element-attached-right.tether-target-attached-top .tether-content:before{top:100%;right:16px;border-top-color:#000;border-bottom:0}.tether-element.tether-theme-arrows-dark.tether-element-attached-top.tether-element-attached-right.tether-target-attached-left .tether-content{margin-right:16px}.tether-element.tether-theme-arrows-dark.tether-element-attached-top.tether-element-attached-right.tether-target-attached-left .tether-content:before{top:16px;left:100%;border-left-color:#000;border-right:0}.tether-element.tether-theme-arrows-dark.tether-element-attached-top.tether-element-attached-left.tether-target-attached-right .tether-content{margin-left:16px}.tether-element.tether-theme-arrows-dark.tether-element-attached-top.tether-element-attached-left.tether-target-attached-right .tether-content:before{top:16px;right:100%;border-right-color:#000;border-left:0}.tether-element.tether-theme-arrows-dark.tether-element-attached-bottom.tether-element-attached-right.tether-target-attached-left .tether-content{margin-right:16px}.tether-element.tether-theme-arrows-dark.tether-element-attached-bottom.tether-element-attached-right.tether-target-attached-left .tether-content:before{bottom:16px;left:100%;border-left-color:#000;border-right:0}.tether-element.tether-theme-arrows-dark.tether-element-attached-bottom.tether-element-attached-left.tether-target-attached-right .tether-content{margin-left:16px}.tether-element.tether-theme-arrows-dark.tether-element-attached-bottom.tether-element-attached-left.tether-target-attached-right .tether-content:before{bottom:16px;right:100%;border-right-color:#000;border-left:0}
              \ No newline at end of file
              diff --git a/dist/css/tether-theme-arrows.css b/dist/css/tether-theme-arrows.css
              index e9e3bbfab..9052dab1e 100644
              --- a/dist/css/tether-theme-arrows.css
              +++ b/dist/css/tether-theme-arrows.css
              @@ -1,154 +1,192 @@
               .tether-element, .tether-element:after, .tether-element:before, .tether-element *, .tether-element *:after, .tether-element *:before {
              -  box-sizing: border-box; }
              +  box-sizing: border-box;
              +}
               
               .tether-element {
                 position: absolute;
              -  display: none; }
              -  .tether-element.tether-open {
              -    display: block; }
              +  display: none;
              +}
              +.tether-element.tether-open {
              +  display: block;
              +}
               
               .tether-element.tether-theme-arrows {
                 max-width: 100%;
              -  max-height: 100%; }
              -  .tether-element.tether-theme-arrows .tether-content {
              -    border-radius: 5px;
              -    position: relative;
              -    font-family: inherit;
              -    background: #fff;
              -    color: inherit;
              -    padding: 1em;
              -    font-size: 1.1em;
              -    line-height: 1.5em;
              -    -webkit-transform: translateZ(0);
              -            transform: translateZ(0);
              -    -webkit-filter: drop-shadow(0 1px 4px rgba(0, 0, 0, 0.2));
              -            filter: drop-shadow(0 1px 4px rgba(0, 0, 0, 0.2)); }
              -    .tether-element.tether-theme-arrows .tether-content:before {
              -      content: "";
              -      display: block;
              -      position: absolute;
              -      width: 0;
              -      height: 0;
              -      border-color: transparent;
              -      border-width: 16px;
              -      border-style: solid; }
              -  .tether-element.tether-theme-arrows.tether-element-attached-bottom.tether-element-attached-center .tether-content {
              -    margin-bottom: 16px; }
              -    .tether-element.tether-theme-arrows.tether-element-attached-bottom.tether-element-attached-center .tether-content:before {
              -      top: 100%;
              -      left: 50%;
              -      margin-left: -16px;
              -      border-top-color: #fff;
              -      border-bottom: 0; }
              -  .tether-element.tether-theme-arrows.tether-element-attached-top.tether-element-attached-center .tether-content {
              -    margin-top: 16px; }
              -    .tether-element.tether-theme-arrows.tether-element-attached-top.tether-element-attached-center .tether-content:before {
              -      bottom: 100%;
              -      left: 50%;
              -      margin-left: -16px;
              -      border-bottom-color: #fff;
              -      border-top: 0; }
              -  .tether-element.tether-theme-arrows.tether-element-attached-right.tether-element-attached-middle .tether-content {
              -    margin-right: 16px; }
              -    .tether-element.tether-theme-arrows.tether-element-attached-right.tether-element-attached-middle .tether-content:before {
              -      left: 100%;
              -      top: 50%;
              -      margin-top: -16px;
              -      border-left-color: #fff;
              -      border-right: 0; }
              -  .tether-element.tether-theme-arrows.tether-element-attached-left.tether-element-attached-middle .tether-content {
              -    margin-left: 16px; }
              -    .tether-element.tether-theme-arrows.tether-element-attached-left.tether-element-attached-middle .tether-content:before {
              -      right: 100%;
              -      top: 50%;
              -      margin-top: -16px;
              -      border-right-color: #fff;
              -      border-left: 0; }
              -  .tether-element.tether-theme-arrows.tether-element-attached-left.tether-target-attached-center .tether-content {
              -    left: -32px; }
              -  .tether-element.tether-theme-arrows.tether-element-attached-right.tether-target-attached-center .tether-content {
              -    left: 32px; }
              -  .tether-element.tether-theme-arrows.tether-element-attached-top.tether-element-attached-left.tether-target-attached-middle .tether-content {
              -    margin-top: 16px; }
              -    .tether-element.tether-theme-arrows.tether-element-attached-top.tether-element-attached-left.tether-target-attached-middle .tether-content:before {
              -      bottom: 100%;
              -      left: 16px;
              -      border-bottom-color: #fff;
              -      border-top: 0; }
              -  .tether-element.tether-theme-arrows.tether-element-attached-top.tether-element-attached-right.tether-target-attached-middle .tether-content {
              -    margin-top: 16px; }
              -    .tether-element.tether-theme-arrows.tether-element-attached-top.tether-element-attached-right.tether-target-attached-middle .tether-content:before {
              -      bottom: 100%;
              -      right: 16px;
              -      border-bottom-color: #fff;
              -      border-top: 0; }
              -  .tether-element.tether-theme-arrows.tether-element-attached-bottom.tether-element-attached-left.tether-target-attached-middle .tether-content {
              -    margin-bottom: 16px; }
              -    .tether-element.tether-theme-arrows.tether-element-attached-bottom.tether-element-attached-left.tether-target-attached-middle .tether-content:before {
              -      top: 100%;
              -      left: 16px;
              -      border-top-color: #fff;
              -      border-bottom: 0; }
              -  .tether-element.tether-theme-arrows.tether-element-attached-bottom.tether-element-attached-right.tether-target-attached-middle .tether-content {
              -    margin-bottom: 16px; }
              -    .tether-element.tether-theme-arrows.tether-element-attached-bottom.tether-element-attached-right.tether-target-attached-middle .tether-content:before {
              -      top: 100%;
              -      right: 16px;
              -      border-top-color: #fff;
              -      border-bottom: 0; }
              -  .tether-element.tether-theme-arrows.tether-element-attached-top.tether-element-attached-left.tether-target-attached-bottom .tether-content {
              -    margin-top: 16px; }
              -    .tether-element.tether-theme-arrows.tether-element-attached-top.tether-element-attached-left.tether-target-attached-bottom .tether-content:before {
              -      bottom: 100%;
              -      left: 16px;
              -      border-bottom-color: #fff;
              -      border-top: 0; }
              -  .tether-element.tether-theme-arrows.tether-element-attached-top.tether-element-attached-right.tether-target-attached-bottom .tether-content {
              -    margin-top: 16px; }
              -    .tether-element.tether-theme-arrows.tether-element-attached-top.tether-element-attached-right.tether-target-attached-bottom .tether-content:before {
              -      bottom: 100%;
              -      right: 16px;
              -      border-bottom-color: #fff;
              -      border-top: 0; }
              -  .tether-element.tether-theme-arrows.tether-element-attached-bottom.tether-element-attached-left.tether-target-attached-top .tether-content {
              -    margin-bottom: 16px; }
              -    .tether-element.tether-theme-arrows.tether-element-attached-bottom.tether-element-attached-left.tether-target-attached-top .tether-content:before {
              -      top: 100%;
              -      left: 16px;
              -      border-top-color: #fff;
              -      border-bottom: 0; }
              -  .tether-element.tether-theme-arrows.tether-element-attached-bottom.tether-element-attached-right.tether-target-attached-top .tether-content {
              -    margin-bottom: 16px; }
              -    .tether-element.tether-theme-arrows.tether-element-attached-bottom.tether-element-attached-right.tether-target-attached-top .tether-content:before {
              -      top: 100%;
              -      right: 16px;
              -      border-top-color: #fff;
              -      border-bottom: 0; }
              -  .tether-element.tether-theme-arrows.tether-element-attached-top.tether-element-attached-right.tether-target-attached-left .tether-content {
              -    margin-right: 16px; }
              -    .tether-element.tether-theme-arrows.tether-element-attached-top.tether-element-attached-right.tether-target-attached-left .tether-content:before {
              -      top: 16px;
              -      left: 100%;
              -      border-left-color: #fff;
              -      border-right: 0; }
              -  .tether-element.tether-theme-arrows.tether-element-attached-top.tether-element-attached-left.tether-target-attached-right .tether-content {
              -    margin-left: 16px; }
              -    .tether-element.tether-theme-arrows.tether-element-attached-top.tether-element-attached-left.tether-target-attached-right .tether-content:before {
              -      top: 16px;
              -      right: 100%;
              -      border-right-color: #fff;
              -      border-left: 0; }
              -  .tether-element.tether-theme-arrows.tether-element-attached-bottom.tether-element-attached-right.tether-target-attached-left .tether-content {
              -    margin-right: 16px; }
              -    .tether-element.tether-theme-arrows.tether-element-attached-bottom.tether-element-attached-right.tether-target-attached-left .tether-content:before {
              -      bottom: 16px;
              -      left: 100%;
              -      border-left-color: #fff;
              -      border-right: 0; }
              -  .tether-element.tether-theme-arrows.tether-element-attached-bottom.tether-element-attached-left.tether-target-attached-right .tether-content {
              -    margin-left: 16px; }
              -    .tether-element.tether-theme-arrows.tether-element-attached-bottom.tether-element-attached-left.tether-target-attached-right .tether-content:before {
              -      bottom: 16px;
              -      right: 100%;
              -      border-right-color: #fff;
              -      border-left: 0; }
              +  max-height: 100%;
              +}
              +.tether-element.tether-theme-arrows .tether-content {
              +  border-radius: 5px;
              +  position: relative;
              +  font-family: inherit;
              +  background: #fff;
              +  color: inherit;
              +  padding: 1em;
              +  font-size: 1.1em;
              +  line-height: 1.5em;
              +  transform: translateZ(0);
              +  filter: drop-shadow(0 1px 4px rgba(0, 0, 0, 0.2));
              +}
              +.tether-element.tether-theme-arrows .tether-content:before {
              +  content: "";
              +  display: block;
              +  position: absolute;
              +  width: 0;
              +  height: 0;
              +  border-color: transparent;
              +  border-width: 16px;
              +  border-style: solid;
              +}
              +.tether-element.tether-theme-arrows.tether-element-attached-bottom.tether-element-attached-center .tether-content {
              +  margin-bottom: 16px;
              +}
              +.tether-element.tether-theme-arrows.tether-element-attached-bottom.tether-element-attached-center .tether-content:before {
              +  top: 100%;
              +  left: 50%;
              +  margin-left: -16px;
              +  border-top-color: #fff;
              +  border-bottom: 0;
              +}
              +.tether-element.tether-theme-arrows.tether-element-attached-top.tether-element-attached-center .tether-content {
              +  margin-top: 16px;
              +}
              +.tether-element.tether-theme-arrows.tether-element-attached-top.tether-element-attached-center .tether-content:before {
              +  bottom: 100%;
              +  left: 50%;
              +  margin-left: -16px;
              +  border-bottom-color: #fff;
              +  border-top: 0;
              +}
              +.tether-element.tether-theme-arrows.tether-element-attached-right.tether-element-attached-middle .tether-content {
              +  margin-right: 16px;
              +}
              +.tether-element.tether-theme-arrows.tether-element-attached-right.tether-element-attached-middle .tether-content:before {
              +  left: 100%;
              +  top: 50%;
              +  margin-top: -16px;
              +  border-left-color: #fff;
              +  border-right: 0;
              +}
              +.tether-element.tether-theme-arrows.tether-element-attached-left.tether-element-attached-middle .tether-content {
              +  margin-left: 16px;
              +}
              +.tether-element.tether-theme-arrows.tether-element-attached-left.tether-element-attached-middle .tether-content:before {
              +  right: 100%;
              +  top: 50%;
              +  margin-top: -16px;
              +  border-right-color: #fff;
              +  border-left: 0;
              +}
              +.tether-element.tether-theme-arrows.tether-element-attached-left.tether-target-attached-center .tether-content {
              +  left: -32px;
              +}
              +.tether-element.tether-theme-arrows.tether-element-attached-right.tether-target-attached-center .tether-content {
              +  left: 32px;
              +}
              +.tether-element.tether-theme-arrows.tether-element-attached-top.tether-element-attached-left.tether-target-attached-middle .tether-content {
              +  margin-top: 16px;
              +}
              +.tether-element.tether-theme-arrows.tether-element-attached-top.tether-element-attached-left.tether-target-attached-middle .tether-content:before {
              +  bottom: 100%;
              +  left: 16px;
              +  border-bottom-color: #fff;
              +  border-top: 0;
              +}
              +.tether-element.tether-theme-arrows.tether-element-attached-top.tether-element-attached-right.tether-target-attached-middle .tether-content {
              +  margin-top: 16px;
              +}
              +.tether-element.tether-theme-arrows.tether-element-attached-top.tether-element-attached-right.tether-target-attached-middle .tether-content:before {
              +  bottom: 100%;
              +  right: 16px;
              +  border-bottom-color: #fff;
              +  border-top: 0;
              +}
              +.tether-element.tether-theme-arrows.tether-element-attached-bottom.tether-element-attached-left.tether-target-attached-middle .tether-content {
              +  margin-bottom: 16px;
              +}
              +.tether-element.tether-theme-arrows.tether-element-attached-bottom.tether-element-attached-left.tether-target-attached-middle .tether-content:before {
              +  top: 100%;
              +  left: 16px;
              +  border-top-color: #fff;
              +  border-bottom: 0;
              +}
              +.tether-element.tether-theme-arrows.tether-element-attached-bottom.tether-element-attached-right.tether-target-attached-middle .tether-content {
              +  margin-bottom: 16px;
              +}
              +.tether-element.tether-theme-arrows.tether-element-attached-bottom.tether-element-attached-right.tether-target-attached-middle .tether-content:before {
              +  top: 100%;
              +  right: 16px;
              +  border-top-color: #fff;
              +  border-bottom: 0;
              +}
              +.tether-element.tether-theme-arrows.tether-element-attached-top.tether-element-attached-left.tether-target-attached-bottom .tether-content {
              +  margin-top: 16px;
              +}
              +.tether-element.tether-theme-arrows.tether-element-attached-top.tether-element-attached-left.tether-target-attached-bottom .tether-content:before {
              +  bottom: 100%;
              +  left: 16px;
              +  border-bottom-color: #fff;
              +  border-top: 0;
              +}
              +.tether-element.tether-theme-arrows.tether-element-attached-top.tether-element-attached-right.tether-target-attached-bottom .tether-content {
              +  margin-top: 16px;
              +}
              +.tether-element.tether-theme-arrows.tether-element-attached-top.tether-element-attached-right.tether-target-attached-bottom .tether-content:before {
              +  bottom: 100%;
              +  right: 16px;
              +  border-bottom-color: #fff;
              +  border-top: 0;
              +}
              +.tether-element.tether-theme-arrows.tether-element-attached-bottom.tether-element-attached-left.tether-target-attached-top .tether-content {
              +  margin-bottom: 16px;
              +}
              +.tether-element.tether-theme-arrows.tether-element-attached-bottom.tether-element-attached-left.tether-target-attached-top .tether-content:before {
              +  top: 100%;
              +  left: 16px;
              +  border-top-color: #fff;
              +  border-bottom: 0;
              +}
              +.tether-element.tether-theme-arrows.tether-element-attached-bottom.tether-element-attached-right.tether-target-attached-top .tether-content {
              +  margin-bottom: 16px;
              +}
              +.tether-element.tether-theme-arrows.tether-element-attached-bottom.tether-element-attached-right.tether-target-attached-top .tether-content:before {
              +  top: 100%;
              +  right: 16px;
              +  border-top-color: #fff;
              +  border-bottom: 0;
              +}
              +.tether-element.tether-theme-arrows.tether-element-attached-top.tether-element-attached-right.tether-target-attached-left .tether-content {
              +  margin-right: 16px;
              +}
              +.tether-element.tether-theme-arrows.tether-element-attached-top.tether-element-attached-right.tether-target-attached-left .tether-content:before {
              +  top: 16px;
              +  left: 100%;
              +  border-left-color: #fff;
              +  border-right: 0;
              +}
              +.tether-element.tether-theme-arrows.tether-element-attached-top.tether-element-attached-left.tether-target-attached-right .tether-content {
              +  margin-left: 16px;
              +}
              +.tether-element.tether-theme-arrows.tether-element-attached-top.tether-element-attached-left.tether-target-attached-right .tether-content:before {
              +  top: 16px;
              +  right: 100%;
              +  border-right-color: #fff;
              +  border-left: 0;
              +}
              +.tether-element.tether-theme-arrows.tether-element-attached-bottom.tether-element-attached-right.tether-target-attached-left .tether-content {
              +  margin-right: 16px;
              +}
              +.tether-element.tether-theme-arrows.tether-element-attached-bottom.tether-element-attached-right.tether-target-attached-left .tether-content:before {
              +  bottom: 16px;
              +  left: 100%;
              +  border-left-color: #fff;
              +  border-right: 0;
              +}
              +.tether-element.tether-theme-arrows.tether-element-attached-bottom.tether-element-attached-left.tether-target-attached-right .tether-content {
              +  margin-left: 16px;
              +}
              +.tether-element.tether-theme-arrows.tether-element-attached-bottom.tether-element-attached-left.tether-target-attached-right .tether-content:before {
              +  bottom: 16px;
              +  right: 100%;
              +  border-right-color: #fff;
              +  border-left: 0;
              +}
              \ No newline at end of file
              diff --git a/dist/css/tether-theme-arrows.min.css b/dist/css/tether-theme-arrows.min.css
              index 61994a9c4..a23bca8bf 100644
              --- a/dist/css/tether-theme-arrows.min.css
              +++ b/dist/css/tether-theme-arrows.min.css
              @@ -1 +1 @@
              -.tether-element.tether-theme-arrows.tether-element-attached-bottom.tether-element-attached-center .tether-content,.tether-element.tether-theme-arrows.tether-element-attached-bottom.tether-element-attached-left.tether-target-attached-middle .tether-content,.tether-element.tether-theme-arrows.tether-element-attached-bottom.tether-element-attached-left.tether-target-attached-top .tether-content,.tether-element.tether-theme-arrows.tether-element-attached-bottom.tether-element-attached-right.tether-target-attached-middle .tether-content,.tether-element.tether-theme-arrows.tether-element-attached-bottom.tether-element-attached-right.tether-target-attached-top .tether-content{margin-bottom:16px}.tether-element.tether-theme-arrows.tether-element-attached-bottom.tether-element-attached-right.tether-target-attached-left .tether-content,.tether-element.tether-theme-arrows.tether-element-attached-right.tether-element-attached-middle .tether-content,.tether-element.tether-theme-arrows.tether-element-attached-top.tether-element-attached-right.tether-target-attached-left .tether-content{margin-right:16px}.tether-element,.tether-element *,.tether-element :after,.tether-element :before,.tether-element:after,.tether-element:before{box-sizing:border-box}.tether-element{position:absolute;display:none}.tether-element.tether-open{display:block}.tether-element.tether-theme-arrows{max-width:100%;max-height:100%}.tether-element.tether-theme-arrows .tether-content{border-radius:5px;position:relative;font-family:inherit;background:#fff;color:inherit;padding:1em;font-size:1.1em;line-height:1.5em;-webkit-transform:translateZ(0);transform:translateZ(0);-webkit-filter:drop-shadow(0 1px 4px rgba(0, 0, 0, .2));filter:drop-shadow(0 1px 4px rgba(0, 0, 0, .2))}.tether-element.tether-theme-arrows .tether-content:before{content:"";display:block;position:absolute;width:0;height:0;border-color:transparent;border-width:16px;border-style:solid}.tether-element.tether-theme-arrows.tether-element-attached-bottom.tether-element-attached-center .tether-content:before{top:100%;left:50%;margin-left:-16px;border-top-color:#fff;border-bottom:0}.tether-element.tether-theme-arrows.tether-element-attached-top.tether-element-attached-center .tether-content{margin-top:16px}.tether-element.tether-theme-arrows.tether-element-attached-top.tether-element-attached-center .tether-content:before{bottom:100%;left:50%;margin-left:-16px;border-bottom-color:#fff;border-top:0}.tether-element.tether-theme-arrows.tether-element-attached-bottom.tether-element-attached-left.tether-target-attached-right .tether-content,.tether-element.tether-theme-arrows.tether-element-attached-left.tether-element-attached-middle .tether-content,.tether-element.tether-theme-arrows.tether-element-attached-top.tether-element-attached-left.tether-target-attached-right .tether-content{margin-left:16px}.tether-element.tether-theme-arrows.tether-element-attached-right.tether-element-attached-middle .tether-content:before{left:100%;top:50%;margin-top:-16px;border-left-color:#fff;border-right:0}.tether-element.tether-theme-arrows.tether-element-attached-left.tether-element-attached-middle .tether-content:before{right:100%;top:50%;margin-top:-16px;border-right-color:#fff;border-left:0}.tether-element.tether-theme-arrows.tether-element-attached-top.tether-element-attached-left.tether-target-attached-bottom .tether-content,.tether-element.tether-theme-arrows.tether-element-attached-top.tether-element-attached-left.tether-target-attached-middle .tether-content,.tether-element.tether-theme-arrows.tether-element-attached-top.tether-element-attached-right.tether-target-attached-bottom .tether-content,.tether-element.tether-theme-arrows.tether-element-attached-top.tether-element-attached-right.tether-target-attached-middle .tether-content{margin-top:16px}.tether-element.tether-theme-arrows.tether-element-attached-left.tether-target-attached-center .tether-content{left:-32px}.tether-element.tether-theme-arrows.tether-element-attached-right.tether-target-attached-center .tether-content{left:32px}.tether-element.tether-theme-arrows.tether-element-attached-top.tether-element-attached-left.tether-target-attached-middle .tether-content:before{bottom:100%;left:16px;border-bottom-color:#fff;border-top:0}.tether-element.tether-theme-arrows.tether-element-attached-top.tether-element-attached-right.tether-target-attached-middle .tether-content:before{bottom:100%;right:16px;border-bottom-color:#fff;border-top:0}.tether-element.tether-theme-arrows.tether-element-attached-bottom.tether-element-attached-left.tether-target-attached-middle .tether-content:before{top:100%;left:16px;border-top-color:#fff;border-bottom:0}.tether-element.tether-theme-arrows.tether-element-attached-bottom.tether-element-attached-right.tether-target-attached-middle .tether-content:before{top:100%;right:16px;border-top-color:#fff;border-bottom:0}.tether-element.tether-theme-arrows.tether-element-attached-top.tether-element-attached-left.tether-target-attached-bottom .tether-content:before{bottom:100%;left:16px;border-bottom-color:#fff;border-top:0}.tether-element.tether-theme-arrows.tether-element-attached-top.tether-element-attached-right.tether-target-attached-bottom .tether-content:before{bottom:100%;right:16px;border-bottom-color:#fff;border-top:0}.tether-element.tether-theme-arrows.tether-element-attached-bottom.tether-element-attached-left.tether-target-attached-top .tether-content:before{top:100%;left:16px;border-top-color:#fff;border-bottom:0}.tether-element.tether-theme-arrows.tether-element-attached-bottom.tether-element-attached-right.tether-target-attached-top .tether-content:before{top:100%;right:16px;border-top-color:#fff;border-bottom:0}.tether-element.tether-theme-arrows.tether-element-attached-top.tether-element-attached-right.tether-target-attached-left .tether-content:before{top:16px;left:100%;border-left-color:#fff;border-right:0}.tether-element.tether-theme-arrows.tether-element-attached-top.tether-element-attached-left.tether-target-attached-right .tether-content:before{top:16px;right:100%;border-right-color:#fff;border-left:0}.tether-element.tether-theme-arrows.tether-element-attached-bottom.tether-element-attached-right.tether-target-attached-left .tether-content:before{bottom:16px;left:100%;border-left-color:#fff;border-right:0}.tether-element.tether-theme-arrows.tether-element-attached-bottom.tether-element-attached-left.tether-target-attached-right .tether-content:before{bottom:16px;right:100%;border-right-color:#fff;border-left:0}
              \ No newline at end of file
              +.tether-element,.tether-element *,.tether-element:after,.tether-element :after,.tether-element:before,.tether-element :before{box-sizing:border-box}.tether-element{position:absolute;display:none}.tether-element.tether-open{display:block}.tether-element.tether-theme-arrows{max-width:100%;max-height:100%}.tether-element.tether-theme-arrows .tether-content{border-radius:5px;position:relative;font-family:inherit;background:#fff;color:inherit;padding:1em;font-size:1.1em;line-height:1.5em;transform:translateZ(0);filter:drop-shadow(0 1px 4px rgba(0,0,0,.2))}.tether-element.tether-theme-arrows .tether-content:before{content:"";display:block;position:absolute;width:0;height:0;border:16px solid transparent}.tether-element.tether-theme-arrows.tether-element-attached-bottom.tether-element-attached-center .tether-content{margin-bottom:16px}.tether-element.tether-theme-arrows.tether-element-attached-bottom.tether-element-attached-center .tether-content:before{top:100%;left:50%;margin-left:-16px;border-top-color:#fff;border-bottom:0}.tether-element.tether-theme-arrows.tether-element-attached-top.tether-element-attached-center .tether-content{margin-top:16px}.tether-element.tether-theme-arrows.tether-element-attached-top.tether-element-attached-center .tether-content:before{bottom:100%;left:50%;margin-left:-16px;border-bottom-color:#fff;border-top:0}.tether-element.tether-theme-arrows.tether-element-attached-right.tether-element-attached-middle .tether-content{margin-right:16px}.tether-element.tether-theme-arrows.tether-element-attached-right.tether-element-attached-middle .tether-content:before{left:100%;top:50%;margin-top:-16px;border-left-color:#fff;border-right:0}.tether-element.tether-theme-arrows.tether-element-attached-left.tether-element-attached-middle .tether-content{margin-left:16px}.tether-element.tether-theme-arrows.tether-element-attached-left.tether-element-attached-middle .tether-content:before{right:100%;top:50%;margin-top:-16px;border-right-color:#fff;border-left:0}.tether-element.tether-theme-arrows.tether-element-attached-left.tether-target-attached-center .tether-content{left:-32px}.tether-element.tether-theme-arrows.tether-element-attached-right.tether-target-attached-center .tether-content{left:32px}.tether-element.tether-theme-arrows.tether-element-attached-top.tether-element-attached-left.tether-target-attached-middle .tether-content{margin-top:16px}.tether-element.tether-theme-arrows.tether-element-attached-top.tether-element-attached-left.tether-target-attached-middle .tether-content:before{bottom:100%;left:16px;border-bottom-color:#fff;border-top:0}.tether-element.tether-theme-arrows.tether-element-attached-top.tether-element-attached-right.tether-target-attached-middle .tether-content{margin-top:16px}.tether-element.tether-theme-arrows.tether-element-attached-top.tether-element-attached-right.tether-target-attached-middle .tether-content:before{bottom:100%;right:16px;border-bottom-color:#fff;border-top:0}.tether-element.tether-theme-arrows.tether-element-attached-bottom.tether-element-attached-left.tether-target-attached-middle .tether-content{margin-bottom:16px}.tether-element.tether-theme-arrows.tether-element-attached-bottom.tether-element-attached-left.tether-target-attached-middle .tether-content:before{top:100%;left:16px;border-top-color:#fff;border-bottom:0}.tether-element.tether-theme-arrows.tether-element-attached-bottom.tether-element-attached-right.tether-target-attached-middle .tether-content{margin-bottom:16px}.tether-element.tether-theme-arrows.tether-element-attached-bottom.tether-element-attached-right.tether-target-attached-middle .tether-content:before{top:100%;right:16px;border-top-color:#fff;border-bottom:0}.tether-element.tether-theme-arrows.tether-element-attached-top.tether-element-attached-left.tether-target-attached-bottom .tether-content{margin-top:16px}.tether-element.tether-theme-arrows.tether-element-attached-top.tether-element-attached-left.tether-target-attached-bottom .tether-content:before{bottom:100%;left:16px;border-bottom-color:#fff;border-top:0}.tether-element.tether-theme-arrows.tether-element-attached-top.tether-element-attached-right.tether-target-attached-bottom .tether-content{margin-top:16px}.tether-element.tether-theme-arrows.tether-element-attached-top.tether-element-attached-right.tether-target-attached-bottom .tether-content:before{bottom:100%;right:16px;border-bottom-color:#fff;border-top:0}.tether-element.tether-theme-arrows.tether-element-attached-bottom.tether-element-attached-left.tether-target-attached-top .tether-content{margin-bottom:16px}.tether-element.tether-theme-arrows.tether-element-attached-bottom.tether-element-attached-left.tether-target-attached-top .tether-content:before{top:100%;left:16px;border-top-color:#fff;border-bottom:0}.tether-element.tether-theme-arrows.tether-element-attached-bottom.tether-element-attached-right.tether-target-attached-top .tether-content{margin-bottom:16px}.tether-element.tether-theme-arrows.tether-element-attached-bottom.tether-element-attached-right.tether-target-attached-top .tether-content:before{top:100%;right:16px;border-top-color:#fff;border-bottom:0}.tether-element.tether-theme-arrows.tether-element-attached-top.tether-element-attached-right.tether-target-attached-left .tether-content{margin-right:16px}.tether-element.tether-theme-arrows.tether-element-attached-top.tether-element-attached-right.tether-target-attached-left .tether-content:before{top:16px;left:100%;border-left-color:#fff;border-right:0}.tether-element.tether-theme-arrows.tether-element-attached-top.tether-element-attached-left.tether-target-attached-right .tether-content{margin-left:16px}.tether-element.tether-theme-arrows.tether-element-attached-top.tether-element-attached-left.tether-target-attached-right .tether-content:before{top:16px;right:100%;border-right-color:#fff;border-left:0}.tether-element.tether-theme-arrows.tether-element-attached-bottom.tether-element-attached-right.tether-target-attached-left .tether-content{margin-right:16px}.tether-element.tether-theme-arrows.tether-element-attached-bottom.tether-element-attached-right.tether-target-attached-left .tether-content:before{bottom:16px;left:100%;border-left-color:#fff;border-right:0}.tether-element.tether-theme-arrows.tether-element-attached-bottom.tether-element-attached-left.tether-target-attached-right .tether-content{margin-left:16px}.tether-element.tether-theme-arrows.tether-element-attached-bottom.tether-element-attached-left.tether-target-attached-right .tether-content:before{bottom:16px;right:100%;border-right-color:#fff;border-left:0}
              \ No newline at end of file
              diff --git a/dist/css/tether-theme-basic.css b/dist/css/tether-theme-basic.css
              index f2b3b5c6a..be7fc4c50 100644
              --- a/dist/css/tether-theme-basic.css
              +++ b/dist/css/tether-theme-basic.css
              @@ -1,21 +1,26 @@
               .tether-element, .tether-element:after, .tether-element:before, .tether-element *, .tether-element *:after, .tether-element *:before {
              -  box-sizing: border-box; }
              +  box-sizing: border-box;
              +}
               
               .tether-element {
                 position: absolute;
              -  display: none; }
              -  .tether-element.tether-open {
              -    display: block; }
              +  display: none;
              +}
              +.tether-element.tether-open {
              +  display: block;
              +}
               
               .tether-element.tether-theme-basic {
                 max-width: 100%;
              -  max-height: 100%; }
              -  .tether-element.tether-theme-basic .tether-content {
              -    border-radius: 5px;
              -    box-shadow: 0 2px 8px rgba(0, 0, 0, 0.2);
              -    font-family: inherit;
              -    background: #fff;
              -    color: inherit;
              -    padding: 1em;
              -    font-size: 1.1em;
              -    line-height: 1.5em; }
              +  max-height: 100%;
              +}
              +.tether-element.tether-theme-basic .tether-content {
              +  border-radius: 5px;
              +  box-shadow: 0 2px 8px rgba(0, 0, 0, 0.2);
              +  font-family: inherit;
              +  background: #fff;
              +  color: inherit;
              +  padding: 1em;
              +  font-size: 1.1em;
              +  line-height: 1.5em;
              +}
              \ No newline at end of file
              diff --git a/dist/css/tether-theme-basic.min.css b/dist/css/tether-theme-basic.min.css
              index f117c4799..05c2396e9 100644
              --- a/dist/css/tether-theme-basic.min.css
              +++ b/dist/css/tether-theme-basic.min.css
              @@ -1 +1 @@
              -.tether-element,.tether-element *,.tether-element :after,.tether-element :before,.tether-element:after,.tether-element:before{box-sizing:border-box}.tether-element{position:absolute;display:none}.tether-element.tether-open{display:block}.tether-element.tether-theme-basic{max-width:100%;max-height:100%}.tether-element.tether-theme-basic .tether-content{border-radius:5px;box-shadow:0 2px 8px rgba(0,0,0,.2);font-family:inherit;background:#fff;color:inherit;padding:1em;font-size:1.1em;line-height:1.5em}
              \ No newline at end of file
              +.tether-element,.tether-element *,.tether-element:after,.tether-element :after,.tether-element:before,.tether-element :before{box-sizing:border-box}.tether-element{position:absolute;display:none}.tether-element.tether-open{display:block}.tether-element.tether-theme-basic{max-width:100%;max-height:100%}.tether-element.tether-theme-basic .tether-content{border-radius:5px;box-shadow:0 2px 8px rgba(0,0,0,.2);font-family:inherit;background:#fff;color:inherit;padding:1em;font-size:1.1em;line-height:1.5em}
              \ No newline at end of file
              diff --git a/dist/css/tether.css b/dist/css/tether.css
              index fc30f5674..b22628bd4 100644
              --- a/dist/css/tether.css
              +++ b/dist/css/tether.css
              @@ -1,8 +1,11 @@
               .tether-element, .tether-element:after, .tether-element:before, .tether-element *, .tether-element *:after, .tether-element *:before {
              -  box-sizing: border-box; }
              +  box-sizing: border-box;
              +}
               
               .tether-element {
                 position: absolute;
              -  display: none; }
              -  .tether-element.tether-open {
              -    display: block; }
              +  display: none;
              +}
              +.tether-element.tether-open {
              +  display: block;
              +}
              \ No newline at end of file
              diff --git a/dist/css/tether.min.css b/dist/css/tether.min.css
              index 328251c90..a8534ee53 100644
              --- a/dist/css/tether.min.css
              +++ b/dist/css/tether.min.css
              @@ -1 +1 @@
              -.tether-element,.tether-element *,.tether-element :after,.tether-element :before,.tether-element:after,.tether-element:before{box-sizing:border-box}.tether-element{position:absolute;display:none}.tether-element.tether-open{display:block}
              \ No newline at end of file
              +.tether-element,.tether-element *,.tether-element:after,.tether-element :after,.tether-element:before,.tether-element :before{box-sizing:border-box}.tether-element{position:absolute;display:none}.tether-element.tether-open{display:block}
              \ No newline at end of file
              diff --git a/dist/js/tether.esm.js b/dist/js/tether.esm.js
              new file mode 100644
              index 000000000..2c01de16a
              --- /dev/null
              +++ b/dist/js/tether.esm.js
              @@ -0,0 +1,1799 @@
              +/*! tether 2.0.0-beta.2 */
              +
              +function _inheritsLoose(subClass, superClass) {
              +  subClass.prototype = Object.create(superClass.prototype);
              +  subClass.prototype.constructor = subClass;
              +  subClass.__proto__ = superClass;
              +}
              +
              +function _assertThisInitialized(self) {
              +  if (self === void 0) {
              +    throw new ReferenceError("this hasn't been initialised - super() hasn't been called");
              +  }
              +
              +  return self;
              +}
              +
              +var Evented =
              +/*#__PURE__*/
              +function () {
              +  function Evented() {}
              +
              +  var _proto = Evented.prototype;
              +
              +  _proto.on = function on(event, handler, ctx, once) {
              +    if (once === void 0) {
              +      once = false;
              +    }
              +
              +    if (typeof this.bindings === 'undefined') {
              +      this.bindings = {};
              +    }
              +
              +    if (typeof this.bindings[event] === 'undefined') {
              +      this.bindings[event] = [];
              +    }
              +
              +    this.bindings[event].push({
              +      handler: handler,
              +      ctx: ctx,
              +      once: once
              +    });
              +    return this;
              +  };
              +
              +  _proto.once = function once(event, handler, ctx) {
              +    return this.on(event, handler, ctx, true);
              +  };
              +
              +  _proto.off = function off(event, handler) {
              +    if (typeof this.bindings === 'undefined' || typeof this.bindings[event] === 'undefined') {
              +      return this;
              +    }
              +
              +    if (typeof handler === 'undefined') {
              +      delete this.bindings[event];
              +    } else {
              +      var i = 0;
              +
              +      while (i < this.bindings[event].length) {
              +        if (this.bindings[event][i].handler === handler) {
              +          this.bindings[event].splice(i, 1);
              +        } else {
              +          ++i;
              +        }
              +      }
              +    }
              +
              +    return this;
              +  };
              +
              +  _proto.trigger = function trigger(event) {
              +    if (typeof this.bindings !== 'undefined' && this.bindings[event]) {
              +      var i = 0;
              +
              +      for (var _len = arguments.length, args = new Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) {
              +        args[_key - 1] = arguments[_key];
              +      }
              +
              +      while (i < this.bindings[event].length) {
              +        var _this$bindings$event$ = this.bindings[event][i],
              +            handler = _this$bindings$event$.handler,
              +            ctx = _this$bindings$event$.ctx,
              +            once = _this$bindings$event$.once;
              +        var context = ctx;
              +
              +        if (typeof context === 'undefined') {
              +          context = this;
              +        }
              +
              +        handler.apply(context, args);
              +
              +        if (once) {
              +          this.bindings[event].splice(i, 1);
              +        } else {
              +          ++i;
              +        }
              +      }
              +    }
              +
              +    return this;
              +  };
              +
              +  return Evented;
              +}();
              +
              +var TetherBase;
              +
              +if (typeof TetherBase === 'undefined') {
              +  TetherBase = {
              +    modules: []
              +  };
              +}
              +
              +var zeroElement = null; // Same as native getBoundingClientRect, except it takes into account parent  offsets
              +// if the element lies within a nested document ( or 

              +

              Tether

              A client-side library to make absolutely positioned elements attach to elements in the page efficiently.

              2.0.0-beta.2

              diff --git a/overview/repositioning/index.html b/overview/repositioning/index.html index adb9b2505..890aff9bf 100644 --- a/overview/repositioning/index.html +++ b/overview/repositioning/index.html @@ -1,4 +1,4 @@ -Tether -

              Repositioning

              +

              Repositioning

              Tethers will be automatically repositioned when the page is resized, and when any element containing the Tether is scrolled. If the element moves for some other reason (e.g. with JavaScript), Tether won't know to reposition the element.

              Manually Repositioning

              diff --git a/overview/why_we_dont_support_ie_8/index.html b/overview/why_we_dont_support_ie_8/index.html index 4fef63cf2..ecd253adf 100644 --- a/overview/why_we_dont_support_ie_8/index.html +++ b/overview/why_we_dont_support_ie_8/index.html @@ -1,4 +1,4 @@ -Tether -

              Why we don't support IE 8

              +

              Why we don't support IE 8

              We've been living in 2007 for a while now, pretending that new browser features don't exist because they aren't in IE8. You might not even know about some of these features, or think they are only enabled by jQuery or underscore, simply because it hasn't @@ -50,7 +50,7 @@

            • Object.create, .seal, .freeze, .defineProperty
            • Array.isArray, .indexOf, .every, .some, .forEach, .map, .filter, .reduce
            • A modern JavaScript engine
            • -
            • A real developer tools
            • +
            • Real developer tools
            • A consistent box model
            • jQuery 2
            • Google Apps
            • diff --git a/overview/why_you_should_use_tether/index.html b/overview/why_you_should_use_tether/index.html index 5a3f7cf93..562607f85 100644 --- a/overview/why_you_should_use_tether/index.html +++ b/overview/why_you_should_use_tether/index.html @@ -1,4 +1,4 @@ -Tether -

              Why You Should Use Tether

              +

              Why You Should Use Tether

              Virtually every app includes some sort of overlay attached to an element on the page. Things like tooltips, dropdowns, hover-activated info boxes, etc.

              diff --git a/resources/templates/base.jade b/resources/templates/base.jade index 41c602ff6..c0e3026b6 100644 --- a/resources/templates/base.jade +++ b/resources/templates/base.jade @@ -33,7 +33,7 @@ html script(src='//github.hubspot.com/#{ repo.name }/#{ root }/resources/executr/build/js/executr.js') script(src='//github.hubspot.com/#{ repo.name }/#{ root }/resources/executr/build/js/executr-run.js') - script(src="//use.typekit.net/ghy0wve.js") + script(src="//use.typekit.net/jbn8qxr.js") script(type='text/javascript'). try {Typekit.load();}catch(e){} From e90c21c8327764106e6b6c1ccb4343c4605bc21e Mon Sep 17 00:00:00 2001 From: Robert Wagner Date: Wed, 18 Sep 2019 00:24:45 -0400 Subject: [PATCH 16/40] Rebuild docs --- docs/welcome/browser-demo.html | 12 +- docs/welcome/coffee/welcome.coffee | 212 ---------- docs/welcome/index.html | 433 ++++++++++--------- docs/welcome/js/drop.js | 649 +++++++++++++++++++++-------- docs/welcome/js/tether-v0.1.3.js | 2 - 5 files changed, 726 insertions(+), 582 deletions(-) delete mode 100644 docs/welcome/coffee/welcome.coffee delete mode 100644 docs/welcome/js/tether-v0.1.3.js diff --git a/docs/welcome/browser-demo.html b/docs/welcome/browser-demo.html index 6c175bc19..6c13c55cd 100644 --- a/docs/welcome/browser-demo.html +++ b/docs/welcome/browser-demo.html @@ -10,10 +10,10 @@ - + - +
              @@ -66,11 +66,11 @@
              - + + - - - + + diff --git a/docs/welcome/coffee/welcome.coffee b/docs/welcome/coffee/welcome.coffee deleted file mode 100644 index a43160214..000000000 --- a/docs/welcome/coffee/welcome.coffee +++ /dev/null @@ -1,212 +0,0 @@ -_Drop = Drop.createContext classPrefix: 'tether' - -isMobile = $(window).width() < 567 - -init = -> - setupHero() - setupBrowserDemo() - -setupHero = -> - $target = $('.tether-target-demo') - - positions = [ - 'top left' - 'left top' - 'left middle' - 'left bottom' - 'bottom left' - 'bottom center' - 'bottom right' - 'right bottom' - 'right middle' - 'right top' - 'top right' - 'top center' - ] - - if isMobile - positions = [ - 'top left' - 'bottom left' - 'bottom right' - 'top right' - ] - - window.drops = {} - - for position in positions - drops[position] = new _Drop - target: $target[0] - classes: 'tether-theme-arrows-dark' - position: position - constrainToWindow: false - openOn: '' - content: '
              ' - - openIndex = 0 - frames = 0 - frameLengthMS = 10 - - openAllDrops = -> - for position, drop of drops - drop.open() - - openNextDrop = -> - for position, drop of drops - drop.close() - - drops[positions[openIndex]].open() - drops[positions[(openIndex + 6) % positions.length]].open() - - openIndex = (openIndex + 1) % positions.length - - if frames > 5 - finalDropState() - return - - frames += 1 - - setTimeout openNextDrop, frameLengthMS * frames - - finalDropState = -> - $(drops['top left'].dropContent).html('Marrying DOM elements for life.') - $(drops['bottom right'].dropContent).html('★ On Github') - drops['top left'].open() - drops['bottom right'].open() - - if true or isMobile - drops['top left'].open() - drops['top left'].tether.position() - drops['bottom right'].open() - drops['bottom right'].tether.position() - finalDropState() - - else - openNextDrop() - -setupBrowserDemo = -> - $browserDemo = $('.browser-demo.showcase') - - $startPoint = $('.browser-demo-start-point') - $stopPoint = $('.browser-demo-stop-point') - - $iframe = $('.browser-window iframe') - $browserContents = $('.browser-content .browser-demo-inner') - - $sections = $('.browser-demo-section') - - $('body').append """ - - """ - - $(window).scroll -> - scrollTop = $(window).scrollTop() - - if $startPoint.position().top < scrollTop and scrollTop + window.innerHeight < $stopPoint.position().top - $browserDemo.removeClass('fixed-bottom') - $browserDemo.addClass('fixed') - - $sections.each -> - $section = $ @ - - if $section.position().top < scrollTop < $section.position().top + $section.outerHeight() - setSection $section.data('section') - - return true - - else - $browserDemo.removeAttr('data-section') - $browserDemo.removeClass('fixed') - - if scrollTop + window.innerHeight > $stopPoint.position().top - $browserDemo.addClass('fixed-bottom') - else - $browserDemo.removeClass('fixed-bottom') - - $iframe.load -> - iframeWindow = $iframe[0].contentWindow - - $items = $iframe.contents().find('.item') - - $items.each (i) -> - $item = $(@) - - _iframeWindowDrop = iframeWindow.Drop.createContext classPrefix: 'tether' - - drop = new _iframeWindowDrop - target: $item[0] - classes: 'tether-theme-arrows-dark' - position: 'right top' - constrainToWindow: true - openOn: 'click' - content: ''' -
                -
              • Action 1
              • -
              • Action 2
              • -
              • Action 3
              • -
              - ''' - - $item.data('drop', drop) - - scrollInterval = undefined - scrollTop = 0 - scrollTopDirection = 1 - - setSection = (section) -> - $browserDemo.attr('data-section', section) - - $('.section-copy').removeClass('active') - $(""".section-copy[data-section="#{ section }"]""").addClass('active') - - openExampleItem = -> - if isMobile - $iframe.contents().find('.item:first').data().drop.open() - else - $iframe.contents().find('.item:eq(2)').data().drop.open() - - closeAllItems = -> - $iframe.contents().find('.item').each -> $(@).data().drop.close() or true - - scrollLeftSection = -> - scrollInterval = setInterval -> - $iframe.contents().find('.left').scrollTop scrollTop - scrollTop += scrollTopDirection - if scrollTop > 50 - scrollTopDirection = -1 - if scrollTop < 0 - scrollTopDirection = 1 - , 30 - - stopScrollingLeftSection = -> - clearInterval scrollInterval - - switch section - - when 'what' - closeAllItems() - openExampleItem() - stopScrollingLeftSection() - - when 'how' - closeAllItems() - openExampleItem() - stopScrollingLeftSection() - scrollLeftSection() - - when 'why' - closeAllItems() - openExampleItem() - stopScrollingLeftSection() - scrollLeftSection() - - when 'outro' - closeAllItems() - openExampleItem() - stopScrollingLeftSection() - -init() \ No newline at end of file diff --git a/docs/welcome/index.html b/docs/welcome/index.html index d70d00d5e..c663580f7 100644 --- a/docs/welcome/index.html +++ b/docs/welcome/index.html @@ -1,226 +1,263 @@ - - - Tether – Marrying elements for life - - + + + Tether – Marrying elements for life + + - - + + - - + + - - - + + + - - + + -
              - + +
              -
              -
              -

              Tether

              -
              -

              Marrying elements for life

              -

              - ★ On Github -

              -
              -
              +
              + + +
              +
              +
              +

              Tether

              +
              +

              Marrying elements for life

              +

              + ★ On Github +

              -
              -
              +
              + +
              +
              -
              +
              - + +
              -
              -
              -

              What is Tether?

              -
              -
              -

              How Tether works.

              -
              -
              -

              Tether is powerful.

              -
              -
              -

              Play with Tether

              + + +
              +
              +
              +

              What is Tether?

              +
              +
              +

              How Tether works.

              +
              +
              +

              Tether is powerful.

              +
              +
              +

              Play with Tether

              +
              +
              +
              +
              +
              -
              -
              -
              -
              -
              -
              - -
              -
              +
              +
              +
              -
              - - + +
              -
              -
              -

              Tether is a low-level UI library that can be used to position any element on a page next to any other element.

              -

              It can be used for dropdown menus, tooltips, popovers, tours, help information, scroll guides, autocompletes, etc. The possibilities are endless.

              -

              In this example we're showing an action menu tethered to a list item.

              -
              +
              +
              + + + +
              +
              +
              +

              Tether is a low-level UI library that can be used to position any element on a page next to any other element.

              +

              It can be used for dropdown menus, tooltips, popovers, tours, help information, scroll guides, autocompletes, etc. The possibilities are + endless.

              +

              In this example we're showing an action menu tethered to a list item.

              -
              - - + +
              -
              -
              -

              Tether works by creating an absolutely positioned element and meticulously tracking the movements of a target which you specify.

              -

              The target and element can be tethered together in a variety of different ways.

              -

              Notice how the tethered element stays tethered to its target list item even as the left pane is scrolled up and down.

              -
              +
              +
              + + + +
              +
              +
              +

              Tether works by creating an absolutely positioned element and meticulously tracking the movements of a target which you specify.

              +

              The target and element can be tethered together in a variety of different ways.

              +

              Notice how the tethered element stays tethered to its target list item even as the left pane is scrolled up + and down.

              -
              - - + +
              -
              -
              -

              Tether can keep your element positioned properly even in some tough situations.

              -

              Tether handles all of the common pain points:

              -
                -
              • Automatically detect collisions with the edge of the page or edge of the scrollParent
              • -
              • Automatically reposition on browser resize, scroll, and other events,
              • -
              • Constrain the position to any bounding box,
              • -
              -

              ...and a lot more.

              -
              +
              +
              + + + +
              +
              +
              +

              Tether can keep your element positioned properly even in some tough situations.

              +

              Tether handles all of the common pain points:

              +
                +
              • Automatically detect collisions with the edge of the page or edge of the scrollParent
              • +
              • Automatically reposition on browser resize, scroll, and other events,
              • +
              • Constrain the position to any bounding box,
              • +
              +

              ...and a lot more.

              -
              - - + +
              -
              -
              -

              Interact with this demo.

              -

               

              -

              To learn more, check out our documentation.

              -
              +
              +
              + + + +
              +
              +
              +

              Interact with this demo.

              +

               

              +

              To learn more, check out our documentation.

              -
              +
              +
              -
              + + + + +
              -
              +
              - + +
              - +
              - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + diff --git a/docs/welcome/js/drop.js b/docs/welcome/js/drop.js index 005881940..0ab4a5337 100644 --- a/docs/welcome/js/drop.js +++ b/docs/welcome/js/drop.js @@ -1,25 +1,85 @@ -(function() { - var Evented, MIRROR_ATTACH, addClass, allDrops, clickEvent, createContext, extend, hasClass, removeClass, sortAttach, touchDevice, _ref, - __hasProp = {}.hasOwnProperty, - __extends = function(child, parent) { for (var key in parent) { if (__hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; }, - __indexOf = [].indexOf || function(item) { for (var i = 0, l = this.length; i < l; i++) { if (i in this && this[i] === item) return i; } return -1; }; +/*! tether-drop 1.4.1 */ - _ref = Tether.Utils, extend = _ref.extend, addClass = _ref.addClass, removeClass = _ref.removeClass, hasClass = _ref.hasClass, Evented = _ref.Evented; +(function(root, factory) { + if (typeof define === 'function' && define.amd) { + define(["tether"], factory); + } else if (typeof exports === 'object') { + module.exports = factory(require('tether')); + } else { + root.Drop = factory(root.Tether); + } +}(this, function(Tether) { - touchDevice = 'ontouchstart' in document.documentElement; + /* global Tether */ + 'use strict'; - clickEvent = touchDevice ? 'touchstart' : 'click'; + var _bind = Function.prototype.bind; - sortAttach = function(str) { - var first, second, _ref1, _ref2; - _ref1 = str.split(' '), first = _ref1[0], second = _ref1[1]; - if (first === 'left' || first === 'right') { - _ref2 = [second, first], first = _ref2[0], second = _ref2[1]; + 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'); } }; })(); + + 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; }; })(); + + var _get = function get(_x2, _x3, _x4) { var _again = true; _function: while (_again) { var object = _x2, property = _x3, receiver = _x4; _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 { _x2 = parent; _x3 = property; _x4 = 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); } } }; + + function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError('Cannot call a class as a function'); } } + + 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; } + + var _Tether$Utils = Tether.Utils; + var extend = _Tether$Utils.extend; + var addClass = _Tether$Utils.addClass; + var removeClass = _Tether$Utils.removeClass; + var hasClass = _Tether$Utils.hasClass; + var Evented = _Tether$Utils.Evented; + + function sortAttach(str) { + var _str$split = str.split(' '); + + var _str$split2 = _slicedToArray(_str$split, 2); + + var first = _str$split2[0]; + var second = _str$split2[1]; + + if (['left', 'right'].indexOf(first) >= 0) { + var _ref = [second, first]; + first = _ref[0]; + second = _ref[1]; } return [first, second].join(' '); + } + + function removeFromArray(arr, item) { + var index = undefined; + var results = []; + while ((index = arr.indexOf(item)) !== -1) { + results.push(arr.splice(index, 1)); + } + return results; + } + + var clickEvents = ['click']; + if ('ontouchstart' in document.documentElement) { + clickEvents.push('touchstart'); + } + + var transitionEndEvents = { + 'WebkitTransition': 'webkitTransitionEnd', + 'MozTransition': 'transitionend', + 'OTransition': 'otransitionend', + 'transition': 'transitionend' }; - MIRROR_ATTACH = { + var transitionEndEvent = ''; + for (var _name in transitionEndEvents) { + if (({}).hasOwnProperty.call(transitionEndEvents, _name)) { + var tempEl = document.createElement('p'); + if (typeof tempEl.style[_name] !== 'undefined') { + transitionEndEvent = transitionEndEvents[_name]; + } + } + } + + var MIRROR_ATTACH = { left: 'right', right: 'left', top: 'bottom', @@ -28,212 +88,473 @@ center: 'center' }; - allDrops = {}; + var allDrops = {}; - createContext = function(options) { - var DropInstance, defaultOptions, drop, _name; - if (options == null) { - options = {}; - } - drop = function() { - return (function(func, args, ctor) { - ctor.prototype = func.prototype; - var child = new ctor, result = func.apply(child, args); - return Object(result) === result ? result : child; - })(DropInstance, arguments, function(){}); +// Drop can be included in external libraries. Calling createContext gives you a fresh +// copy of drop which won't interact with other copies on the page (beyond calling the document events). + + function createContext() { + var options = arguments.length <= 0 || arguments[0] === undefined ? {} : arguments[0]; + + var drop = function drop() { + for (var _len = arguments.length, args = Array(_len), _key = 0; _key < _len; _key++) { + args[_key] = arguments[_key]; + } + + return new (_bind.apply(DropInstance, [null].concat(args)))(); }; + extend(drop, { createContext: createContext, drops: [], defaults: {} }); - defaultOptions = { + + var defaultOptions = { classPrefix: 'drop', defaults: { - attach: 'bottom left', + position: 'bottom left', openOn: 'click', + beforeClose: null, constrainToScrollParent: true, constrainToWindow: true, classes: '', + remove: false, + openDelay: 0, + closeDelay: 50, + // inherited from openDelay and closeDelay if not explicitly defined + focusDelay: null, + blurDelay: null, + hoverOpenDelay: null, + hoverCloseDelay: null, tetherOptions: {} } }; + extend(drop, defaultOptions, options); extend(drop.defaults, defaultOptions.defaults, options.defaults); - if (allDrops[_name = drop.classPrefix] == null) { - allDrops[_name] = []; + + if (typeof allDrops[drop.classPrefix] === 'undefined') { + allDrops[drop.classPrefix] = []; } - drop.updateBodyClasses = function() { - var anyOpen, _drop, _i, _len, _ref1; - anyOpen = false; - _ref1 = allDrops[drop.classPrefix]; - for (_i = 0, _len = _ref1.length; _i < _len; _i++) { - _drop = _ref1[_i]; - if (!(_drop.isOpened())) { - continue; - } - anyOpen = true; - break; + + drop.updateBodyClasses = function () { + // There is only one body, so despite the context concept, we still iterate through all + // drops which share our classPrefix. + + var anyOpen = false; + var drops = allDrops[drop.classPrefix]; + var len = drops.length; + for (var i = 0; i < len; ++i) { + if (drops[i].isOpened()) { + anyOpen = true; + break; + } } + if (anyOpen) { - return addClass(document.body, "" + drop.classPrefix + "-open"); + addClass(document.body, drop.classPrefix + '-open'); } else { - return removeClass(document.body, "" + drop.classPrefix + "-open"); + removeClass(document.body, drop.classPrefix + '-open'); } }; - DropInstance = (function(_super) { - __extends(DropInstance, _super); - function DropInstance(options) { - this.options = options; - this.options = extend({}, drop.defaults, this.options); + var DropInstance = (function (_Evented) { + _inherits(DropInstance, _Evented); + + function DropInstance(opts) { + _classCallCheck(this, DropInstance); + + _get(Object.getPrototypeOf(DropInstance.prototype), 'constructor', this).call(this); + this.options = extend({}, drop.defaults, opts); this.target = this.options.target; - if (this.target == null) { + + if (typeof this.target === 'undefined') { throw new Error('Drop Error: You must provide a target.'); } + + var dataPrefix = 'data-' + drop.classPrefix; + + var contentAttr = this.target.getAttribute(dataPrefix); + if (contentAttr && this.options.content == null) { + this.options.content = contentAttr; + } + + var attrsOverride = ['position', 'openOn']; + for (var i = 0; i < attrsOverride.length; ++i) { + + var override = this.target.getAttribute(dataPrefix + '-' + attrsOverride[i]); + if (override && this.options[attrsOverride[i]] == null) { + this.options[attrsOverride[i]] = override; + } + } + + if (this.options.classes && this.options.addTargetClasses !== false) { + addClass(this.target, this.options.classes); + } + drop.drops.push(this); allDrops[drop.classPrefix].push(this); + + this._boundEvents = []; + this.bindMethods(); this.setupElements(); this.setupEvents(); this.setupTether(); } - DropInstance.prototype.setupElements = function() { - this.drop = document.createElement('div'); - addClass(this.drop, drop.classPrefix); - if (this.options.classes) { - addClass(this.drop, this.options.classes); - } - this.dropContent = document.createElement('div'); - addClass(this.dropContent, "" + drop.classPrefix + "-content"); - if (typeof this.options.content === 'object') { - this.dropContent.appendChild(this.options.content); - } else { - this.dropContent.innerHTML = this.options.content; - } - return this.drop.appendChild(this.dropContent); - }; - - DropInstance.prototype.setupTether = function() { - var constraints, dropAttach; - dropAttach = this.options.position.split(' '); - dropAttach[0] = MIRROR_ATTACH[dropAttach[0]]; - dropAttach = dropAttach.join(' '); - constraints = []; - if (this.options.constrainToScrollParent) { - constraints.push({ - to: 'scrollParent', - pin: 'top, bottom', - attachment: 'together none' - }); + _createClass(DropInstance, [{ + key: '_on', + value: function _on(element, event, handler) { + this._boundEvents.push({ element: element, event: event, handler: handler }); + element.addEventListener(event, handler); } - if (this.options.constrainToWindow !== false) { - constraints.push({ - to: 'window', - pin: true, - attachment: 'together' - }); + }, { + key: 'bindMethods', + value: function bindMethods() { + this.transitionEndHandler = this._transitionEndHandler.bind(this); } - constraints.push({ - to: 'scrollParent' - }); - options = { - element: this.drop, - target: this.target, - attachment: sortAttach(dropAttach), - targetAttachment: sortAttach(this.options.position), - classPrefix: drop.classPrefix, - offset: '0 0', - targetOffset: '0 0', - enabled: false, - constraints: constraints - }; - if (this.options.tether !== false) { - return this.tether = new Tether(extend({}, options, this.options.tether)); - } - }; - - DropInstance.prototype.setupEvents = function() { - var events, - _this = this; - if (!this.options.openOn) { - return; - } - events = this.options.openOn.split(' '); - if (__indexOf.call(events, 'click') >= 0) { - this.target.addEventListener(clickEvent, function() { - return _this.toggle(); - }); - document.addEventListener(clickEvent, function(event) { - if (!_this.isOpened()) { - return; + }, { + key: 'setupElements', + value: function setupElements() { + var _this = this; + + this.drop = document.createElement('div'); + addClass(this.drop, drop.classPrefix); + + if (this.options.classes) { + addClass(this.drop, this.options.classes); + } + + this.content = document.createElement('div'); + addClass(this.content, drop.classPrefix + '-content'); + + if (typeof this.options.content === 'function') { + var generateAndSetContent = function generateAndSetContent() { + // content function might return a string or an element + var contentElementOrHTML = _this.options.content.call(_this, _this); + + if (typeof contentElementOrHTML === 'string') { + _this.content.innerHTML = contentElementOrHTML; + } else if (typeof contentElementOrHTML === 'object') { + _this.content.innerHTML = ''; + _this.content.appendChild(contentElementOrHTML); + } else { + throw new Error('Drop Error: Content function should return a string or HTMLElement.'); + } + }; + + generateAndSetContent(); + this.on('open', generateAndSetContent.bind(this)); + } else if (typeof this.options.content === 'object') { + this.content.appendChild(this.options.content); + } else { + this.content.innerHTML = this.options.content; + } + + this.drop.appendChild(this.content); + } + }, { + key: 'setupTether', + value: function setupTether() { + // Tether expects two attachment points, one in the target element, one in the + // drop. We use a single one, and use the order as well, to allow us to put + // the drop on either side of any of the four corners. This magic converts between + // the two: + var dropAttach = this.options.position.split(' '); + dropAttach[0] = MIRROR_ATTACH[dropAttach[0]]; + dropAttach = dropAttach.join(' '); + + var constraints = []; + if (this.options.constrainToScrollParent) { + constraints.push({ + to: 'scrollParent', + pin: 'top, bottom', + attachment: 'together none' + }); + } else { + // To get 'out of bounds' classes + constraints.push({ + to: 'scrollParent' + }); + } + + if (this.options.constrainToWindow !== false) { + constraints.push({ + to: 'window', + attachment: 'together' + }); + } else { + // To get 'out of bounds' classes + constraints.push({ + to: 'window' + }); + } + + var opts = { + element: this.drop, + target: this.target, + attachment: sortAttach(dropAttach), + targetAttachment: sortAttach(this.options.position), + classPrefix: drop.classPrefix, + offset: '0 0', + targetOffset: '0 0', + enabled: false, + constraints: constraints, + addTargetClasses: this.options.addTargetClasses + }; + + if (this.options.tetherOptions !== false) { + this.tether = new Tether(extend({}, opts, this.options.tetherOptions)); + } + } + }, { + key: 'setupEvents', + value: function setupEvents() { + var _this2 = this; + + if (!this.options.openOn) { + return; + } + + if (this.options.openOn === 'always') { + setTimeout(this.open.bind(this)); + return; + } + + var events = this.options.openOn.split(' '); + + if (events.indexOf('click') >= 0) { + var openHandler = function openHandler(event) { + _this2.toggle(event); + event.preventDefault(); + }; + + var closeHandler = function closeHandler(event) { + if (!_this2.isOpened()) { + return; + } + + // Clicking inside dropdown + if (event.target === _this2.drop || _this2.drop.contains(event.target)) { + return; + } + + // Clicking target + if (event.target === _this2.target || _this2.target.contains(event.target)) { + return; + } + + _this2.close(event); + }; + + for (var i = 0; i < clickEvents.length; ++i) { + var clickEvent = clickEvents[i]; + this._on(this.target, clickEvent, openHandler); + this._on(document, clickEvent, closeHandler); } - if (event.target === _this.drop || _this.drop.contains(event.target)) { - return; + } + + var inTimeout = null; + var outTimeout = null; + + var inHandler = function inHandler(event) { + if (outTimeout !== null) { + clearTimeout(outTimeout); + } else { + inTimeout = setTimeout(function () { + _this2.open(event); + inTimeout = null; + }, (event.type === 'focus' ? _this2.options.focusDelay : _this2.options.hoverOpenDelay) || _this2.options.openDelay); } - if (event.target === _this.target || _this.target.contains(event.target)) { - return; + }; + + var outHandler = function outHandler(event) { + if (inTimeout !== null) { + clearTimeout(inTimeout); + } else { + outTimeout = setTimeout(function () { + _this2.close(event); + outTimeout = null; + }, (event.type === 'blur' ? _this2.options.blurDelay : _this2.options.hoverCloseDelay) || _this2.options.closeDelay); } - return _this.close(); - }); + }; + + if (events.indexOf('hover') >= 0) { + this._on(this.target, 'mouseover', inHandler); + this._on(this.drop, 'mouseover', inHandler); + this._on(this.target, 'mouseout', outHandler); + this._on(this.drop, 'mouseout', outHandler); + } + + if (events.indexOf('focus') >= 0) { + this._on(this.target, 'focus', inHandler); + this._on(this.drop, 'focus', inHandler); + this._on(this.target, 'blur', outHandler); + this._on(this.drop, 'blur', outHandler); + } } - if (__indexOf.call(events, 'hover') >= 0) { - this.target.addEventListener('mouseover', function() { - return _this.open(); - }); - return this.target.addEventListener('mouseout', function() { - return _this.close(); + }, { + key: 'isOpened', + value: function isOpened() { + if (this.drop) { + return hasClass(this.drop, drop.classPrefix + '-open'); + } + } + }, { + key: 'toggle', + value: function toggle(event) { + if (this.isOpened()) { + this.close(event); + } else { + this.open(event); + } + } + }, { + key: 'open', + value: function open(event) { + var _this3 = this; + + /* eslint no-unused-vars: 0 */ + if (this.isOpened()) { + return; + } + + if (!this.drop.parentNode) { + document.body.appendChild(this.drop); + } + + if (typeof this.tether !== 'undefined') { + this.tether.enable(); + } + + addClass(this.drop, drop.classPrefix + '-open'); + addClass(this.drop, drop.classPrefix + '-open-transitionend'); + + setTimeout(function () { + if (_this3.drop) { + addClass(_this3.drop, drop.classPrefix + '-after-open'); + } }); + + if (typeof this.tether !== 'undefined') { + this.tether.position(); + } + + this.trigger('open'); + + drop.updateBodyClasses(); } - }; + }, { + key: '_transitionEndHandler', + value: function _transitionEndHandler(e) { + if (e.target !== e.currentTarget) { + return; + } - DropInstance.prototype.isOpened = function() { - return hasClass(this.drop, "" + drop.classPrefix + "-open"); - }; + if (!hasClass(this.drop, drop.classPrefix + '-open')) { + removeClass(this.drop, drop.classPrefix + '-open-transitionend'); + } + this.drop.removeEventListener(transitionEndEvent, this.transitionEndHandler); + } + }, { + key: 'beforeCloseHandler', + value: function beforeCloseHandler(event) { + var shouldClose = true; + + if (!this.isClosing && typeof this.options.beforeClose === 'function') { + this.isClosing = true; + shouldClose = this.options.beforeClose(event, this) !== false; + } + + this.isClosing = false; - DropInstance.prototype.toggle = function() { - if (this.isOpened()) { - return this.close(); - } else { - return this.open(); + return shouldClose; } - }; + }, { + key: 'close', + value: function close(event) { + if (!this.isOpened()) { + return; + } + + if (!this.beforeCloseHandler(event)) { + return; + } + + removeClass(this.drop, drop.classPrefix + '-open'); + removeClass(this.drop, drop.classPrefix + '-after-open'); + + this.drop.addEventListener(transitionEndEvent, this.transitionEndHandler); - DropInstance.prototype.open = function() { - var _ref1; - if (!this.drop.parentNode) { - document.body.appendChild(this.drop); + this.trigger('close'); + + if (typeof this.tether !== 'undefined') { + this.tether.disable(); + } + + drop.updateBodyClasses(); + + if (this.options.remove) { + this.remove(event); + } } - addClass(this.target, "" + drop.classPrefix + "-open"); - addClass(this.drop, "" + drop.classPrefix + "-open"); - if ((_ref1 = this.tether) != null) { - _ref1.enable(); + }, { + key: 'remove', + value: function remove(event) { + this.close(event); + if (this.drop.parentNode) { + this.drop.parentNode.removeChild(this.drop); + } } - this.trigger('open'); - return drop.updateBodyClasses(); - }; + }, { + key: 'position', + value: function position() { + if (this.isOpened() && typeof this.tether !== 'undefined') { + this.tether.position(); + } + } + }, { + key: 'destroy', + value: function destroy() { + this.remove(); + + if (typeof this.tether !== 'undefined') { + this.tether.destroy(); + } + + for (var i = 0; i < this._boundEvents.length; ++i) { + var _boundEvents$i = this._boundEvents[i]; + var element = _boundEvents$i.element; + var _event = _boundEvents$i.event; + var handler = _boundEvents$i.handler; - DropInstance.prototype.close = function() { - var _ref1; - removeClass(this.target, "" + drop.classPrefix + "-open"); - removeClass(this.drop, "" + drop.classPrefix + "-open"); - this.trigger('close'); - if ((_ref1 = this.tether) != null) { - _ref1.disable(); + element.removeEventListener(_event, handler); + } + + this._boundEvents = []; + + this.tether = null; + this.drop = null; + this.content = null; + this.target = null; + + removeFromArray(allDrops[drop.classPrefix], this); + removeFromArray(drop.drops, this); } - return drop.updateBodyClasses(); - }; + }]); return DropInstance; - })(Evented); + return drop; - }; + } - window.Drop = createContext(); + var Drop = createContext(); - document.addEventListener('DOMContentLoaded', function() { - return Drop.updateBodyClasses(); + document.addEventListener('DOMContentLoaded', function () { + Drop.updateBodyClasses(); }); + return Drop; -}).call(this); \ No newline at end of file +})); diff --git a/docs/welcome/js/tether-v0.1.3.js b/docs/welcome/js/tether-v0.1.3.js deleted file mode 100644 index 98af16f1b..000000000 --- a/docs/welcome/js/tether-v0.1.3.js +++ /dev/null @@ -1,2 +0,0 @@ -/*! tether.js 0.1.3 */ -(function(){var a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r=[].slice,s=function(a,b){return function(){return a.apply(b,arguments)}};a=jQuery,l=/msie [\w.]+/.test(navigator.userAgent.toLowerCase()),k=function(b){var c,d;return c=b.css("position"),"fixed"===c?b:(d=void 0,d="absolute"===c||l&&("static"===c||"relative"===c)?b.parents().filter(function(){var b;return("relative"===(b=a.css(this,"position"))||"absolute"===b||"fixed"===b)&&/(auto|scroll)/.test(a.css(this,"overflow")+a.css(this,"overflow-y")+a.css(this,"overflow-x"))}).first():b.parents().filter(function(){return/(auto|scroll)/.test(a.css(this,"overflow")+a.css(this,"overflow-y")+a.css(this,"overflow-x"))}).first(),d.length?d:a("html"))},b=16,j=function(a,c){var d;return null==c&&(c=b),d=!1,function(){var b,e=this;if(!d)return b=arguments,d=!0,setTimeout(function(){return d=!1,a.apply(e,b)},c),!0}},q=[],p=function(){var a,b,c;for(b=0,c=q.length;c>b;b++)a=q[b],a.position();return!0},l&&(p=j(p)),a(window).on("resize scroll",p),c={center:"center",left:"right",right:"left"},d={middle:"middle",top:"bottom",bottom:"top"},e={top:"0",left:"0",middle:"50%",center:"50%",bottom:"100%",right:"100%"},i=function(a,b){var e,f;return e=a.left,f=a.top,"auto"===e&&(e=c[b.left]),"auto"===f&&(f=d[b.top]),{left:e,top:f}},h=function(a){var b,c;return{left:null!=(b=e[a.left])?b:a.left,top:null!=(c=e[a.top])?c:a.top}},g=function(){var a,b,c,d,e,f,g;for(b=1<=arguments.length?r.call(arguments,0):[],c={top:0,left:0},e=0,f=b.length;f>e;e++)g=b[e],d=g.top,a=g.left,"string"==typeof d&&(d=parseFloat(d,10)),"string"==typeof a&&(a=parseFloat(a,10)),c.top+=d,c.left+=a;return c},m=function(b,c){return"string"==typeof b.left&&-1!==b.left.indexOf("%")&&(b.left=parseFloat(b.left,10)/100*a(c).outerWidth()),"string"==typeof b.top&&-1!==b.top.indexOf("%")&&(b.top=parseFloat(b.top,10)/100*a(c).outerHeight()),b},n=o=function(a){var b,c,d;return d=a.split(" "),c=d[0],b=d[1],{top:c,left:b}},f=function(){function b(a){this.position=s(this.position,this);var c,d,e,f,g;for(q.push(this),this.history=[],this.setOptions(a,!1),f=b.modules,d=0,e=f.length;e>d;d++)c=f[d],null!=(g=c.initialize)&&g.call(this);this.position()}return b.modules=[],b.prototype.setOptions=function(b,c){var d,e;return this.options=b,null==c&&(c=!0),d={offset:"0 0",targetOffset:"0 0",targetAttachment:"auto auto"},this.options=a.extend(d,this.options),e=this.options,this.element=e.element,this.target=e.target,this.element.jquery&&(this.$element=this.element,this.element=this.element[0]),this.target.jquery&&(this.$target=this.target,this.target=this.target[0]),null==this.$element&&(this.$element=a(this.element)),null==this.$target&&(this.$target=a(this.target)),this.$element.addClass("tether-element"),this.$target.addClass("tether-target"),this.targetAttachment=n(this.options.targetAttachment),this.attachment=n(this.options.attachment),this.offset=o(this.options.offset),this.targetOffset=o(this.options.targetOffset),null!=this.scrollParent&&this.disable(),this.scrollParent=k(a(this.target)),this.options.enabled!==!1?this.enable(c):void 0},b.prototype.enable=function(a){return null==a&&(a=!0),this.addClass("tether-enabled"),this.enabled=!0,this.scrollParent.on("scroll",this.position),a?this.position():void 0},b.prototype.disable=function(){return this.removeClass("tether-enabled"),this.enabled=!1,null!=this.scrollParent?this.scrollParent.off("scroll",this.position):void 0},b.prototype.destroy=function(){var a,b,c,d,e;for(this.disable(),e=[],a=c=0,d=q.length;d>c;a=++c){if(b=q[a],b===this){q.splice(a,1);break}e.push(void 0)}return e},b.prototype.updateAttachClasses=function(a,b){var c,d,e,f,g,h;for(null==a&&(a=this.attachment),null==b&&(b=this.targetAttachment),d=["left","top","bottom","right","middle","center"],e=0,g=d.length;g>e;e++)c=d[e],this.removeClass("tether-element-attached-"+c);for(a.top&&this.addClass("tether-element-attached-"+a.top),a.left&&this.addClass("tether-element-attached-"+a.left),f=0,h=d.length;h>f;f++)c=d[f],this.removeClass("tether-target-attached-"+c);return b.top&&this.addClass("tether-target-attached-"+b.top),b.left?this.addClass("tether-target-attached-"+b.left):void 0},b.prototype.addClass=function(a){return this.$element.addClass(a),this.$target.addClass(a)},b.prototype.removeClass=function(a){return this.$element.removeClass(a),this.$target.removeClass(a)},b.prototype.position=function(){var a,c,d,e,f,j,k,l,n,o,p,q,r,s,t,u,v,w,x,y,z,A,B,C,D,E,F;if(this.enabled){for(u=i(this.targetAttachment,this.attachment),this.updateAttachClasses(this.attachment,u),n=m(h(this.attachment),this.element),v=m(h(u),this.target),f=m(this.offset,this.element),j=m(this.targetOffset,this.target),n=g(n,f),v=g(v,j),w=this.$target.offset(),c=this.$element.offset(),e=w.left+v.left-n.left,x=w.top+v.top-n.top,D=b.modules,z=0,B=D.length;B>z;z++)if(k=D[z],q=k.position.call(this,{left:e,top:x,targetAttachment:u,targetPos:w,elementPos:c,offset:n,targetOffset:v,manualOffset:f,manualTargetOffset:j}),null!=q&&"object"==typeof q){if(q===!1)return!1;x=q.top,e=q.left}if(y=this.$element.outerWidth(),d=this.$element.outerHeight(),l={page:{top:x,bottom:document.body.scrollHeight-x-d,left:e,right:document.body.scrollWidth-e-y},viewport:{top:x-pageYOffset,bottom:pageYOffset-x-d+innerHeight,left:e-pageXOffset,right:pageXOffset-e-y+innerWidth}},(null!=(E=this.options.optimizations)?E.moveElement:void 0)!==!1){for(a=this.$target.offsetParent(),p=a.offset(),o={},F=["top","left","bottom","right"],A=0,C=F.length;C>A;A++)t=F[A],o[t]=parseFloat(a.css("border-"+t+"-width"));p.left+=o.left,p.top+=o.top,p.right=document.body.scrollWidth-p.left-a.width(),p.bottom=document.body.scrollHeight-p.top-a.height(),l.page.top>=p.top&&l.page.bottom>=p.bottom&&l.page.left>=p.left&&l.page.right>=p.right&&(s=a.scrollTop(),r=a.scrollLeft(),l.offset={top:l.page.top-p.top+s+o.top,left:l.page.left-p.left+r+o.left,right:l.page.right-p.right-r+o.right,bottom:l.page.bottom-p.bottom-s+o.bottom})}return this.move(l),this.history.unshift(l),this.history.length>3&&this.history.pop(),!0}},b.prototype.move=function(b){var c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u,v;j={};for(m in b){j[m]={};for(f in b[m]){for(e=!1,t=this.history,p=0,r=t.length;r>p;p++)if(i=t[p],(null!=(u=i[m])?u[f]:void 0)!==b[m][f]){e=!0;break}e||(j[m][f]=!0)}}if(d={top:"",left:"",right:"",bottom:""},l=function(a,b){return a.top?d.top=""+b.top+"px":d.bottom=""+b.bottom+"px",a.left?d.left=""+b.left+"px":d.right=""+b.right+"px"},g=!1,(j.page.top||j.page.bottom)&&(j.page.left||j.page.right))d.position="absolute",l(j.page,b.page);else if((j.viewport.top||j.viewport.bottom)&&(j.viewport.left||j.viewport.right))d.position="fixed",l(j.viewport,b.viewport);else if(null!=j.offset&&(j.offset.top||j.offset.bottom)&&(j.offset.left||j.offset.right)){for(d.position="absolute",c=this.$target.offsetParent(),this.$element.offsetParent()[0]!==c[0]&&(this.$element.detach(),c.append(this.$element)),h=a.extend({},b.offset),v=["top","left","bottom","right"],q=0,s=v.length;s>q;q++)k=v[q],h[k]-=parseFloat(c.css("border-"+k+"-width"),10);l(j.offset,h),g=!0}else d.position="absolute",d.top=""+b.page.top+"px",d.left=""+b.page.left+"px";g||this.$element.parent().is("body")||(this.$element.detach(),a(document.body).append(this.$element)),o=!1;for(f in d)if(n=d[f],this.$element.css(f)!==n){o=!0;break}return o?this.$element.css(d):void 0},b}(),window.Tether=f}).call(this),function(){var a,b,c,d,e=[].indexOf||function(a){for(var b=0,c=this.length;c>b;b++)if(b in this&&this[b]===a)return b;return-1};a=jQuery,c={left:"right",right:"left",top:"bottom",bottom:"top",middle:"middle"},b=["left","top","right","bottom"],d=function(c,d){var e,f,g,h,i,j;if("scrollParent"===d?d=c.scrollParent[0]:"window"===d&&(d=[pageXOffset,pageYOffset,innerWidth+pageXOffset,innerHeight+pageYOffset]),null!=d.nodeType)for(e=a(d),g=e.offset(),d=[g.left,g.top,e.width()+g.left,e.height()+g.top],f=i=0,j=b.length;j>i;f=++i)h=b[f],d[f]+=parseFloat(e.css("border-"+h+"-width"),10);return d},Tether.modules.push({position:function(c){var f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u,v,w,x,y,z,A,B,C,D,E,F,G,H,I,J,K,L,M,N,O,P,Q,R,S,T=this;if(C=c.top,n=c.left,y=c.targetAttachment,this.options.constraints){for(u=function(a){var c,d,e,f;for(T.removeClass(a),f=[],d=0,e=b.length;e>d;d++)c=b[d],f.push(T.removeClass(""+a+"-"+c));return f},m=this.$element.outerHeight(),D=this.$element.outerWidth(),z=this.$target.outerHeight(),A=this.$target.outerWidth(),x={},l={},v=["tether-pinned","tether-out-of-bounds"],O=this.options.constraints,E=0,I=O.length;I>E;E++)k=O[E],k.outOfBoundsClass&&v.push(k.outOfBoundsClass),k.pinnedClass&&v.push(k.pinnedClass);for(F=0,J=v.length;J>F;F++)j=v[F],u(j);for(x=a.extend({},y),l=a.extend({},this.attachment),P=this.options.constraints,G=0,K=P.length;K>G;G++){if(k=P[G],B=k.to,f=k.attachment,r=k.pin,null==f&&(f=""),e.call(f," ")>=0?(Q=f.split(" "),i=Q[0],h=Q[1]):h=i=f,g=d(this,B),("target"===i||"both"===i)&&(Cg[3]&&"bottom"===x.top&&(C-=z,x.top="top")),"together"===i&&(Cg[3]&&"bottom"===x.top&&("top"===l.top?(C-=z,x.top="top",C-=m,l.top="bottom"):"bottom"===l.top&&(C-=z,x.top="top",C+=m,l.top="top"))),("target"===h||"both"===h)&&(ng[2]&&"right"===x.left&&(n-=A,x.left="left")),"together"===h&&(ng[2]&&"right"===x.left&&("left"===l.left?(n-=A,x.left="left",n-=D,l.left="right"):"right"===l.left&&(n-=A,x.left="left",n+=D,l.left="left"))),("element"===i||"both"===i)&&(Cg[3]&&"top"===l.top&&(C-=m,l.top="bottom")),("element"===h||"both"===h)&&(ng[2]&&"left"===l.left&&(n-=D,l.left="right")),"string"==typeof r?r=function(){var a,b,c,d;for(c=r.split(","),d=[],a=0,b=c.length;b>a;a++)q=c[a],d.push(q.trim());return d}():r===!0&&(r=["top","left","right","bottom"]),r||(r=[]),s=[],o=[],C=0?(C=g[1],s.push("top")):o.push("top")),C+m>g[3]&&(e.call(r,"bottom")>=0?(C=g[3]-m,s.push("bottom")):o.push("bottom")),n=0?(n=g[0],s.push("left")):o.push("left")),n+D>g[2]&&(e.call(r,"right")>=0?(n=g[2]-D,s.push("right")):o.push("right")),s.length)for(t=null!=(R=this.options.pinnedClass)?R:"tether-pinned",this.addClass(t),H=0,L=s.length;L>H;H++)w=s[H],this.addClass(""+t+"-"+w);if(o.length)for(p=null!=(S=this.options.outOfBoundsClass)?S:"tether-out-of-bounds",this.addClass(p),N=0,M=o.length;M>N;N++)w=o[N],this.addClass(""+p+"-"+w);(e.call(s,"left")>=0||e.call(s,"right")>=0)&&(l.left=x.left=!1),(e.call(s,"top")>=0||e.call(s,"bottom")>=0)&&(l.top=x.top=!1),(x.top!==y.top||x.left!==y.left||l.top!==this.attachment.top||l.left!==this.attachment.left)&&this.updateAttachClasses(l,x)}return{top:C,left:n}}}})}.call(this),function(){var a;a=jQuery,Tether.modules.push({position:function(a){var b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u,v,w,x,y;if(l=a.top,e=a.left,d=this.$element.outerHeight(),m=this.$element.outerWidth(),i=this.$target.outerHeight(),k=this.$target.outerWidth(),j=this.$target.offset(),j.bottom=j.top+i,j.right=j.left+k,c=l+d,f=e+m,b=[],l<=j.bottom&&c>=j.top)for(v=["left","right"],n=0,r=v.length;r>n;n++)g=v[n],((w=j[g])===e||w===f)&&b.push(g);if(e<=j.right&&f>=j.left)for(x=["top","bottom"],o=0,s=x.length;s>o;o++)g=x[o],((y=j[g])===l||y===c)&&b.push(g);for(h=["left","top","right","bottom"],this.removeClass("tether-abutted"),p=0,t=h.length;t>p;p++)g=h[p],this.removeClass("tether-abutted-"+g);for(b.length&&this.addClass("tether-abutted"),q=0,u=b.length;u>q;q++)g=b[q],this.addClass("tether-abutted-"+g);return!0}})}.call(this),function(){Tether.modules.push({position:function(a){var b,c,d,e,f,g,h;return g=a.top,b=a.left,this.options.shift?(c=function(a){return"function"==typeof a?a.call(this,{top:g,left:b}):a},d=c(this.options.shift),"string"==typeof d?(d=d.split(" "),d[1]||(d[1]=d[0]),f=d[0],e=d[1],f=parseFloat(f,10),e=parseFloat(e,10)):(h=[d.top,d.left],f=h[0],e=h[1]),g+=f,b+=e,{top:g,left:b}):void 0}})}.call(this); \ No newline at end of file From dc4a9589468d53172951fa427796cebc8378b994 Mon Sep 17 00:00:00 2001 From: Robert Wagner Date: Wed, 18 Sep 2019 00:27:08 -0400 Subject: [PATCH 17/40] Rebuild docs --- docs/welcome/js/drop.js | 649 ++++++++++------------------------------ 1 file changed, 164 insertions(+), 485 deletions(-) diff --git a/docs/welcome/js/drop.js b/docs/welcome/js/drop.js index 0ab4a5337..cf4262bff 100644 --- a/docs/welcome/js/drop.js +++ b/docs/welcome/js/drop.js @@ -1,85 +1,25 @@ -/*! tether-drop 1.4.1 */ +(function() { + var Evented, MIRROR_ATTACH, addClass, allDrops, clickEvent, createContext, extend, hasClass, removeClass, sortAttach, touchDevice, _ref, + __hasProp = {}.hasOwnProperty, + __extends = function(child, parent) { for (var key in parent) { if (__hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; }, + __indexOf = [].indexOf || function(item) { for (var i = 0, l = this.length; i < l; i++) { if (i in this && this[i] === item) return i; } return -1; }; -(function(root, factory) { - if (typeof define === 'function' && define.amd) { - define(["tether"], factory); - } else if (typeof exports === 'object') { - module.exports = factory(require('tether')); - } else { - root.Drop = factory(root.Tether); - } -}(this, function(Tether) { + _ref = Tether.Utils, extend = _ref.extend, addClass = _ref.addClass, removeClass = _ref.removeClass, hasClass = _ref.hasClass, Evented = _ref.Evented; - /* global Tether */ - 'use strict'; + touchDevice = 'ontouchstart' in document.documentElement; - var _bind = Function.prototype.bind; + clickEvent = touchDevice ? 'touchstart' : 'click'; - 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'); } }; })(); - - 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; }; })(); - - var _get = function get(_x2, _x3, _x4) { var _again = true; _function: while (_again) { var object = _x2, property = _x3, receiver = _x4; _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 { _x2 = parent; _x3 = property; _x4 = 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); } } }; - - function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError('Cannot call a class as a function'); } } - - 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; } - - var _Tether$Utils = Tether.Utils; - var extend = _Tether$Utils.extend; - var addClass = _Tether$Utils.addClass; - var removeClass = _Tether$Utils.removeClass; - var hasClass = _Tether$Utils.hasClass; - var Evented = _Tether$Utils.Evented; - - function sortAttach(str) { - var _str$split = str.split(' '); - - var _str$split2 = _slicedToArray(_str$split, 2); - - var first = _str$split2[0]; - var second = _str$split2[1]; - - if (['left', 'right'].indexOf(first) >= 0) { - var _ref = [second, first]; - first = _ref[0]; - second = _ref[1]; + sortAttach = function(str) { + var first, second, _ref1, _ref2; + _ref1 = str.split(' '), first = _ref1[0], second = _ref1[1]; + if (first === 'left' || first === 'right') { + _ref2 = [second, first], first = _ref2[0], second = _ref2[1]; } return [first, second].join(' '); - } - - function removeFromArray(arr, item) { - var index = undefined; - var results = []; - while ((index = arr.indexOf(item)) !== -1) { - results.push(arr.splice(index, 1)); - } - return results; - } - - var clickEvents = ['click']; - if ('ontouchstart' in document.documentElement) { - clickEvents.push('touchstart'); - } - - var transitionEndEvents = { - 'WebkitTransition': 'webkitTransitionEnd', - 'MozTransition': 'transitionend', - 'OTransition': 'otransitionend', - 'transition': 'transitionend' }; - var transitionEndEvent = ''; - for (var _name in transitionEndEvents) { - if (({}).hasOwnProperty.call(transitionEndEvents, _name)) { - var tempEl = document.createElement('p'); - if (typeof tempEl.style[_name] !== 'undefined') { - transitionEndEvent = transitionEndEvents[_name]; - } - } - } - - var MIRROR_ATTACH = { + MIRROR_ATTACH = { left: 'right', right: 'left', top: 'bottom', @@ -88,473 +28,212 @@ center: 'center' }; - var allDrops = {}; - -// Drop can be included in external libraries. Calling createContext gives you a fresh -// copy of drop which won't interact with other copies on the page (beyond calling the document events). - - function createContext() { - var options = arguments.length <= 0 || arguments[0] === undefined ? {} : arguments[0]; - - var drop = function drop() { - for (var _len = arguments.length, args = Array(_len), _key = 0; _key < _len; _key++) { - args[_key] = arguments[_key]; - } + allDrops = {}; - return new (_bind.apply(DropInstance, [null].concat(args)))(); + createContext = function(options) { + var DropInstance, defaultOptions, drop, _name; + if (options == null) { + options = {}; + } + drop = function() { + return (function(func, args, ctor) { + ctor.prototype = func.prototype; + var child = new ctor, result = func.apply(child, args); + return Object(result) === result ? result : child; + })(DropInstance, arguments, function(){}); }; - extend(drop, { createContext: createContext, drops: [], defaults: {} }); - - var defaultOptions = { + defaultOptions = { classPrefix: 'drop', defaults: { - position: 'bottom left', + attach: 'bottom left', openOn: 'click', - beforeClose: null, constrainToScrollParent: true, constrainToWindow: true, classes: '', - remove: false, - openDelay: 0, - closeDelay: 50, - // inherited from openDelay and closeDelay if not explicitly defined - focusDelay: null, - blurDelay: null, - hoverOpenDelay: null, - hoverCloseDelay: null, tetherOptions: {} } }; - extend(drop, defaultOptions, options); extend(drop.defaults, defaultOptions.defaults, options.defaults); - - if (typeof allDrops[drop.classPrefix] === 'undefined') { - allDrops[drop.classPrefix] = []; + if (allDrops[_name = drop.classPrefix] == null) { + allDrops[_name] = []; } - - drop.updateBodyClasses = function () { - // There is only one body, so despite the context concept, we still iterate through all - // drops which share our classPrefix. - - var anyOpen = false; - var drops = allDrops[drop.classPrefix]; - var len = drops.length; - for (var i = 0; i < len; ++i) { - if (drops[i].isOpened()) { - anyOpen = true; - break; - } + drop.updateBodyClasses = function() { + var anyOpen, _drop, _i, _len, _ref1; + anyOpen = false; + _ref1 = allDrops[drop.classPrefix]; + for (_i = 0, _len = _ref1.length; _i < _len; _i++) { + _drop = _ref1[_i]; + if (!(_drop.isOpened())) { + continue; + } + anyOpen = true; + break; } - if (anyOpen) { - addClass(document.body, drop.classPrefix + '-open'); + return addClass(document.body, "" + drop.classPrefix + "-open"); } else { - removeClass(document.body, drop.classPrefix + '-open'); + return removeClass(document.body, "" + drop.classPrefix + "-open"); } }; + DropInstance = (function(_super) { + __extends(DropInstance, _super); - var DropInstance = (function (_Evented) { - _inherits(DropInstance, _Evented); - - function DropInstance(opts) { - _classCallCheck(this, DropInstance); - - _get(Object.getPrototypeOf(DropInstance.prototype), 'constructor', this).call(this); - this.options = extend({}, drop.defaults, opts); + function DropInstance(options) { + this.options = options; + this.options = extend({}, drop.defaults, this.options); this.target = this.options.target; - - if (typeof this.target === 'undefined') { + if (this.target == null) { throw new Error('Drop Error: You must provide a target.'); } - - var dataPrefix = 'data-' + drop.classPrefix; - - var contentAttr = this.target.getAttribute(dataPrefix); - if (contentAttr && this.options.content == null) { - this.options.content = contentAttr; - } - - var attrsOverride = ['position', 'openOn']; - for (var i = 0; i < attrsOverride.length; ++i) { - - var override = this.target.getAttribute(dataPrefix + '-' + attrsOverride[i]); - if (override && this.options[attrsOverride[i]] == null) { - this.options[attrsOverride[i]] = override; - } - } - - if (this.options.classes && this.options.addTargetClasses !== false) { - addClass(this.target, this.options.classes); - } - drop.drops.push(this); allDrops[drop.classPrefix].push(this); - - this._boundEvents = []; - this.bindMethods(); this.setupElements(); this.setupEvents(); this.setupTether(); } - _createClass(DropInstance, [{ - key: '_on', - value: function _on(element, event, handler) { - this._boundEvents.push({ element: element, event: event, handler: handler }); - element.addEventListener(event, handler); - } - }, { - key: 'bindMethods', - value: function bindMethods() { - this.transitionEndHandler = this._transitionEndHandler.bind(this); - } - }, { - key: 'setupElements', - value: function setupElements() { - var _this = this; - - this.drop = document.createElement('div'); - addClass(this.drop, drop.classPrefix); - - if (this.options.classes) { - addClass(this.drop, this.options.classes); - } - - this.content = document.createElement('div'); - addClass(this.content, drop.classPrefix + '-content'); - - if (typeof this.options.content === 'function') { - var generateAndSetContent = function generateAndSetContent() { - // content function might return a string or an element - var contentElementOrHTML = _this.options.content.call(_this, _this); - - if (typeof contentElementOrHTML === 'string') { - _this.content.innerHTML = contentElementOrHTML; - } else if (typeof contentElementOrHTML === 'object') { - _this.content.innerHTML = ''; - _this.content.appendChild(contentElementOrHTML); - } else { - throw new Error('Drop Error: Content function should return a string or HTMLElement.'); - } - }; - - generateAndSetContent(); - this.on('open', generateAndSetContent.bind(this)); - } else if (typeof this.options.content === 'object') { - this.content.appendChild(this.options.content); - } else { - this.content.innerHTML = this.options.content; - } - - this.drop.appendChild(this.content); + DropInstance.prototype.setupElements = function() { + this.drop = document.createElement('div'); + addClass(this.drop, drop.classPrefix); + if (this.options.classes) { + addClass(this.drop, this.options.classes); + } + this.dropContent = document.createElement('div'); + addClass(this.dropContent, "" + drop.classPrefix + "-content"); + if (typeof this.options.content === 'object') { + this.dropContent.appendChild(this.options.content); + } else { + this.dropContent.innerHTML = this.options.content; + } + return this.drop.appendChild(this.dropContent); + }; + + DropInstance.prototype.setupTether = function() { + var constraints, dropAttach; + dropAttach = this.options.position.split(' '); + dropAttach[0] = MIRROR_ATTACH[dropAttach[0]]; + dropAttach = dropAttach.join(' '); + constraints = []; + if (this.options.constrainToScrollParent) { + constraints.push({ + to: 'scrollParent', + pin: 'top, bottom', + attachment: 'together none' + }); } - }, { - key: 'setupTether', - value: function setupTether() { - // Tether expects two attachment points, one in the target element, one in the - // drop. We use a single one, and use the order as well, to allow us to put - // the drop on either side of any of the four corners. This magic converts between - // the two: - var dropAttach = this.options.position.split(' '); - dropAttach[0] = MIRROR_ATTACH[dropAttach[0]]; - dropAttach = dropAttach.join(' '); - - var constraints = []; - if (this.options.constrainToScrollParent) { - constraints.push({ - to: 'scrollParent', - pin: 'top, bottom', - attachment: 'together none' - }); - } else { - // To get 'out of bounds' classes - constraints.push({ - to: 'scrollParent' - }); - } - - if (this.options.constrainToWindow !== false) { - constraints.push({ - to: 'window', - attachment: 'together' - }); - } else { - // To get 'out of bounds' classes - constraints.push({ - to: 'window' - }); - } - - var opts = { - element: this.drop, - target: this.target, - attachment: sortAttach(dropAttach), - targetAttachment: sortAttach(this.options.position), - classPrefix: drop.classPrefix, - offset: '0 0', - targetOffset: '0 0', - enabled: false, - constraints: constraints, - addTargetClasses: this.options.addTargetClasses - }; - - if (this.options.tetherOptions !== false) { - this.tether = new Tether(extend({}, opts, this.options.tetherOptions)); - } + if (this.options.constrainToWindow !== false) { + constraints.push({ + to: 'window', + pin: true, + attachment: 'together' + }); } - }, { - key: 'setupEvents', - value: function setupEvents() { - var _this2 = this; - - if (!this.options.openOn) { - return; - } - - if (this.options.openOn === 'always') { - setTimeout(this.open.bind(this)); - return; - } - - var events = this.options.openOn.split(' '); - - if (events.indexOf('click') >= 0) { - var openHandler = function openHandler(event) { - _this2.toggle(event); - event.preventDefault(); - }; - - var closeHandler = function closeHandler(event) { - if (!_this2.isOpened()) { - return; - } - - // Clicking inside dropdown - if (event.target === _this2.drop || _this2.drop.contains(event.target)) { - return; - } - - // Clicking target - if (event.target === _this2.target || _this2.target.contains(event.target)) { - return; - } - - _this2.close(event); - }; - - for (var i = 0; i < clickEvents.length; ++i) { - var clickEvent = clickEvents[i]; - this._on(this.target, clickEvent, openHandler); - this._on(document, clickEvent, closeHandler); + constraints.push({ + to: 'scrollParent' + }); + options = { + element: this.drop, + target: this.target, + attachment: sortAttach(dropAttach), + targetAttachment: sortAttach(this.options.position), + classPrefix: drop.classPrefix, + offset: '0 0', + targetOffset: '0 0', + enabled: false, + constraints: constraints + }; + if (this.options.tether !== false) { + return this.tether = new Tether(extend({}, options, this.options.tether)); + } + }; + + DropInstance.prototype.setupEvents = function() { + var events, + _this = this; + if (!this.options.openOn) { + return; + } + events = this.options.openOn.split(' '); + if (__indexOf.call(events, 'click') >= 0) { + this.target.addEventListener(clickEvent, function() { + return _this.toggle(); + }); + document.addEventListener(clickEvent, function(event) { + if (!_this.isOpened()) { + return; } - } - - var inTimeout = null; - var outTimeout = null; - - var inHandler = function inHandler(event) { - if (outTimeout !== null) { - clearTimeout(outTimeout); - } else { - inTimeout = setTimeout(function () { - _this2.open(event); - inTimeout = null; - }, (event.type === 'focus' ? _this2.options.focusDelay : _this2.options.hoverOpenDelay) || _this2.options.openDelay); + if (event.target === _this.drop || _this.drop.contains(event.target)) { + return; } - }; - - var outHandler = function outHandler(event) { - if (inTimeout !== null) { - clearTimeout(inTimeout); - } else { - outTimeout = setTimeout(function () { - _this2.close(event); - outTimeout = null; - }, (event.type === 'blur' ? _this2.options.blurDelay : _this2.options.hoverCloseDelay) || _this2.options.closeDelay); - } - }; - - if (events.indexOf('hover') >= 0) { - this._on(this.target, 'mouseover', inHandler); - this._on(this.drop, 'mouseover', inHandler); - this._on(this.target, 'mouseout', outHandler); - this._on(this.drop, 'mouseout', outHandler); - } - - if (events.indexOf('focus') >= 0) { - this._on(this.target, 'focus', inHandler); - this._on(this.drop, 'focus', inHandler); - this._on(this.target, 'blur', outHandler); - this._on(this.drop, 'blur', outHandler); - } - } - }, { - key: 'isOpened', - value: function isOpened() { - if (this.drop) { - return hasClass(this.drop, drop.classPrefix + '-open'); - } - } - }, { - key: 'toggle', - value: function toggle(event) { - if (this.isOpened()) { - this.close(event); - } else { - this.open(event); - } - } - }, { - key: 'open', - value: function open(event) { - var _this3 = this; - - /* eslint no-unused-vars: 0 */ - if (this.isOpened()) { - return; - } - - if (!this.drop.parentNode) { - document.body.appendChild(this.drop); - } - - if (typeof this.tether !== 'undefined') { - this.tether.enable(); - } - - addClass(this.drop, drop.classPrefix + '-open'); - addClass(this.drop, drop.classPrefix + '-open-transitionend'); - - setTimeout(function () { - if (_this3.drop) { - addClass(_this3.drop, drop.classPrefix + '-after-open'); + if (event.target === _this.target || _this.target.contains(event.target)) { + return; } + return _this.close(); }); - - if (typeof this.tether !== 'undefined') { - this.tether.position(); - } - - this.trigger('open'); - - drop.updateBodyClasses(); } - }, { - key: '_transitionEndHandler', - value: function _transitionEndHandler(e) { - if (e.target !== e.currentTarget) { - return; - } - - if (!hasClass(this.drop, drop.classPrefix + '-open')) { - removeClass(this.drop, drop.classPrefix + '-open-transitionend'); - } - this.drop.removeEventListener(transitionEndEvent, this.transitionEndHandler); + if (__indexOf.call(events, 'hover') >= 0) { + this.target.addEventListener('mouseover', function() { + return _this.open(); + }); + return this.target.addEventListener('mouseout', function() { + return _this.close(); + }); } - }, { - key: 'beforeCloseHandler', - value: function beforeCloseHandler(event) { - var shouldClose = true; - - if (!this.isClosing && typeof this.options.beforeClose === 'function') { - this.isClosing = true; - shouldClose = this.options.beforeClose(event, this) !== false; - } + }; - this.isClosing = false; + DropInstance.prototype.isOpened = function() { + return hasClass(this.drop, "" + drop.classPrefix + "-open"); + }; - return shouldClose; + DropInstance.prototype.toggle = function() { + if (this.isOpened()) { + return this.close(); + } else { + return this.open(); } - }, { - key: 'close', - value: function close(event) { - if (!this.isOpened()) { - return; - } - - if (!this.beforeCloseHandler(event)) { - return; - } - - removeClass(this.drop, drop.classPrefix + '-open'); - removeClass(this.drop, drop.classPrefix + '-after-open'); - - this.drop.addEventListener(transitionEndEvent, this.transitionEndHandler); + }; - this.trigger('close'); - - if (typeof this.tether !== 'undefined') { - this.tether.disable(); - } - - drop.updateBodyClasses(); - - if (this.options.remove) { - this.remove(event); - } + DropInstance.prototype.open = function() { + var _ref1; + if (!this.drop.parentNode) { + document.body.appendChild(this.drop); } - }, { - key: 'remove', - value: function remove(event) { - this.close(event); - if (this.drop.parentNode) { - this.drop.parentNode.removeChild(this.drop); - } + addClass(this.target, "" + drop.classPrefix + "-open"); + addClass(this.drop, "" + drop.classPrefix + "-open"); + if ((_ref1 = this.tether) != null) { + _ref1.enable(); } - }, { - key: 'position', - value: function position() { - if (this.isOpened() && typeof this.tether !== 'undefined') { - this.tether.position(); - } - } - }, { - key: 'destroy', - value: function destroy() { - this.remove(); - - if (typeof this.tether !== 'undefined') { - this.tether.destroy(); - } - - for (var i = 0; i < this._boundEvents.length; ++i) { - var _boundEvents$i = this._boundEvents[i]; - var element = _boundEvents$i.element; - var _event = _boundEvents$i.event; - var handler = _boundEvents$i.handler; + this.trigger('open'); + return drop.updateBodyClasses(); + }; - element.removeEventListener(_event, handler); - } - - this._boundEvents = []; - - this.tether = null; - this.drop = null; - this.content = null; - this.target = null; - - removeFromArray(allDrops[drop.classPrefix], this); - removeFromArray(drop.drops, this); + DropInstance.prototype.close = function() { + var _ref1; + removeClass(this.target, "" + drop.classPrefix + "-open"); + removeClass(this.drop, "" + drop.classPrefix + "-open"); + this.trigger('close'); + if ((_ref1 = this.tether) != null) { + _ref1.disable(); } - }]); + return drop.updateBodyClasses(); + }; return DropInstance; - })(Evented); + })(Evented); return drop; - } + }; - var Drop = createContext(); + window.Drop = createContext(); - document.addEventListener('DOMContentLoaded', function () { - Drop.updateBodyClasses(); + document.addEventListener('DOMContentLoaded', function() { + return Drop.updateBodyClasses(); }); - return Drop; -})); +}).call(this); From 76e57602e477072a659024feb781211edf62396f Mon Sep 17 00:00:00 2001 From: Robert Wagner Date: Wed, 26 Feb 2020 14:49:48 -0500 Subject: [PATCH 18/40] Rebuild docs --- dist/js/tether.esm.js | 1831 ++--- dist/js/tether.esm.min.js | 4 +- dist/js/tether.js | 1835 ++--- dist/js/tether.min.js | 4 +- docs/intro.html | 15 + examples/chosen/chosen-sprite.png | Bin 646 -> 0 bytes examples/chosen/chosen-sprite@2x.png | Bin 738 -> 0 bytes examples/chosen/chosen.css | 430 -- examples/chosen/chosen.js | 1166 ---- examples/chosen/index.html | 110 - examples/facebook/facebook.css | 86 - examples/facebook/index.html | 209 - examples/index.html | 38 + examples/resources/js/jquery.js | 9597 -------------------------- examples/resources/js/log.js | 134 - examples/tooltip/index.html | 86 - index.html | 17 +- 17 files changed, 2083 insertions(+), 13479 deletions(-) delete mode 100644 examples/chosen/chosen-sprite.png delete mode 100644 examples/chosen/chosen-sprite@2x.png delete mode 100644 examples/chosen/chosen.css delete mode 100644 examples/chosen/chosen.js delete mode 100644 examples/chosen/index.html delete mode 100644 examples/facebook/facebook.css delete mode 100644 examples/facebook/index.html create mode 100644 examples/index.html delete mode 100644 examples/resources/js/jquery.js delete mode 100644 examples/resources/js/log.js delete mode 100644 examples/tooltip/index.html diff --git a/dist/js/tether.esm.js b/dist/js/tether.esm.js index 2c01de16a..769d98f7c 100644 --- a/dist/js/tether.esm.js +++ b/dist/js/tether.esm.js @@ -1,4 +1,4 @@ -/*! tether 2.0.0-beta.2 */ +/*! tether 2.0.0-beta.5 */ function _inheritsLoose(subClass, superClass) { subClass.prototype = Object.create(superClass.prototype); @@ -14,107 +14,323 @@ function _assertThisInitialized(self) { return self; } -var Evented = -/*#__PURE__*/ -function () { - function Evented() {} +/** + * Checks if `value` is classified as a `Function` object. + * @param {*} value The param to check if it is a function + */ +function isFunction(value) { + return typeof value === 'function'; +} +/** + * Checks if `value` is classified as a `Number` object. + * @param {*} value The param to check if it is a number + */ - var _proto = Evented.prototype; +function isNumber(value) { + return typeof value === 'number'; +} +/** + * Checks if `value` is classified as an `Object`. + * @param {*} value The param to check if it is an object + */ - _proto.on = function on(event, handler, ctx, once) { - if (once === void 0) { - once = false; - } +function isObject(value) { + return typeof value === 'object'; +} +/** + * Checks if `value` is classified as a `String` object. + * @param {*} value The param to check if it is a string + */ - if (typeof this.bindings === 'undefined') { - this.bindings = {}; +function isString(value) { + return typeof value === 'string'; +} +/** + * Checks if `value` is undefined. + * @param {*} value The param to check if it is undefined + */ + +function isUndefined(value) { + return value === undefined; +} + +function addClass(el, name) { + name.split(' ').forEach(function (cls) { + if (cls.trim()) { + el.classList.add(cls); } + }); +} +/** + * Get class string based on previously determined classes + * @param {String} [key=''] - default value for the classes object + * @param {Object} classes + * @param {String} classPrefix + */ + +function getClass(key, classes, classPrefix) { + if (key === void 0) { + key = ''; + } - if (typeof this.bindings[event] === 'undefined') { - this.bindings[event] = []; + if (!isUndefined(classes) && !isUndefined(classes[key])) { + if (classes[key] === false) { + return ''; } - this.bindings[event].push({ - handler: handler, - ctx: ctx, - once: once - }); - return this; - }; + return classes[key]; + } else if (classPrefix) { + return classPrefix + "-" + key; + } else { + return key; + } +} +function removeClass(el, name) { + name.split(' ').forEach(function (cls) { + if (cls.trim()) { + el.classList.remove(cls); + } + }); +} +function updateClasses(el, add, all) { + // Of the set of 'all' classes, we need the 'add' classes, and only the + // 'add' classes to be set. + all.forEach(function (cls) { + if (add.indexOf(cls) === -1 && el.classList.contains(cls)) { + removeClass(el, cls); + } + }); + add.forEach(function (cls) { + if (!el.classList.contains(cls)) { + addClass(el, cls); + } + }); +} - _proto.once = function once(event, handler, ctx) { - return this.on(event, handler, ctx, true); - }; +var deferred = []; +function defer(fn) { + deferred.push(fn); +} +function flush() { + var fn; // eslint-disable-next-line - _proto.off = function off(event, handler) { - if (typeof this.bindings === 'undefined' || typeof this.bindings[event] === 'undefined') { - return this; - } + while (fn = deferred.pop()) { + fn(); + } +} - if (typeof handler === 'undefined') { - delete this.bindings[event]; - } else { - var i = 0; +var _scrollBarSize = null; +function extend(out) { + if (out === void 0) { + out = {}; + } - while (i < this.bindings[event].length) { - if (this.bindings[event][i].handler === handler) { - this.bindings[event].splice(i, 1); - } else { - ++i; + var args = []; + Array.prototype.push.apply(args, arguments); + args.slice(1).forEach(function (obj) { + if (obj) { + for (var key in obj) { + if ({}.hasOwnProperty.call(obj, key)) { + out[key] = obj[key]; } } } + }); + return out; +} +function getScrollBarSize() { + if (_scrollBarSize) { + return _scrollBarSize; + } - return this; + var inner = document.createElement('div'); + inner.style.width = '100%'; + inner.style.height = '200px'; + var outer = document.createElement('div'); + extend(outer.style, { + position: 'absolute', + top: 0, + left: 0, + pointerEvents: 'none', + visibility: 'hidden', + width: '200px', + height: '150px', + overflow: 'hidden' + }); + outer.appendChild(inner); + document.body.appendChild(outer); + var widthContained = inner.offsetWidth; + outer.style.overflow = 'scroll'; + var widthScroll = inner.offsetWidth; + + if (widthContained === widthScroll) { + widthScroll = outer.clientWidth; + } + + document.body.removeChild(outer); + var width = widthContained - widthScroll; + _scrollBarSize = { + width: width, + height: width }; + return _scrollBarSize; +} +var uniqueId = function () { + var id = 0; + return function () { + return ++id; + }; +}(); - _proto.trigger = function trigger(event) { - if (typeof this.bindings !== 'undefined' && this.bindings[event]) { - var i = 0; +var zeroPosCache = {}; +var zeroElement = null; +function getBounds(body, el) { + var doc; - for (var _len = arguments.length, args = new Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) { - args[_key - 1] = arguments[_key]; - } + if (el === document) { + doc = document; + el = document.documentElement; + } else { + doc = el.ownerDocument; + } - while (i < this.bindings[event].length) { - var _this$bindings$event$ = this.bindings[event][i], - handler = _this$bindings$event$.handler, - ctx = _this$bindings$event$.ctx, - once = _this$bindings$event$.once; - var context = ctx; + var docEl = doc.documentElement; - if (typeof context === 'undefined') { - context = this; - } + var box = _getActualBoundingClientRect(el); - handler.apply(context, args); + var origin = _getOrigin(body); - if (once) { - this.bindings[event].splice(i, 1); - } else { - ++i; - } - } - } + box.top -= origin.top; + box.left -= origin.left; - return this; - }; + if (isUndefined(box.width)) { + box.width = document.body.scrollWidth - box.left - box.right; + } - return Evented; -}(); + if (isUndefined(box.height)) { + box.height = document.body.scrollHeight - box.top - box.bottom; + } -var TetherBase; + box.top = box.top - docEl.clientTop; + box.left = box.left - docEl.clientLeft; + box.right = doc.body.clientWidth - box.width - box.left; + box.bottom = doc.body.clientHeight - box.height - box.top; + return box; +} +/** + * Gets bounds for when target modifiier is 'scroll-handle' + * @param target + * @return {{left: number, width: number, height: number}} + */ + +function getScrollHandleBounds(body, target) { + var bounds; // We have to do the check for the scrollTop and if target === document.body here and set to variables + // because we may reset target below. + + var targetScrollTop = target.scrollTop; + var targetIsBody = target === document.body; + + if (targetIsBody) { + target = document.documentElement; + bounds = { + left: pageXOffset, + top: pageYOffset, + height: innerHeight, + width: innerWidth + }; + } else { + bounds = getBounds(body, target); + } + + var style = getComputedStyle(target); + var hasBottomScroll = target.scrollWidth > target.clientWidth || [style.overflow, style.overflowX].indexOf('scroll') >= 0 || !targetIsBody; + var scrollBottom = 0; -if (typeof TetherBase === 'undefined') { - TetherBase = { - modules: [] + if (hasBottomScroll) { + scrollBottom = 15; + } + + var height = bounds.height - parseFloat(style.borderTopWidth) - parseFloat(style.borderBottomWidth) - scrollBottom; + var out = { + width: 15, + height: height * 0.975 * (height / target.scrollHeight), + left: bounds.left + bounds.width - parseFloat(style.borderLeftWidth) - 15 }; + var fitAdj = 0; + + if (height < 408 && targetIsBody) { + fitAdj = -0.00011 * Math.pow(height, 2) - 0.00727 * height + 22.58; + } + + if (!targetIsBody) { + out.height = Math.max(out.height, 24); + } + + var scrollPercentage = targetScrollTop / (target.scrollHeight - height); + out.top = scrollPercentage * (height - out.height - fitAdj) + bounds.top + parseFloat(style.borderTopWidth); + + if (targetIsBody) { + out.height = Math.max(out.height, 24); + } + + return out; } +/** + * Gets bounds for when target modifiier is 'visible + * @param target + * @return {{top: *, left: *, width: *, height: *}} + */ + +function getVisibleBounds(body, target) { + if (target === document.body) { + return { + top: pageYOffset, + left: pageXOffset, + height: innerHeight, + width: innerWidth + }; + } else { + var bounds = getBounds(body, target); + var out = { + height: bounds.height, + width: bounds.width, + top: bounds.top, + left: bounds.left + }; + out.height = Math.min(out.height, bounds.height - (pageYOffset - bounds.top)); + out.height = Math.min(out.height, bounds.height - (bounds.top + bounds.height - (pageYOffset + innerHeight))); + out.height = Math.min(innerHeight, out.height); + out.height -= 2; + out.width = Math.min(out.width, bounds.width - (pageXOffset - bounds.left)); + out.width = Math.min(out.width, bounds.width - (bounds.left + bounds.width - (pageXOffset + innerWidth))); + out.width = Math.min(innerWidth, out.width); + out.width -= 2; + + if (out.top < pageYOffset) { + out.top = pageYOffset; + } -var zeroElement = null; // Same as native getBoundingClientRect, except it takes into account parent offsets -// if the element lies within a nested document ( or

              +

              Tether

              A client-side library to make absolutely positioned elements attach to elements in the page efficiently.

              2.0.0-beta.5

              @@ -410,6 +410,21 @@

              Methods

            • destroy() - Disable and remove all references
            • position() - Manually trigger a repositioning
            +

            Events

            +

            The Tether object also has events support, since it extends our Evented class.

            +

            The methods exposed to listen to events are:

            +
              +
            • on(event, handler) - Adds an event listener that is fired whenever the event is fired
            • +
            • once(event, handler) - Adds an event listener that is only fired the first time the event is fired
            • +
            • off(event, handler) - Removes the event listener
            • +
            • trigger(event) - Manually triggers events
            • +
            +

            The events fired are:

            +
              +
            • repositioned - Fired whenever the tether element is moved
            • +
            • update - Fired whenever the Tether instance runs into a constraint. You could use this +for things like manually flipping an arrow or other tweaks.
            • +

            Options

            The full list of options which can be passed to the Tether constructor and setOptions:

            From 56bec4d20f374d3d5d8a36c570865ac975e5d6b7 Mon Sep 17 00:00:00 2001 From: Robert Wagner Date: Wed, 26 Feb 2020 23:59:06 -0500 Subject: [PATCH 19/40] Update base.jade --- resources/templates/base.jade | 20 ++++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/resources/templates/base.jade b/resources/templates/base.jade index c0e3026b6..24a6d1319 100644 --- a/resources/templates/base.jade +++ b/resources/templates/base.jade @@ -22,16 +22,16 @@ html script(src="//ajax.googleapis.com/ajax/libs/jquery/1.10.2/jquery.min.js") - link(rel='stylesheet', href='//github.hubspot.com/#{ repo.name }/#{ root }/resources/executr/lib/CodeMirror/codemirror.css') - link(rel='stylesheet', href='//github.hubspot.com/#{ repo.name }/#{ root }/resources/executr/build/css/executr.css') - script(src='//github.hubspot.com/#{ repo.name }/#{ root }/resources/executr/lib/CodeMirror/codemirror.js') - script(src='//github.hubspot.com/#{ repo.name }/#{ root }/resources/executr/lib/CodeMirror/mode/coffeescript/coffeescript.js') - script(src='//github.hubspot.com/#{ repo.name }/#{ root }/resources/executr/lib/CodeMirror/mode/javascript/javascript.js') - script(src='//github.hubspot.com/#{ repo.name }/#{ root }/resources/executr/lib/coffee-script.js') - script(src='//github.hubspot.com/#{ repo.name }/#{ root }/resources/executr/lib/underscore.min.js') - script(src='//github.hubspot.com/#{ repo.name }/#{ root }/resources/executr/lib/js2coffee.min.js') - script(src='//github.hubspot.com/#{ repo.name }/#{ root }/resources/executr/build/js/executr.js') - script(src='//github.hubspot.com/#{ repo.name }/#{ root }/resources/executr/build/js/executr-run.js') + link(rel='stylesheet', href='//tether.io/resources/executr/lib/CodeMirror/codemirror.css') + link(rel='stylesheet', href='//tether.io/resources/executr/build/css/executr.css') + script(src='//tether.io/resources/executr/lib/CodeMirror/codemirror.js') + script(src='//tether.io/resources/executr/lib/CodeMirror/mode/coffeescript/coffeescript.js') + script(src='//tether.io/resources/executr/lib/CodeMirror/mode/javascript/javascript.js') + script(src='//tether.io/resources/executr/lib/coffee-script.js') + script(src='//tether.io/resources/executr/lib/underscore.min.js') + script(src='//tether.io/resources/executr/lib/js2coffee.min.js') + script(src='//tether.io/resources/executr/build/js/executr.js') + script(src='//tether.io/resources/executr/build/js/executr-run.js') script(src="//use.typekit.net/jbn8qxr.js") script(type='text/javascript'). From e954a7b380d2f0cf2e40e59534fd610f961252f8 Mon Sep 17 00:00:00 2001 From: Robert Wagner Date: Thu, 27 Feb 2020 00:03:39 -0500 Subject: [PATCH 20/40] Update footer.jade --- resources/templates/includes/footer.jade | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/resources/templates/includes/footer.jade b/resources/templates/includes/footer.jade index bd1f81616..74e60185a 100644 --- a/resources/templates/includes/footer.jade +++ b/resources/templates/includes/footer.jade @@ -22,7 +22,7 @@ ul li - a(href="http://github.hubspot.com/tether/") Tether + a(href="http://tether.io") Tether li a(href="http://github.hubspot.com/offline/docs/welcome") Offline li From 8a12128305a11ebebf5b06ed4648bc419a27a100 Mon Sep 17 00:00:00 2001 From: Robert Wagner Date: Thu, 27 Feb 2020 00:04:30 -0500 Subject: [PATCH 21/40] Rebuild docs --- dist/css/tether-theme-arrows-dark.css | 190 -- dist/css/tether-theme-arrows-dark.min.css | 1 - dist/css/tether-theme-arrows.css | 192 -- dist/css/tether-theme-arrows.min.css | 1 - dist/css/tether-theme-basic.css | 26 - dist/css/tether-theme-basic.min.css | 1 - dist/css/tether.css | 11 - dist/css/tether.min.css | 1 - dist/js/tether.esm.js | 1976 -------------------- dist/js/tether.esm.min.js | 4 - dist/js/tether.js | 1984 --------------------- dist/js/tether.min.js | 4 - resources/templates/base.jade | 20 +- resources/templates/includes/footer.jade | 2 +- 14 files changed, 11 insertions(+), 4402 deletions(-) delete mode 100644 dist/css/tether-theme-arrows-dark.css delete mode 100644 dist/css/tether-theme-arrows-dark.min.css delete mode 100644 dist/css/tether-theme-arrows.css delete mode 100644 dist/css/tether-theme-arrows.min.css delete mode 100644 dist/css/tether-theme-basic.css delete mode 100644 dist/css/tether-theme-basic.min.css delete mode 100644 dist/css/tether.css delete mode 100644 dist/css/tether.min.css delete mode 100644 dist/js/tether.esm.js delete mode 100644 dist/js/tether.esm.min.js delete mode 100644 dist/js/tether.js delete mode 100644 dist/js/tether.min.js diff --git a/dist/css/tether-theme-arrows-dark.css b/dist/css/tether-theme-arrows-dark.css deleted file mode 100644 index 0ac6b5abe..000000000 --- a/dist/css/tether-theme-arrows-dark.css +++ /dev/null @@ -1,190 +0,0 @@ -.tether-element, .tether-element:after, .tether-element:before, .tether-element *, .tether-element *:after, .tether-element *:before { - box-sizing: border-box; -} - -.tether-element { - position: absolute; - display: none; -} -.tether-element.tether-open { - display: block; -} - -.tether-element.tether-theme-arrows-dark { - max-width: 100%; - max-height: 100%; -} -.tether-element.tether-theme-arrows-dark .tether-content { - border-radius: 5px; - position: relative; - font-family: inherit; - background: #000; - color: #fff; - padding: 1em; - font-size: 1.1em; - line-height: 1.5em; -} -.tether-element.tether-theme-arrows-dark .tether-content:before { - content: ""; - display: block; - position: absolute; - width: 0; - height: 0; - border-color: transparent; - border-width: 16px; - border-style: solid; -} -.tether-element.tether-theme-arrows-dark.tether-element-attached-bottom.tether-element-attached-center .tether-content { - margin-bottom: 16px; -} -.tether-element.tether-theme-arrows-dark.tether-element-attached-bottom.tether-element-attached-center .tether-content:before { - top: 100%; - left: 50%; - margin-left: -16px; - border-top-color: #000; - border-bottom: 0; -} -.tether-element.tether-theme-arrows-dark.tether-element-attached-top.tether-element-attached-center .tether-content { - margin-top: 16px; -} -.tether-element.tether-theme-arrows-dark.tether-element-attached-top.tether-element-attached-center .tether-content:before { - bottom: 100%; - left: 50%; - margin-left: -16px; - border-bottom-color: #000; - border-top: 0; -} -.tether-element.tether-theme-arrows-dark.tether-element-attached-right.tether-element-attached-middle .tether-content { - margin-right: 16px; -} -.tether-element.tether-theme-arrows-dark.tether-element-attached-right.tether-element-attached-middle .tether-content:before { - left: 100%; - top: 50%; - margin-top: -16px; - border-left-color: #000; - border-right: 0; -} -.tether-element.tether-theme-arrows-dark.tether-element-attached-left.tether-element-attached-middle .tether-content { - margin-left: 16px; -} -.tether-element.tether-theme-arrows-dark.tether-element-attached-left.tether-element-attached-middle .tether-content:before { - right: 100%; - top: 50%; - margin-top: -16px; - border-right-color: #000; - border-left: 0; -} -.tether-element.tether-theme-arrows-dark.tether-element-attached-left.tether-target-attached-center .tether-content { - left: -32px; -} -.tether-element.tether-theme-arrows-dark.tether-element-attached-right.tether-target-attached-center .tether-content { - left: 32px; -} -.tether-element.tether-theme-arrows-dark.tether-element-attached-top.tether-element-attached-left.tether-target-attached-middle .tether-content { - margin-top: 16px; -} -.tether-element.tether-theme-arrows-dark.tether-element-attached-top.tether-element-attached-left.tether-target-attached-middle .tether-content:before { - bottom: 100%; - left: 16px; - border-bottom-color: #000; - border-top: 0; -} -.tether-element.tether-theme-arrows-dark.tether-element-attached-top.tether-element-attached-right.tether-target-attached-middle .tether-content { - margin-top: 16px; -} -.tether-element.tether-theme-arrows-dark.tether-element-attached-top.tether-element-attached-right.tether-target-attached-middle .tether-content:before { - bottom: 100%; - right: 16px; - border-bottom-color: #000; - border-top: 0; -} -.tether-element.tether-theme-arrows-dark.tether-element-attached-bottom.tether-element-attached-left.tether-target-attached-middle .tether-content { - margin-bottom: 16px; -} -.tether-element.tether-theme-arrows-dark.tether-element-attached-bottom.tether-element-attached-left.tether-target-attached-middle .tether-content:before { - top: 100%; - left: 16px; - border-top-color: #000; - border-bottom: 0; -} -.tether-element.tether-theme-arrows-dark.tether-element-attached-bottom.tether-element-attached-right.tether-target-attached-middle .tether-content { - margin-bottom: 16px; -} -.tether-element.tether-theme-arrows-dark.tether-element-attached-bottom.tether-element-attached-right.tether-target-attached-middle .tether-content:before { - top: 100%; - right: 16px; - border-top-color: #000; - border-bottom: 0; -} -.tether-element.tether-theme-arrows-dark.tether-element-attached-top.tether-element-attached-left.tether-target-attached-bottom .tether-content { - margin-top: 16px; -} -.tether-element.tether-theme-arrows-dark.tether-element-attached-top.tether-element-attached-left.tether-target-attached-bottom .tether-content:before { - bottom: 100%; - left: 16px; - border-bottom-color: #000; - border-top: 0; -} -.tether-element.tether-theme-arrows-dark.tether-element-attached-top.tether-element-attached-right.tether-target-attached-bottom .tether-content { - margin-top: 16px; -} -.tether-element.tether-theme-arrows-dark.tether-element-attached-top.tether-element-attached-right.tether-target-attached-bottom .tether-content:before { - bottom: 100%; - right: 16px; - border-bottom-color: #000; - border-top: 0; -} -.tether-element.tether-theme-arrows-dark.tether-element-attached-bottom.tether-element-attached-left.tether-target-attached-top .tether-content { - margin-bottom: 16px; -} -.tether-element.tether-theme-arrows-dark.tether-element-attached-bottom.tether-element-attached-left.tether-target-attached-top .tether-content:before { - top: 100%; - left: 16px; - border-top-color: #000; - border-bottom: 0; -} -.tether-element.tether-theme-arrows-dark.tether-element-attached-bottom.tether-element-attached-right.tether-target-attached-top .tether-content { - margin-bottom: 16px; -} -.tether-element.tether-theme-arrows-dark.tether-element-attached-bottom.tether-element-attached-right.tether-target-attached-top .tether-content:before { - top: 100%; - right: 16px; - border-top-color: #000; - border-bottom: 0; -} -.tether-element.tether-theme-arrows-dark.tether-element-attached-top.tether-element-attached-right.tether-target-attached-left .tether-content { - margin-right: 16px; -} -.tether-element.tether-theme-arrows-dark.tether-element-attached-top.tether-element-attached-right.tether-target-attached-left .tether-content:before { - top: 16px; - left: 100%; - border-left-color: #000; - border-right: 0; -} -.tether-element.tether-theme-arrows-dark.tether-element-attached-top.tether-element-attached-left.tether-target-attached-right .tether-content { - margin-left: 16px; -} -.tether-element.tether-theme-arrows-dark.tether-element-attached-top.tether-element-attached-left.tether-target-attached-right .tether-content:before { - top: 16px; - right: 100%; - border-right-color: #000; - border-left: 0; -} -.tether-element.tether-theme-arrows-dark.tether-element-attached-bottom.tether-element-attached-right.tether-target-attached-left .tether-content { - margin-right: 16px; -} -.tether-element.tether-theme-arrows-dark.tether-element-attached-bottom.tether-element-attached-right.tether-target-attached-left .tether-content:before { - bottom: 16px; - left: 100%; - border-left-color: #000; - border-right: 0; -} -.tether-element.tether-theme-arrows-dark.tether-element-attached-bottom.tether-element-attached-left.tether-target-attached-right .tether-content { - margin-left: 16px; -} -.tether-element.tether-theme-arrows-dark.tether-element-attached-bottom.tether-element-attached-left.tether-target-attached-right .tether-content:before { - bottom: 16px; - right: 100%; - border-right-color: #000; - border-left: 0; -} \ No newline at end of file diff --git a/dist/css/tether-theme-arrows-dark.min.css b/dist/css/tether-theme-arrows-dark.min.css deleted file mode 100644 index c1b8baacd..000000000 --- a/dist/css/tether-theme-arrows-dark.min.css +++ /dev/null @@ -1 +0,0 @@ -.tether-element,.tether-element *,.tether-element:after,.tether-element :after,.tether-element:before,.tether-element :before{box-sizing:border-box}.tether-element{position:absolute;display:none}.tether-element.tether-open{display:block}.tether-element.tether-theme-arrows-dark{max-width:100%;max-height:100%}.tether-element.tether-theme-arrows-dark .tether-content{border-radius:5px;position:relative;font-family:inherit;background:#000;color:#fff;padding:1em;font-size:1.1em;line-height:1.5em}.tether-element.tether-theme-arrows-dark .tether-content:before{content:"";display:block;position:absolute;width:0;height:0;border:16px solid transparent}.tether-element.tether-theme-arrows-dark.tether-element-attached-bottom.tether-element-attached-center .tether-content{margin-bottom:16px}.tether-element.tether-theme-arrows-dark.tether-element-attached-bottom.tether-element-attached-center .tether-content:before{top:100%;left:50%;margin-left:-16px;border-top-color:#000;border-bottom:0}.tether-element.tether-theme-arrows-dark.tether-element-attached-top.tether-element-attached-center .tether-content{margin-top:16px}.tether-element.tether-theme-arrows-dark.tether-element-attached-top.tether-element-attached-center .tether-content:before{bottom:100%;left:50%;margin-left:-16px;border-bottom-color:#000;border-top:0}.tether-element.tether-theme-arrows-dark.tether-element-attached-right.tether-element-attached-middle .tether-content{margin-right:16px}.tether-element.tether-theme-arrows-dark.tether-element-attached-right.tether-element-attached-middle .tether-content:before{left:100%;top:50%;margin-top:-16px;border-left-color:#000;border-right:0}.tether-element.tether-theme-arrows-dark.tether-element-attached-left.tether-element-attached-middle .tether-content{margin-left:16px}.tether-element.tether-theme-arrows-dark.tether-element-attached-left.tether-element-attached-middle .tether-content:before{right:100%;top:50%;margin-top:-16px;border-right-color:#000;border-left:0}.tether-element.tether-theme-arrows-dark.tether-element-attached-left.tether-target-attached-center .tether-content{left:-32px}.tether-element.tether-theme-arrows-dark.tether-element-attached-right.tether-target-attached-center .tether-content{left:32px}.tether-element.tether-theme-arrows-dark.tether-element-attached-top.tether-element-attached-left.tether-target-attached-middle .tether-content{margin-top:16px}.tether-element.tether-theme-arrows-dark.tether-element-attached-top.tether-element-attached-left.tether-target-attached-middle .tether-content:before{bottom:100%;left:16px;border-bottom-color:#000;border-top:0}.tether-element.tether-theme-arrows-dark.tether-element-attached-top.tether-element-attached-right.tether-target-attached-middle .tether-content{margin-top:16px}.tether-element.tether-theme-arrows-dark.tether-element-attached-top.tether-element-attached-right.tether-target-attached-middle .tether-content:before{bottom:100%;right:16px;border-bottom-color:#000;border-top:0}.tether-element.tether-theme-arrows-dark.tether-element-attached-bottom.tether-element-attached-left.tether-target-attached-middle .tether-content{margin-bottom:16px}.tether-element.tether-theme-arrows-dark.tether-element-attached-bottom.tether-element-attached-left.tether-target-attached-middle .tether-content:before{top:100%;left:16px;border-top-color:#000;border-bottom:0}.tether-element.tether-theme-arrows-dark.tether-element-attached-bottom.tether-element-attached-right.tether-target-attached-middle .tether-content{margin-bottom:16px}.tether-element.tether-theme-arrows-dark.tether-element-attached-bottom.tether-element-attached-right.tether-target-attached-middle .tether-content:before{top:100%;right:16px;border-top-color:#000;border-bottom:0}.tether-element.tether-theme-arrows-dark.tether-element-attached-top.tether-element-attached-left.tether-target-attached-bottom .tether-content{margin-top:16px}.tether-element.tether-theme-arrows-dark.tether-element-attached-top.tether-element-attached-left.tether-target-attached-bottom .tether-content:before{bottom:100%;left:16px;border-bottom-color:#000;border-top:0}.tether-element.tether-theme-arrows-dark.tether-element-attached-top.tether-element-attached-right.tether-target-attached-bottom .tether-content{margin-top:16px}.tether-element.tether-theme-arrows-dark.tether-element-attached-top.tether-element-attached-right.tether-target-attached-bottom .tether-content:before{bottom:100%;right:16px;border-bottom-color:#000;border-top:0}.tether-element.tether-theme-arrows-dark.tether-element-attached-bottom.tether-element-attached-left.tether-target-attached-top .tether-content{margin-bottom:16px}.tether-element.tether-theme-arrows-dark.tether-element-attached-bottom.tether-element-attached-left.tether-target-attached-top .tether-content:before{top:100%;left:16px;border-top-color:#000;border-bottom:0}.tether-element.tether-theme-arrows-dark.tether-element-attached-bottom.tether-element-attached-right.tether-target-attached-top .tether-content{margin-bottom:16px}.tether-element.tether-theme-arrows-dark.tether-element-attached-bottom.tether-element-attached-right.tether-target-attached-top .tether-content:before{top:100%;right:16px;border-top-color:#000;border-bottom:0}.tether-element.tether-theme-arrows-dark.tether-element-attached-top.tether-element-attached-right.tether-target-attached-left .tether-content{margin-right:16px}.tether-element.tether-theme-arrows-dark.tether-element-attached-top.tether-element-attached-right.tether-target-attached-left .tether-content:before{top:16px;left:100%;border-left-color:#000;border-right:0}.tether-element.tether-theme-arrows-dark.tether-element-attached-top.tether-element-attached-left.tether-target-attached-right .tether-content{margin-left:16px}.tether-element.tether-theme-arrows-dark.tether-element-attached-top.tether-element-attached-left.tether-target-attached-right .tether-content:before{top:16px;right:100%;border-right-color:#000;border-left:0}.tether-element.tether-theme-arrows-dark.tether-element-attached-bottom.tether-element-attached-right.tether-target-attached-left .tether-content{margin-right:16px}.tether-element.tether-theme-arrows-dark.tether-element-attached-bottom.tether-element-attached-right.tether-target-attached-left .tether-content:before{bottom:16px;left:100%;border-left-color:#000;border-right:0}.tether-element.tether-theme-arrows-dark.tether-element-attached-bottom.tether-element-attached-left.tether-target-attached-right .tether-content{margin-left:16px}.tether-element.tether-theme-arrows-dark.tether-element-attached-bottom.tether-element-attached-left.tether-target-attached-right .tether-content:before{bottom:16px;right:100%;border-right-color:#000;border-left:0} \ No newline at end of file diff --git a/dist/css/tether-theme-arrows.css b/dist/css/tether-theme-arrows.css deleted file mode 100644 index 9052dab1e..000000000 --- a/dist/css/tether-theme-arrows.css +++ /dev/null @@ -1,192 +0,0 @@ -.tether-element, .tether-element:after, .tether-element:before, .tether-element *, .tether-element *:after, .tether-element *:before { - box-sizing: border-box; -} - -.tether-element { - position: absolute; - display: none; -} -.tether-element.tether-open { - display: block; -} - -.tether-element.tether-theme-arrows { - max-width: 100%; - max-height: 100%; -} -.tether-element.tether-theme-arrows .tether-content { - border-radius: 5px; - position: relative; - font-family: inherit; - background: #fff; - color: inherit; - padding: 1em; - font-size: 1.1em; - line-height: 1.5em; - transform: translateZ(0); - filter: drop-shadow(0 1px 4px rgba(0, 0, 0, 0.2)); -} -.tether-element.tether-theme-arrows .tether-content:before { - content: ""; - display: block; - position: absolute; - width: 0; - height: 0; - border-color: transparent; - border-width: 16px; - border-style: solid; -} -.tether-element.tether-theme-arrows.tether-element-attached-bottom.tether-element-attached-center .tether-content { - margin-bottom: 16px; -} -.tether-element.tether-theme-arrows.tether-element-attached-bottom.tether-element-attached-center .tether-content:before { - top: 100%; - left: 50%; - margin-left: -16px; - border-top-color: #fff; - border-bottom: 0; -} -.tether-element.tether-theme-arrows.tether-element-attached-top.tether-element-attached-center .tether-content { - margin-top: 16px; -} -.tether-element.tether-theme-arrows.tether-element-attached-top.tether-element-attached-center .tether-content:before { - bottom: 100%; - left: 50%; - margin-left: -16px; - border-bottom-color: #fff; - border-top: 0; -} -.tether-element.tether-theme-arrows.tether-element-attached-right.tether-element-attached-middle .tether-content { - margin-right: 16px; -} -.tether-element.tether-theme-arrows.tether-element-attached-right.tether-element-attached-middle .tether-content:before { - left: 100%; - top: 50%; - margin-top: -16px; - border-left-color: #fff; - border-right: 0; -} -.tether-element.tether-theme-arrows.tether-element-attached-left.tether-element-attached-middle .tether-content { - margin-left: 16px; -} -.tether-element.tether-theme-arrows.tether-element-attached-left.tether-element-attached-middle .tether-content:before { - right: 100%; - top: 50%; - margin-top: -16px; - border-right-color: #fff; - border-left: 0; -} -.tether-element.tether-theme-arrows.tether-element-attached-left.tether-target-attached-center .tether-content { - left: -32px; -} -.tether-element.tether-theme-arrows.tether-element-attached-right.tether-target-attached-center .tether-content { - left: 32px; -} -.tether-element.tether-theme-arrows.tether-element-attached-top.tether-element-attached-left.tether-target-attached-middle .tether-content { - margin-top: 16px; -} -.tether-element.tether-theme-arrows.tether-element-attached-top.tether-element-attached-left.tether-target-attached-middle .tether-content:before { - bottom: 100%; - left: 16px; - border-bottom-color: #fff; - border-top: 0; -} -.tether-element.tether-theme-arrows.tether-element-attached-top.tether-element-attached-right.tether-target-attached-middle .tether-content { - margin-top: 16px; -} -.tether-element.tether-theme-arrows.tether-element-attached-top.tether-element-attached-right.tether-target-attached-middle .tether-content:before { - bottom: 100%; - right: 16px; - border-bottom-color: #fff; - border-top: 0; -} -.tether-element.tether-theme-arrows.tether-element-attached-bottom.tether-element-attached-left.tether-target-attached-middle .tether-content { - margin-bottom: 16px; -} -.tether-element.tether-theme-arrows.tether-element-attached-bottom.tether-element-attached-left.tether-target-attached-middle .tether-content:before { - top: 100%; - left: 16px; - border-top-color: #fff; - border-bottom: 0; -} -.tether-element.tether-theme-arrows.tether-element-attached-bottom.tether-element-attached-right.tether-target-attached-middle .tether-content { - margin-bottom: 16px; -} -.tether-element.tether-theme-arrows.tether-element-attached-bottom.tether-element-attached-right.tether-target-attached-middle .tether-content:before { - top: 100%; - right: 16px; - border-top-color: #fff; - border-bottom: 0; -} -.tether-element.tether-theme-arrows.tether-element-attached-top.tether-element-attached-left.tether-target-attached-bottom .tether-content { - margin-top: 16px; -} -.tether-element.tether-theme-arrows.tether-element-attached-top.tether-element-attached-left.tether-target-attached-bottom .tether-content:before { - bottom: 100%; - left: 16px; - border-bottom-color: #fff; - border-top: 0; -} -.tether-element.tether-theme-arrows.tether-element-attached-top.tether-element-attached-right.tether-target-attached-bottom .tether-content { - margin-top: 16px; -} -.tether-element.tether-theme-arrows.tether-element-attached-top.tether-element-attached-right.tether-target-attached-bottom .tether-content:before { - bottom: 100%; - right: 16px; - border-bottom-color: #fff; - border-top: 0; -} -.tether-element.tether-theme-arrows.tether-element-attached-bottom.tether-element-attached-left.tether-target-attached-top .tether-content { - margin-bottom: 16px; -} -.tether-element.tether-theme-arrows.tether-element-attached-bottom.tether-element-attached-left.tether-target-attached-top .tether-content:before { - top: 100%; - left: 16px; - border-top-color: #fff; - border-bottom: 0; -} -.tether-element.tether-theme-arrows.tether-element-attached-bottom.tether-element-attached-right.tether-target-attached-top .tether-content { - margin-bottom: 16px; -} -.tether-element.tether-theme-arrows.tether-element-attached-bottom.tether-element-attached-right.tether-target-attached-top .tether-content:before { - top: 100%; - right: 16px; - border-top-color: #fff; - border-bottom: 0; -} -.tether-element.tether-theme-arrows.tether-element-attached-top.tether-element-attached-right.tether-target-attached-left .tether-content { - margin-right: 16px; -} -.tether-element.tether-theme-arrows.tether-element-attached-top.tether-element-attached-right.tether-target-attached-left .tether-content:before { - top: 16px; - left: 100%; - border-left-color: #fff; - border-right: 0; -} -.tether-element.tether-theme-arrows.tether-element-attached-top.tether-element-attached-left.tether-target-attached-right .tether-content { - margin-left: 16px; -} -.tether-element.tether-theme-arrows.tether-element-attached-top.tether-element-attached-left.tether-target-attached-right .tether-content:before { - top: 16px; - right: 100%; - border-right-color: #fff; - border-left: 0; -} -.tether-element.tether-theme-arrows.tether-element-attached-bottom.tether-element-attached-right.tether-target-attached-left .tether-content { - margin-right: 16px; -} -.tether-element.tether-theme-arrows.tether-element-attached-bottom.tether-element-attached-right.tether-target-attached-left .tether-content:before { - bottom: 16px; - left: 100%; - border-left-color: #fff; - border-right: 0; -} -.tether-element.tether-theme-arrows.tether-element-attached-bottom.tether-element-attached-left.tether-target-attached-right .tether-content { - margin-left: 16px; -} -.tether-element.tether-theme-arrows.tether-element-attached-bottom.tether-element-attached-left.tether-target-attached-right .tether-content:before { - bottom: 16px; - right: 100%; - border-right-color: #fff; - border-left: 0; -} \ No newline at end of file diff --git a/dist/css/tether-theme-arrows.min.css b/dist/css/tether-theme-arrows.min.css deleted file mode 100644 index a23bca8bf..000000000 --- a/dist/css/tether-theme-arrows.min.css +++ /dev/null @@ -1 +0,0 @@ -.tether-element,.tether-element *,.tether-element:after,.tether-element :after,.tether-element:before,.tether-element :before{box-sizing:border-box}.tether-element{position:absolute;display:none}.tether-element.tether-open{display:block}.tether-element.tether-theme-arrows{max-width:100%;max-height:100%}.tether-element.tether-theme-arrows .tether-content{border-radius:5px;position:relative;font-family:inherit;background:#fff;color:inherit;padding:1em;font-size:1.1em;line-height:1.5em;transform:translateZ(0);filter:drop-shadow(0 1px 4px rgba(0,0,0,.2))}.tether-element.tether-theme-arrows .tether-content:before{content:"";display:block;position:absolute;width:0;height:0;border:16px solid transparent}.tether-element.tether-theme-arrows.tether-element-attached-bottom.tether-element-attached-center .tether-content{margin-bottom:16px}.tether-element.tether-theme-arrows.tether-element-attached-bottom.tether-element-attached-center .tether-content:before{top:100%;left:50%;margin-left:-16px;border-top-color:#fff;border-bottom:0}.tether-element.tether-theme-arrows.tether-element-attached-top.tether-element-attached-center .tether-content{margin-top:16px}.tether-element.tether-theme-arrows.tether-element-attached-top.tether-element-attached-center .tether-content:before{bottom:100%;left:50%;margin-left:-16px;border-bottom-color:#fff;border-top:0}.tether-element.tether-theme-arrows.tether-element-attached-right.tether-element-attached-middle .tether-content{margin-right:16px}.tether-element.tether-theme-arrows.tether-element-attached-right.tether-element-attached-middle .tether-content:before{left:100%;top:50%;margin-top:-16px;border-left-color:#fff;border-right:0}.tether-element.tether-theme-arrows.tether-element-attached-left.tether-element-attached-middle .tether-content{margin-left:16px}.tether-element.tether-theme-arrows.tether-element-attached-left.tether-element-attached-middle .tether-content:before{right:100%;top:50%;margin-top:-16px;border-right-color:#fff;border-left:0}.tether-element.tether-theme-arrows.tether-element-attached-left.tether-target-attached-center .tether-content{left:-32px}.tether-element.tether-theme-arrows.tether-element-attached-right.tether-target-attached-center .tether-content{left:32px}.tether-element.tether-theme-arrows.tether-element-attached-top.tether-element-attached-left.tether-target-attached-middle .tether-content{margin-top:16px}.tether-element.tether-theme-arrows.tether-element-attached-top.tether-element-attached-left.tether-target-attached-middle .tether-content:before{bottom:100%;left:16px;border-bottom-color:#fff;border-top:0}.tether-element.tether-theme-arrows.tether-element-attached-top.tether-element-attached-right.tether-target-attached-middle .tether-content{margin-top:16px}.tether-element.tether-theme-arrows.tether-element-attached-top.tether-element-attached-right.tether-target-attached-middle .tether-content:before{bottom:100%;right:16px;border-bottom-color:#fff;border-top:0}.tether-element.tether-theme-arrows.tether-element-attached-bottom.tether-element-attached-left.tether-target-attached-middle .tether-content{margin-bottom:16px}.tether-element.tether-theme-arrows.tether-element-attached-bottom.tether-element-attached-left.tether-target-attached-middle .tether-content:before{top:100%;left:16px;border-top-color:#fff;border-bottom:0}.tether-element.tether-theme-arrows.tether-element-attached-bottom.tether-element-attached-right.tether-target-attached-middle .tether-content{margin-bottom:16px}.tether-element.tether-theme-arrows.tether-element-attached-bottom.tether-element-attached-right.tether-target-attached-middle .tether-content:before{top:100%;right:16px;border-top-color:#fff;border-bottom:0}.tether-element.tether-theme-arrows.tether-element-attached-top.tether-element-attached-left.tether-target-attached-bottom .tether-content{margin-top:16px}.tether-element.tether-theme-arrows.tether-element-attached-top.tether-element-attached-left.tether-target-attached-bottom .tether-content:before{bottom:100%;left:16px;border-bottom-color:#fff;border-top:0}.tether-element.tether-theme-arrows.tether-element-attached-top.tether-element-attached-right.tether-target-attached-bottom .tether-content{margin-top:16px}.tether-element.tether-theme-arrows.tether-element-attached-top.tether-element-attached-right.tether-target-attached-bottom .tether-content:before{bottom:100%;right:16px;border-bottom-color:#fff;border-top:0}.tether-element.tether-theme-arrows.tether-element-attached-bottom.tether-element-attached-left.tether-target-attached-top .tether-content{margin-bottom:16px}.tether-element.tether-theme-arrows.tether-element-attached-bottom.tether-element-attached-left.tether-target-attached-top .tether-content:before{top:100%;left:16px;border-top-color:#fff;border-bottom:0}.tether-element.tether-theme-arrows.tether-element-attached-bottom.tether-element-attached-right.tether-target-attached-top .tether-content{margin-bottom:16px}.tether-element.tether-theme-arrows.tether-element-attached-bottom.tether-element-attached-right.tether-target-attached-top .tether-content:before{top:100%;right:16px;border-top-color:#fff;border-bottom:0}.tether-element.tether-theme-arrows.tether-element-attached-top.tether-element-attached-right.tether-target-attached-left .tether-content{margin-right:16px}.tether-element.tether-theme-arrows.tether-element-attached-top.tether-element-attached-right.tether-target-attached-left .tether-content:before{top:16px;left:100%;border-left-color:#fff;border-right:0}.tether-element.tether-theme-arrows.tether-element-attached-top.tether-element-attached-left.tether-target-attached-right .tether-content{margin-left:16px}.tether-element.tether-theme-arrows.tether-element-attached-top.tether-element-attached-left.tether-target-attached-right .tether-content:before{top:16px;right:100%;border-right-color:#fff;border-left:0}.tether-element.tether-theme-arrows.tether-element-attached-bottom.tether-element-attached-right.tether-target-attached-left .tether-content{margin-right:16px}.tether-element.tether-theme-arrows.tether-element-attached-bottom.tether-element-attached-right.tether-target-attached-left .tether-content:before{bottom:16px;left:100%;border-left-color:#fff;border-right:0}.tether-element.tether-theme-arrows.tether-element-attached-bottom.tether-element-attached-left.tether-target-attached-right .tether-content{margin-left:16px}.tether-element.tether-theme-arrows.tether-element-attached-bottom.tether-element-attached-left.tether-target-attached-right .tether-content:before{bottom:16px;right:100%;border-right-color:#fff;border-left:0} \ No newline at end of file diff --git a/dist/css/tether-theme-basic.css b/dist/css/tether-theme-basic.css deleted file mode 100644 index be7fc4c50..000000000 --- a/dist/css/tether-theme-basic.css +++ /dev/null @@ -1,26 +0,0 @@ -.tether-element, .tether-element:after, .tether-element:before, .tether-element *, .tether-element *:after, .tether-element *:before { - box-sizing: border-box; -} - -.tether-element { - position: absolute; - display: none; -} -.tether-element.tether-open { - display: block; -} - -.tether-element.tether-theme-basic { - max-width: 100%; - max-height: 100%; -} -.tether-element.tether-theme-basic .tether-content { - border-radius: 5px; - box-shadow: 0 2px 8px rgba(0, 0, 0, 0.2); - font-family: inherit; - background: #fff; - color: inherit; - padding: 1em; - font-size: 1.1em; - line-height: 1.5em; -} \ No newline at end of file diff --git a/dist/css/tether-theme-basic.min.css b/dist/css/tether-theme-basic.min.css deleted file mode 100644 index 05c2396e9..000000000 --- a/dist/css/tether-theme-basic.min.css +++ /dev/null @@ -1 +0,0 @@ -.tether-element,.tether-element *,.tether-element:after,.tether-element :after,.tether-element:before,.tether-element :before{box-sizing:border-box}.tether-element{position:absolute;display:none}.tether-element.tether-open{display:block}.tether-element.tether-theme-basic{max-width:100%;max-height:100%}.tether-element.tether-theme-basic .tether-content{border-radius:5px;box-shadow:0 2px 8px rgba(0,0,0,.2);font-family:inherit;background:#fff;color:inherit;padding:1em;font-size:1.1em;line-height:1.5em} \ No newline at end of file diff --git a/dist/css/tether.css b/dist/css/tether.css deleted file mode 100644 index b22628bd4..000000000 --- a/dist/css/tether.css +++ /dev/null @@ -1,11 +0,0 @@ -.tether-element, .tether-element:after, .tether-element:before, .tether-element *, .tether-element *:after, .tether-element *:before { - box-sizing: border-box; -} - -.tether-element { - position: absolute; - display: none; -} -.tether-element.tether-open { - display: block; -} \ No newline at end of file diff --git a/dist/css/tether.min.css b/dist/css/tether.min.css deleted file mode 100644 index a8534ee53..000000000 --- a/dist/css/tether.min.css +++ /dev/null @@ -1 +0,0 @@ -.tether-element,.tether-element *,.tether-element:after,.tether-element :after,.tether-element:before,.tether-element :before{box-sizing:border-box}.tether-element{position:absolute;display:none}.tether-element.tether-open{display:block} \ No newline at end of file diff --git a/dist/js/tether.esm.js b/dist/js/tether.esm.js deleted file mode 100644 index 769d98f7c..000000000 --- a/dist/js/tether.esm.js +++ /dev/null @@ -1,1976 +0,0 @@ -/*! tether 2.0.0-beta.5 */ - -function _inheritsLoose(subClass, superClass) { - subClass.prototype = Object.create(superClass.prototype); - subClass.prototype.constructor = subClass; - subClass.__proto__ = superClass; -} - -function _assertThisInitialized(self) { - if (self === void 0) { - throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); - } - - return self; -} - -/** - * Checks if `value` is classified as a `Function` object. - * @param {*} value The param to check if it is a function - */ -function isFunction(value) { - return typeof value === 'function'; -} -/** - * Checks if `value` is classified as a `Number` object. - * @param {*} value The param to check if it is a number - */ - -function isNumber(value) { - return typeof value === 'number'; -} -/** - * Checks if `value` is classified as an `Object`. - * @param {*} value The param to check if it is an object - */ - -function isObject(value) { - return typeof value === 'object'; -} -/** - * Checks if `value` is classified as a `String` object. - * @param {*} value The param to check if it is a string - */ - -function isString(value) { - return typeof value === 'string'; -} -/** - * Checks if `value` is undefined. - * @param {*} value The param to check if it is undefined - */ - -function isUndefined(value) { - return value === undefined; -} - -function addClass(el, name) { - name.split(' ').forEach(function (cls) { - if (cls.trim()) { - el.classList.add(cls); - } - }); -} -/** - * Get class string based on previously determined classes - * @param {String} [key=''] - default value for the classes object - * @param {Object} classes - * @param {String} classPrefix - */ - -function getClass(key, classes, classPrefix) { - if (key === void 0) { - key = ''; - } - - if (!isUndefined(classes) && !isUndefined(classes[key])) { - if (classes[key] === false) { - return ''; - } - - return classes[key]; - } else if (classPrefix) { - return classPrefix + "-" + key; - } else { - return key; - } -} -function removeClass(el, name) { - name.split(' ').forEach(function (cls) { - if (cls.trim()) { - el.classList.remove(cls); - } - }); -} -function updateClasses(el, add, all) { - // Of the set of 'all' classes, we need the 'add' classes, and only the - // 'add' classes to be set. - all.forEach(function (cls) { - if (add.indexOf(cls) === -1 && el.classList.contains(cls)) { - removeClass(el, cls); - } - }); - add.forEach(function (cls) { - if (!el.classList.contains(cls)) { - addClass(el, cls); - } - }); -} - -var deferred = []; -function defer(fn) { - deferred.push(fn); -} -function flush() { - var fn; // eslint-disable-next-line - - while (fn = deferred.pop()) { - fn(); - } -} - -var _scrollBarSize = null; -function extend(out) { - if (out === void 0) { - out = {}; - } - - var args = []; - Array.prototype.push.apply(args, arguments); - args.slice(1).forEach(function (obj) { - if (obj) { - for (var key in obj) { - if ({}.hasOwnProperty.call(obj, key)) { - out[key] = obj[key]; - } - } - } - }); - return out; -} -function getScrollBarSize() { - if (_scrollBarSize) { - return _scrollBarSize; - } - - var inner = document.createElement('div'); - inner.style.width = '100%'; - inner.style.height = '200px'; - var outer = document.createElement('div'); - extend(outer.style, { - position: 'absolute', - top: 0, - left: 0, - pointerEvents: 'none', - visibility: 'hidden', - width: '200px', - height: '150px', - overflow: 'hidden' - }); - outer.appendChild(inner); - document.body.appendChild(outer); - var widthContained = inner.offsetWidth; - outer.style.overflow = 'scroll'; - var widthScroll = inner.offsetWidth; - - if (widthContained === widthScroll) { - widthScroll = outer.clientWidth; - } - - document.body.removeChild(outer); - var width = widthContained - widthScroll; - _scrollBarSize = { - width: width, - height: width - }; - return _scrollBarSize; -} -var uniqueId = function () { - var id = 0; - return function () { - return ++id; - }; -}(); - -var zeroPosCache = {}; -var zeroElement = null; -function getBounds(body, el) { - var doc; - - if (el === document) { - doc = document; - el = document.documentElement; - } else { - doc = el.ownerDocument; - } - - var docEl = doc.documentElement; - - var box = _getActualBoundingClientRect(el); - - var origin = _getOrigin(body); - - box.top -= origin.top; - box.left -= origin.left; - - if (isUndefined(box.width)) { - box.width = document.body.scrollWidth - box.left - box.right; - } - - if (isUndefined(box.height)) { - box.height = document.body.scrollHeight - box.top - box.bottom; - } - - box.top = box.top - docEl.clientTop; - box.left = box.left - docEl.clientLeft; - box.right = doc.body.clientWidth - box.width - box.left; - box.bottom = doc.body.clientHeight - box.height - box.top; - return box; -} -/** - * Gets bounds for when target modifiier is 'scroll-handle' - * @param target - * @return {{left: number, width: number, height: number}} - */ - -function getScrollHandleBounds(body, target) { - var bounds; // We have to do the check for the scrollTop and if target === document.body here and set to variables - // because we may reset target below. - - var targetScrollTop = target.scrollTop; - var targetIsBody = target === document.body; - - if (targetIsBody) { - target = document.documentElement; - bounds = { - left: pageXOffset, - top: pageYOffset, - height: innerHeight, - width: innerWidth - }; - } else { - bounds = getBounds(body, target); - } - - var style = getComputedStyle(target); - var hasBottomScroll = target.scrollWidth > target.clientWidth || [style.overflow, style.overflowX].indexOf('scroll') >= 0 || !targetIsBody; - var scrollBottom = 0; - - if (hasBottomScroll) { - scrollBottom = 15; - } - - var height = bounds.height - parseFloat(style.borderTopWidth) - parseFloat(style.borderBottomWidth) - scrollBottom; - var out = { - width: 15, - height: height * 0.975 * (height / target.scrollHeight), - left: bounds.left + bounds.width - parseFloat(style.borderLeftWidth) - 15 - }; - var fitAdj = 0; - - if (height < 408 && targetIsBody) { - fitAdj = -0.00011 * Math.pow(height, 2) - 0.00727 * height + 22.58; - } - - if (!targetIsBody) { - out.height = Math.max(out.height, 24); - } - - var scrollPercentage = targetScrollTop / (target.scrollHeight - height); - out.top = scrollPercentage * (height - out.height - fitAdj) + bounds.top + parseFloat(style.borderTopWidth); - - if (targetIsBody) { - out.height = Math.max(out.height, 24); - } - - return out; -} -/** - * Gets bounds for when target modifiier is 'visible - * @param target - * @return {{top: *, left: *, width: *, height: *}} - */ - -function getVisibleBounds(body, target) { - if (target === document.body) { - return { - top: pageYOffset, - left: pageXOffset, - height: innerHeight, - width: innerWidth - }; - } else { - var bounds = getBounds(body, target); - var out = { - height: bounds.height, - width: bounds.width, - top: bounds.top, - left: bounds.left - }; - out.height = Math.min(out.height, bounds.height - (pageYOffset - bounds.top)); - out.height = Math.min(out.height, bounds.height - (bounds.top + bounds.height - (pageYOffset + innerHeight))); - out.height = Math.min(innerHeight, out.height); - out.height -= 2; - out.width = Math.min(out.width, bounds.width - (pageXOffset - bounds.left)); - out.width = Math.min(out.width, bounds.width - (bounds.left + bounds.width - (pageXOffset + innerWidth))); - out.width = Math.min(innerWidth, out.width); - out.width -= 2; - - if (out.top < pageYOffset) { - out.top = pageYOffset; - } - - if (out.left < pageXOffset) { - out.left = pageXOffset; - } - - return out; - } -} -function removeUtilElements(body) { - if (zeroElement) { - body.removeChild(zeroElement); - } - - zeroElement = null; -} -/** - * Same as native getBoundingClientRect, except it takes into account parent offsets - * if the element lies within a nested document ( or

            -

            @@ -46,7 +45,7 @@

            Tether

            'jankyness' as the page is scrolled and resized. The page can maintain 60fps scrolling even with dozens or hundreds of tethers on screen (pop open the devtools timeline as you scroll this page).

            -

            Tether is 5kb minified and gzipped, and supports IE9+, and all modern +

            Tether is 5kb minified and gzipped, and supports IE 10+, and all modern browsers.

            Projects Built With Tether

            From 0528652005588933eed6798c365580d4da9ed1a1 Mon Sep 17 00:00:00 2001 From: Robert Wagner Date: Thu, 17 Dec 2020 09:31:32 -0500 Subject: [PATCH 29/40] Rebuild docs --- dist/css/tether-theme-arrows-dark.css | 190 -- dist/css/tether-theme-arrows-dark.min.css | 1 - dist/css/tether-theme-arrows.css | 192 -- dist/css/tether-theme-arrows.min.css | 1 - dist/css/tether-theme-basic.css | 26 - dist/css/tether-theme-basic.min.css | 1 - dist/css/tether.css | 11 - dist/css/tether.min.css | 1 - dist/js/tether.esm.js | 1974 -------------------- dist/js/tether.esm.min.js | 4 - dist/js/tether.js | 1982 --------------------- dist/js/tether.min.js | 4 - docs/welcome/index.html | 11 - 13 files changed, 4398 deletions(-) delete mode 100644 dist/css/tether-theme-arrows-dark.css delete mode 100644 dist/css/tether-theme-arrows-dark.min.css delete mode 100644 dist/css/tether-theme-arrows.css delete mode 100644 dist/css/tether-theme-arrows.min.css delete mode 100644 dist/css/tether-theme-basic.css delete mode 100644 dist/css/tether-theme-basic.min.css delete mode 100644 dist/css/tether.css delete mode 100644 dist/css/tether.min.css delete mode 100644 dist/js/tether.esm.js delete mode 100644 dist/js/tether.esm.min.js delete mode 100644 dist/js/tether.js delete mode 100644 dist/js/tether.min.js diff --git a/dist/css/tether-theme-arrows-dark.css b/dist/css/tether-theme-arrows-dark.css deleted file mode 100644 index 0ac6b5abe..000000000 --- a/dist/css/tether-theme-arrows-dark.css +++ /dev/null @@ -1,190 +0,0 @@ -.tether-element, .tether-element:after, .tether-element:before, .tether-element *, .tether-element *:after, .tether-element *:before { - box-sizing: border-box; -} - -.tether-element { - position: absolute; - display: none; -} -.tether-element.tether-open { - display: block; -} - -.tether-element.tether-theme-arrows-dark { - max-width: 100%; - max-height: 100%; -} -.tether-element.tether-theme-arrows-dark .tether-content { - border-radius: 5px; - position: relative; - font-family: inherit; - background: #000; - color: #fff; - padding: 1em; - font-size: 1.1em; - line-height: 1.5em; -} -.tether-element.tether-theme-arrows-dark .tether-content:before { - content: ""; - display: block; - position: absolute; - width: 0; - height: 0; - border-color: transparent; - border-width: 16px; - border-style: solid; -} -.tether-element.tether-theme-arrows-dark.tether-element-attached-bottom.tether-element-attached-center .tether-content { - margin-bottom: 16px; -} -.tether-element.tether-theme-arrows-dark.tether-element-attached-bottom.tether-element-attached-center .tether-content:before { - top: 100%; - left: 50%; - margin-left: -16px; - border-top-color: #000; - border-bottom: 0; -} -.tether-element.tether-theme-arrows-dark.tether-element-attached-top.tether-element-attached-center .tether-content { - margin-top: 16px; -} -.tether-element.tether-theme-arrows-dark.tether-element-attached-top.tether-element-attached-center .tether-content:before { - bottom: 100%; - left: 50%; - margin-left: -16px; - border-bottom-color: #000; - border-top: 0; -} -.tether-element.tether-theme-arrows-dark.tether-element-attached-right.tether-element-attached-middle .tether-content { - margin-right: 16px; -} -.tether-element.tether-theme-arrows-dark.tether-element-attached-right.tether-element-attached-middle .tether-content:before { - left: 100%; - top: 50%; - margin-top: -16px; - border-left-color: #000; - border-right: 0; -} -.tether-element.tether-theme-arrows-dark.tether-element-attached-left.tether-element-attached-middle .tether-content { - margin-left: 16px; -} -.tether-element.tether-theme-arrows-dark.tether-element-attached-left.tether-element-attached-middle .tether-content:before { - right: 100%; - top: 50%; - margin-top: -16px; - border-right-color: #000; - border-left: 0; -} -.tether-element.tether-theme-arrows-dark.tether-element-attached-left.tether-target-attached-center .tether-content { - left: -32px; -} -.tether-element.tether-theme-arrows-dark.tether-element-attached-right.tether-target-attached-center .tether-content { - left: 32px; -} -.tether-element.tether-theme-arrows-dark.tether-element-attached-top.tether-element-attached-left.tether-target-attached-middle .tether-content { - margin-top: 16px; -} -.tether-element.tether-theme-arrows-dark.tether-element-attached-top.tether-element-attached-left.tether-target-attached-middle .tether-content:before { - bottom: 100%; - left: 16px; - border-bottom-color: #000; - border-top: 0; -} -.tether-element.tether-theme-arrows-dark.tether-element-attached-top.tether-element-attached-right.tether-target-attached-middle .tether-content { - margin-top: 16px; -} -.tether-element.tether-theme-arrows-dark.tether-element-attached-top.tether-element-attached-right.tether-target-attached-middle .tether-content:before { - bottom: 100%; - right: 16px; - border-bottom-color: #000; - border-top: 0; -} -.tether-element.tether-theme-arrows-dark.tether-element-attached-bottom.tether-element-attached-left.tether-target-attached-middle .tether-content { - margin-bottom: 16px; -} -.tether-element.tether-theme-arrows-dark.tether-element-attached-bottom.tether-element-attached-left.tether-target-attached-middle .tether-content:before { - top: 100%; - left: 16px; - border-top-color: #000; - border-bottom: 0; -} -.tether-element.tether-theme-arrows-dark.tether-element-attached-bottom.tether-element-attached-right.tether-target-attached-middle .tether-content { - margin-bottom: 16px; -} -.tether-element.tether-theme-arrows-dark.tether-element-attached-bottom.tether-element-attached-right.tether-target-attached-middle .tether-content:before { - top: 100%; - right: 16px; - border-top-color: #000; - border-bottom: 0; -} -.tether-element.tether-theme-arrows-dark.tether-element-attached-top.tether-element-attached-left.tether-target-attached-bottom .tether-content { - margin-top: 16px; -} -.tether-element.tether-theme-arrows-dark.tether-element-attached-top.tether-element-attached-left.tether-target-attached-bottom .tether-content:before { - bottom: 100%; - left: 16px; - border-bottom-color: #000; - border-top: 0; -} -.tether-element.tether-theme-arrows-dark.tether-element-attached-top.tether-element-attached-right.tether-target-attached-bottom .tether-content { - margin-top: 16px; -} -.tether-element.tether-theme-arrows-dark.tether-element-attached-top.tether-element-attached-right.tether-target-attached-bottom .tether-content:before { - bottom: 100%; - right: 16px; - border-bottom-color: #000; - border-top: 0; -} -.tether-element.tether-theme-arrows-dark.tether-element-attached-bottom.tether-element-attached-left.tether-target-attached-top .tether-content { - margin-bottom: 16px; -} -.tether-element.tether-theme-arrows-dark.tether-element-attached-bottom.tether-element-attached-left.tether-target-attached-top .tether-content:before { - top: 100%; - left: 16px; - border-top-color: #000; - border-bottom: 0; -} -.tether-element.tether-theme-arrows-dark.tether-element-attached-bottom.tether-element-attached-right.tether-target-attached-top .tether-content { - margin-bottom: 16px; -} -.tether-element.tether-theme-arrows-dark.tether-element-attached-bottom.tether-element-attached-right.tether-target-attached-top .tether-content:before { - top: 100%; - right: 16px; - border-top-color: #000; - border-bottom: 0; -} -.tether-element.tether-theme-arrows-dark.tether-element-attached-top.tether-element-attached-right.tether-target-attached-left .tether-content { - margin-right: 16px; -} -.tether-element.tether-theme-arrows-dark.tether-element-attached-top.tether-element-attached-right.tether-target-attached-left .tether-content:before { - top: 16px; - left: 100%; - border-left-color: #000; - border-right: 0; -} -.tether-element.tether-theme-arrows-dark.tether-element-attached-top.tether-element-attached-left.tether-target-attached-right .tether-content { - margin-left: 16px; -} -.tether-element.tether-theme-arrows-dark.tether-element-attached-top.tether-element-attached-left.tether-target-attached-right .tether-content:before { - top: 16px; - right: 100%; - border-right-color: #000; - border-left: 0; -} -.tether-element.tether-theme-arrows-dark.tether-element-attached-bottom.tether-element-attached-right.tether-target-attached-left .tether-content { - margin-right: 16px; -} -.tether-element.tether-theme-arrows-dark.tether-element-attached-bottom.tether-element-attached-right.tether-target-attached-left .tether-content:before { - bottom: 16px; - left: 100%; - border-left-color: #000; - border-right: 0; -} -.tether-element.tether-theme-arrows-dark.tether-element-attached-bottom.tether-element-attached-left.tether-target-attached-right .tether-content { - margin-left: 16px; -} -.tether-element.tether-theme-arrows-dark.tether-element-attached-bottom.tether-element-attached-left.tether-target-attached-right .tether-content:before { - bottom: 16px; - right: 100%; - border-right-color: #000; - border-left: 0; -} \ No newline at end of file diff --git a/dist/css/tether-theme-arrows-dark.min.css b/dist/css/tether-theme-arrows-dark.min.css deleted file mode 100644 index c1b8baacd..000000000 --- a/dist/css/tether-theme-arrows-dark.min.css +++ /dev/null @@ -1 +0,0 @@ -.tether-element,.tether-element *,.tether-element:after,.tether-element :after,.tether-element:before,.tether-element :before{box-sizing:border-box}.tether-element{position:absolute;display:none}.tether-element.tether-open{display:block}.tether-element.tether-theme-arrows-dark{max-width:100%;max-height:100%}.tether-element.tether-theme-arrows-dark .tether-content{border-radius:5px;position:relative;font-family:inherit;background:#000;color:#fff;padding:1em;font-size:1.1em;line-height:1.5em}.tether-element.tether-theme-arrows-dark .tether-content:before{content:"";display:block;position:absolute;width:0;height:0;border:16px solid transparent}.tether-element.tether-theme-arrows-dark.tether-element-attached-bottom.tether-element-attached-center .tether-content{margin-bottom:16px}.tether-element.tether-theme-arrows-dark.tether-element-attached-bottom.tether-element-attached-center .tether-content:before{top:100%;left:50%;margin-left:-16px;border-top-color:#000;border-bottom:0}.tether-element.tether-theme-arrows-dark.tether-element-attached-top.tether-element-attached-center .tether-content{margin-top:16px}.tether-element.tether-theme-arrows-dark.tether-element-attached-top.tether-element-attached-center .tether-content:before{bottom:100%;left:50%;margin-left:-16px;border-bottom-color:#000;border-top:0}.tether-element.tether-theme-arrows-dark.tether-element-attached-right.tether-element-attached-middle .tether-content{margin-right:16px}.tether-element.tether-theme-arrows-dark.tether-element-attached-right.tether-element-attached-middle .tether-content:before{left:100%;top:50%;margin-top:-16px;border-left-color:#000;border-right:0}.tether-element.tether-theme-arrows-dark.tether-element-attached-left.tether-element-attached-middle .tether-content{margin-left:16px}.tether-element.tether-theme-arrows-dark.tether-element-attached-left.tether-element-attached-middle .tether-content:before{right:100%;top:50%;margin-top:-16px;border-right-color:#000;border-left:0}.tether-element.tether-theme-arrows-dark.tether-element-attached-left.tether-target-attached-center .tether-content{left:-32px}.tether-element.tether-theme-arrows-dark.tether-element-attached-right.tether-target-attached-center .tether-content{left:32px}.tether-element.tether-theme-arrows-dark.tether-element-attached-top.tether-element-attached-left.tether-target-attached-middle .tether-content{margin-top:16px}.tether-element.tether-theme-arrows-dark.tether-element-attached-top.tether-element-attached-left.tether-target-attached-middle .tether-content:before{bottom:100%;left:16px;border-bottom-color:#000;border-top:0}.tether-element.tether-theme-arrows-dark.tether-element-attached-top.tether-element-attached-right.tether-target-attached-middle .tether-content{margin-top:16px}.tether-element.tether-theme-arrows-dark.tether-element-attached-top.tether-element-attached-right.tether-target-attached-middle .tether-content:before{bottom:100%;right:16px;border-bottom-color:#000;border-top:0}.tether-element.tether-theme-arrows-dark.tether-element-attached-bottom.tether-element-attached-left.tether-target-attached-middle .tether-content{margin-bottom:16px}.tether-element.tether-theme-arrows-dark.tether-element-attached-bottom.tether-element-attached-left.tether-target-attached-middle .tether-content:before{top:100%;left:16px;border-top-color:#000;border-bottom:0}.tether-element.tether-theme-arrows-dark.tether-element-attached-bottom.tether-element-attached-right.tether-target-attached-middle .tether-content{margin-bottom:16px}.tether-element.tether-theme-arrows-dark.tether-element-attached-bottom.tether-element-attached-right.tether-target-attached-middle .tether-content:before{top:100%;right:16px;border-top-color:#000;border-bottom:0}.tether-element.tether-theme-arrows-dark.tether-element-attached-top.tether-element-attached-left.tether-target-attached-bottom .tether-content{margin-top:16px}.tether-element.tether-theme-arrows-dark.tether-element-attached-top.tether-element-attached-left.tether-target-attached-bottom .tether-content:before{bottom:100%;left:16px;border-bottom-color:#000;border-top:0}.tether-element.tether-theme-arrows-dark.tether-element-attached-top.tether-element-attached-right.tether-target-attached-bottom .tether-content{margin-top:16px}.tether-element.tether-theme-arrows-dark.tether-element-attached-top.tether-element-attached-right.tether-target-attached-bottom .tether-content:before{bottom:100%;right:16px;border-bottom-color:#000;border-top:0}.tether-element.tether-theme-arrows-dark.tether-element-attached-bottom.tether-element-attached-left.tether-target-attached-top .tether-content{margin-bottom:16px}.tether-element.tether-theme-arrows-dark.tether-element-attached-bottom.tether-element-attached-left.tether-target-attached-top .tether-content:before{top:100%;left:16px;border-top-color:#000;border-bottom:0}.tether-element.tether-theme-arrows-dark.tether-element-attached-bottom.tether-element-attached-right.tether-target-attached-top .tether-content{margin-bottom:16px}.tether-element.tether-theme-arrows-dark.tether-element-attached-bottom.tether-element-attached-right.tether-target-attached-top .tether-content:before{top:100%;right:16px;border-top-color:#000;border-bottom:0}.tether-element.tether-theme-arrows-dark.tether-element-attached-top.tether-element-attached-right.tether-target-attached-left .tether-content{margin-right:16px}.tether-element.tether-theme-arrows-dark.tether-element-attached-top.tether-element-attached-right.tether-target-attached-left .tether-content:before{top:16px;left:100%;border-left-color:#000;border-right:0}.tether-element.tether-theme-arrows-dark.tether-element-attached-top.tether-element-attached-left.tether-target-attached-right .tether-content{margin-left:16px}.tether-element.tether-theme-arrows-dark.tether-element-attached-top.tether-element-attached-left.tether-target-attached-right .tether-content:before{top:16px;right:100%;border-right-color:#000;border-left:0}.tether-element.tether-theme-arrows-dark.tether-element-attached-bottom.tether-element-attached-right.tether-target-attached-left .tether-content{margin-right:16px}.tether-element.tether-theme-arrows-dark.tether-element-attached-bottom.tether-element-attached-right.tether-target-attached-left .tether-content:before{bottom:16px;left:100%;border-left-color:#000;border-right:0}.tether-element.tether-theme-arrows-dark.tether-element-attached-bottom.tether-element-attached-left.tether-target-attached-right .tether-content{margin-left:16px}.tether-element.tether-theme-arrows-dark.tether-element-attached-bottom.tether-element-attached-left.tether-target-attached-right .tether-content:before{bottom:16px;right:100%;border-right-color:#000;border-left:0} \ No newline at end of file diff --git a/dist/css/tether-theme-arrows.css b/dist/css/tether-theme-arrows.css deleted file mode 100644 index 9052dab1e..000000000 --- a/dist/css/tether-theme-arrows.css +++ /dev/null @@ -1,192 +0,0 @@ -.tether-element, .tether-element:after, .tether-element:before, .tether-element *, .tether-element *:after, .tether-element *:before { - box-sizing: border-box; -} - -.tether-element { - position: absolute; - display: none; -} -.tether-element.tether-open { - display: block; -} - -.tether-element.tether-theme-arrows { - max-width: 100%; - max-height: 100%; -} -.tether-element.tether-theme-arrows .tether-content { - border-radius: 5px; - position: relative; - font-family: inherit; - background: #fff; - color: inherit; - padding: 1em; - font-size: 1.1em; - line-height: 1.5em; - transform: translateZ(0); - filter: drop-shadow(0 1px 4px rgba(0, 0, 0, 0.2)); -} -.tether-element.tether-theme-arrows .tether-content:before { - content: ""; - display: block; - position: absolute; - width: 0; - height: 0; - border-color: transparent; - border-width: 16px; - border-style: solid; -} -.tether-element.tether-theme-arrows.tether-element-attached-bottom.tether-element-attached-center .tether-content { - margin-bottom: 16px; -} -.tether-element.tether-theme-arrows.tether-element-attached-bottom.tether-element-attached-center .tether-content:before { - top: 100%; - left: 50%; - margin-left: -16px; - border-top-color: #fff; - border-bottom: 0; -} -.tether-element.tether-theme-arrows.tether-element-attached-top.tether-element-attached-center .tether-content { - margin-top: 16px; -} -.tether-element.tether-theme-arrows.tether-element-attached-top.tether-element-attached-center .tether-content:before { - bottom: 100%; - left: 50%; - margin-left: -16px; - border-bottom-color: #fff; - border-top: 0; -} -.tether-element.tether-theme-arrows.tether-element-attached-right.tether-element-attached-middle .tether-content { - margin-right: 16px; -} -.tether-element.tether-theme-arrows.tether-element-attached-right.tether-element-attached-middle .tether-content:before { - left: 100%; - top: 50%; - margin-top: -16px; - border-left-color: #fff; - border-right: 0; -} -.tether-element.tether-theme-arrows.tether-element-attached-left.tether-element-attached-middle .tether-content { - margin-left: 16px; -} -.tether-element.tether-theme-arrows.tether-element-attached-left.tether-element-attached-middle .tether-content:before { - right: 100%; - top: 50%; - margin-top: -16px; - border-right-color: #fff; - border-left: 0; -} -.tether-element.tether-theme-arrows.tether-element-attached-left.tether-target-attached-center .tether-content { - left: -32px; -} -.tether-element.tether-theme-arrows.tether-element-attached-right.tether-target-attached-center .tether-content { - left: 32px; -} -.tether-element.tether-theme-arrows.tether-element-attached-top.tether-element-attached-left.tether-target-attached-middle .tether-content { - margin-top: 16px; -} -.tether-element.tether-theme-arrows.tether-element-attached-top.tether-element-attached-left.tether-target-attached-middle .tether-content:before { - bottom: 100%; - left: 16px; - border-bottom-color: #fff; - border-top: 0; -} -.tether-element.tether-theme-arrows.tether-element-attached-top.tether-element-attached-right.tether-target-attached-middle .tether-content { - margin-top: 16px; -} -.tether-element.tether-theme-arrows.tether-element-attached-top.tether-element-attached-right.tether-target-attached-middle .tether-content:before { - bottom: 100%; - right: 16px; - border-bottom-color: #fff; - border-top: 0; -} -.tether-element.tether-theme-arrows.tether-element-attached-bottom.tether-element-attached-left.tether-target-attached-middle .tether-content { - margin-bottom: 16px; -} -.tether-element.tether-theme-arrows.tether-element-attached-bottom.tether-element-attached-left.tether-target-attached-middle .tether-content:before { - top: 100%; - left: 16px; - border-top-color: #fff; - border-bottom: 0; -} -.tether-element.tether-theme-arrows.tether-element-attached-bottom.tether-element-attached-right.tether-target-attached-middle .tether-content { - margin-bottom: 16px; -} -.tether-element.tether-theme-arrows.tether-element-attached-bottom.tether-element-attached-right.tether-target-attached-middle .tether-content:before { - top: 100%; - right: 16px; - border-top-color: #fff; - border-bottom: 0; -} -.tether-element.tether-theme-arrows.tether-element-attached-top.tether-element-attached-left.tether-target-attached-bottom .tether-content { - margin-top: 16px; -} -.tether-element.tether-theme-arrows.tether-element-attached-top.tether-element-attached-left.tether-target-attached-bottom .tether-content:before { - bottom: 100%; - left: 16px; - border-bottom-color: #fff; - border-top: 0; -} -.tether-element.tether-theme-arrows.tether-element-attached-top.tether-element-attached-right.tether-target-attached-bottom .tether-content { - margin-top: 16px; -} -.tether-element.tether-theme-arrows.tether-element-attached-top.tether-element-attached-right.tether-target-attached-bottom .tether-content:before { - bottom: 100%; - right: 16px; - border-bottom-color: #fff; - border-top: 0; -} -.tether-element.tether-theme-arrows.tether-element-attached-bottom.tether-element-attached-left.tether-target-attached-top .tether-content { - margin-bottom: 16px; -} -.tether-element.tether-theme-arrows.tether-element-attached-bottom.tether-element-attached-left.tether-target-attached-top .tether-content:before { - top: 100%; - left: 16px; - border-top-color: #fff; - border-bottom: 0; -} -.tether-element.tether-theme-arrows.tether-element-attached-bottom.tether-element-attached-right.tether-target-attached-top .tether-content { - margin-bottom: 16px; -} -.tether-element.tether-theme-arrows.tether-element-attached-bottom.tether-element-attached-right.tether-target-attached-top .tether-content:before { - top: 100%; - right: 16px; - border-top-color: #fff; - border-bottom: 0; -} -.tether-element.tether-theme-arrows.tether-element-attached-top.tether-element-attached-right.tether-target-attached-left .tether-content { - margin-right: 16px; -} -.tether-element.tether-theme-arrows.tether-element-attached-top.tether-element-attached-right.tether-target-attached-left .tether-content:before { - top: 16px; - left: 100%; - border-left-color: #fff; - border-right: 0; -} -.tether-element.tether-theme-arrows.tether-element-attached-top.tether-element-attached-left.tether-target-attached-right .tether-content { - margin-left: 16px; -} -.tether-element.tether-theme-arrows.tether-element-attached-top.tether-element-attached-left.tether-target-attached-right .tether-content:before { - top: 16px; - right: 100%; - border-right-color: #fff; - border-left: 0; -} -.tether-element.tether-theme-arrows.tether-element-attached-bottom.tether-element-attached-right.tether-target-attached-left .tether-content { - margin-right: 16px; -} -.tether-element.tether-theme-arrows.tether-element-attached-bottom.tether-element-attached-right.tether-target-attached-left .tether-content:before { - bottom: 16px; - left: 100%; - border-left-color: #fff; - border-right: 0; -} -.tether-element.tether-theme-arrows.tether-element-attached-bottom.tether-element-attached-left.tether-target-attached-right .tether-content { - margin-left: 16px; -} -.tether-element.tether-theme-arrows.tether-element-attached-bottom.tether-element-attached-left.tether-target-attached-right .tether-content:before { - bottom: 16px; - right: 100%; - border-right-color: #fff; - border-left: 0; -} \ No newline at end of file diff --git a/dist/css/tether-theme-arrows.min.css b/dist/css/tether-theme-arrows.min.css deleted file mode 100644 index a23bca8bf..000000000 --- a/dist/css/tether-theme-arrows.min.css +++ /dev/null @@ -1 +0,0 @@ -.tether-element,.tether-element *,.tether-element:after,.tether-element :after,.tether-element:before,.tether-element :before{box-sizing:border-box}.tether-element{position:absolute;display:none}.tether-element.tether-open{display:block}.tether-element.tether-theme-arrows{max-width:100%;max-height:100%}.tether-element.tether-theme-arrows .tether-content{border-radius:5px;position:relative;font-family:inherit;background:#fff;color:inherit;padding:1em;font-size:1.1em;line-height:1.5em;transform:translateZ(0);filter:drop-shadow(0 1px 4px rgba(0,0,0,.2))}.tether-element.tether-theme-arrows .tether-content:before{content:"";display:block;position:absolute;width:0;height:0;border:16px solid transparent}.tether-element.tether-theme-arrows.tether-element-attached-bottom.tether-element-attached-center .tether-content{margin-bottom:16px}.tether-element.tether-theme-arrows.tether-element-attached-bottom.tether-element-attached-center .tether-content:before{top:100%;left:50%;margin-left:-16px;border-top-color:#fff;border-bottom:0}.tether-element.tether-theme-arrows.tether-element-attached-top.tether-element-attached-center .tether-content{margin-top:16px}.tether-element.tether-theme-arrows.tether-element-attached-top.tether-element-attached-center .tether-content:before{bottom:100%;left:50%;margin-left:-16px;border-bottom-color:#fff;border-top:0}.tether-element.tether-theme-arrows.tether-element-attached-right.tether-element-attached-middle .tether-content{margin-right:16px}.tether-element.tether-theme-arrows.tether-element-attached-right.tether-element-attached-middle .tether-content:before{left:100%;top:50%;margin-top:-16px;border-left-color:#fff;border-right:0}.tether-element.tether-theme-arrows.tether-element-attached-left.tether-element-attached-middle .tether-content{margin-left:16px}.tether-element.tether-theme-arrows.tether-element-attached-left.tether-element-attached-middle .tether-content:before{right:100%;top:50%;margin-top:-16px;border-right-color:#fff;border-left:0}.tether-element.tether-theme-arrows.tether-element-attached-left.tether-target-attached-center .tether-content{left:-32px}.tether-element.tether-theme-arrows.tether-element-attached-right.tether-target-attached-center .tether-content{left:32px}.tether-element.tether-theme-arrows.tether-element-attached-top.tether-element-attached-left.tether-target-attached-middle .tether-content{margin-top:16px}.tether-element.tether-theme-arrows.tether-element-attached-top.tether-element-attached-left.tether-target-attached-middle .tether-content:before{bottom:100%;left:16px;border-bottom-color:#fff;border-top:0}.tether-element.tether-theme-arrows.tether-element-attached-top.tether-element-attached-right.tether-target-attached-middle .tether-content{margin-top:16px}.tether-element.tether-theme-arrows.tether-element-attached-top.tether-element-attached-right.tether-target-attached-middle .tether-content:before{bottom:100%;right:16px;border-bottom-color:#fff;border-top:0}.tether-element.tether-theme-arrows.tether-element-attached-bottom.tether-element-attached-left.tether-target-attached-middle .tether-content{margin-bottom:16px}.tether-element.tether-theme-arrows.tether-element-attached-bottom.tether-element-attached-left.tether-target-attached-middle .tether-content:before{top:100%;left:16px;border-top-color:#fff;border-bottom:0}.tether-element.tether-theme-arrows.tether-element-attached-bottom.tether-element-attached-right.tether-target-attached-middle .tether-content{margin-bottom:16px}.tether-element.tether-theme-arrows.tether-element-attached-bottom.tether-element-attached-right.tether-target-attached-middle .tether-content:before{top:100%;right:16px;border-top-color:#fff;border-bottom:0}.tether-element.tether-theme-arrows.tether-element-attached-top.tether-element-attached-left.tether-target-attached-bottom .tether-content{margin-top:16px}.tether-element.tether-theme-arrows.tether-element-attached-top.tether-element-attached-left.tether-target-attached-bottom .tether-content:before{bottom:100%;left:16px;border-bottom-color:#fff;border-top:0}.tether-element.tether-theme-arrows.tether-element-attached-top.tether-element-attached-right.tether-target-attached-bottom .tether-content{margin-top:16px}.tether-element.tether-theme-arrows.tether-element-attached-top.tether-element-attached-right.tether-target-attached-bottom .tether-content:before{bottom:100%;right:16px;border-bottom-color:#fff;border-top:0}.tether-element.tether-theme-arrows.tether-element-attached-bottom.tether-element-attached-left.tether-target-attached-top .tether-content{margin-bottom:16px}.tether-element.tether-theme-arrows.tether-element-attached-bottom.tether-element-attached-left.tether-target-attached-top .tether-content:before{top:100%;left:16px;border-top-color:#fff;border-bottom:0}.tether-element.tether-theme-arrows.tether-element-attached-bottom.tether-element-attached-right.tether-target-attached-top .tether-content{margin-bottom:16px}.tether-element.tether-theme-arrows.tether-element-attached-bottom.tether-element-attached-right.tether-target-attached-top .tether-content:before{top:100%;right:16px;border-top-color:#fff;border-bottom:0}.tether-element.tether-theme-arrows.tether-element-attached-top.tether-element-attached-right.tether-target-attached-left .tether-content{margin-right:16px}.tether-element.tether-theme-arrows.tether-element-attached-top.tether-element-attached-right.tether-target-attached-left .tether-content:before{top:16px;left:100%;border-left-color:#fff;border-right:0}.tether-element.tether-theme-arrows.tether-element-attached-top.tether-element-attached-left.tether-target-attached-right .tether-content{margin-left:16px}.tether-element.tether-theme-arrows.tether-element-attached-top.tether-element-attached-left.tether-target-attached-right .tether-content:before{top:16px;right:100%;border-right-color:#fff;border-left:0}.tether-element.tether-theme-arrows.tether-element-attached-bottom.tether-element-attached-right.tether-target-attached-left .tether-content{margin-right:16px}.tether-element.tether-theme-arrows.tether-element-attached-bottom.tether-element-attached-right.tether-target-attached-left .tether-content:before{bottom:16px;left:100%;border-left-color:#fff;border-right:0}.tether-element.tether-theme-arrows.tether-element-attached-bottom.tether-element-attached-left.tether-target-attached-right .tether-content{margin-left:16px}.tether-element.tether-theme-arrows.tether-element-attached-bottom.tether-element-attached-left.tether-target-attached-right .tether-content:before{bottom:16px;right:100%;border-right-color:#fff;border-left:0} \ No newline at end of file diff --git a/dist/css/tether-theme-basic.css b/dist/css/tether-theme-basic.css deleted file mode 100644 index be7fc4c50..000000000 --- a/dist/css/tether-theme-basic.css +++ /dev/null @@ -1,26 +0,0 @@ -.tether-element, .tether-element:after, .tether-element:before, .tether-element *, .tether-element *:after, .tether-element *:before { - box-sizing: border-box; -} - -.tether-element { - position: absolute; - display: none; -} -.tether-element.tether-open { - display: block; -} - -.tether-element.tether-theme-basic { - max-width: 100%; - max-height: 100%; -} -.tether-element.tether-theme-basic .tether-content { - border-radius: 5px; - box-shadow: 0 2px 8px rgba(0, 0, 0, 0.2); - font-family: inherit; - background: #fff; - color: inherit; - padding: 1em; - font-size: 1.1em; - line-height: 1.5em; -} \ No newline at end of file diff --git a/dist/css/tether-theme-basic.min.css b/dist/css/tether-theme-basic.min.css deleted file mode 100644 index 05c2396e9..000000000 --- a/dist/css/tether-theme-basic.min.css +++ /dev/null @@ -1 +0,0 @@ -.tether-element,.tether-element *,.tether-element:after,.tether-element :after,.tether-element:before,.tether-element :before{box-sizing:border-box}.tether-element{position:absolute;display:none}.tether-element.tether-open{display:block}.tether-element.tether-theme-basic{max-width:100%;max-height:100%}.tether-element.tether-theme-basic .tether-content{border-radius:5px;box-shadow:0 2px 8px rgba(0,0,0,.2);font-family:inherit;background:#fff;color:inherit;padding:1em;font-size:1.1em;line-height:1.5em} \ No newline at end of file diff --git a/dist/css/tether.css b/dist/css/tether.css deleted file mode 100644 index b22628bd4..000000000 --- a/dist/css/tether.css +++ /dev/null @@ -1,11 +0,0 @@ -.tether-element, .tether-element:after, .tether-element:before, .tether-element *, .tether-element *:after, .tether-element *:before { - box-sizing: border-box; -} - -.tether-element { - position: absolute; - display: none; -} -.tether-element.tether-open { - display: block; -} \ No newline at end of file diff --git a/dist/css/tether.min.css b/dist/css/tether.min.css deleted file mode 100644 index a8534ee53..000000000 --- a/dist/css/tether.min.css +++ /dev/null @@ -1 +0,0 @@ -.tether-element,.tether-element *,.tether-element:after,.tether-element :after,.tether-element:before,.tether-element :before{box-sizing:border-box}.tether-element{position:absolute;display:none}.tether-element.tether-open{display:block} \ No newline at end of file diff --git a/dist/js/tether.esm.js b/dist/js/tether.esm.js deleted file mode 100644 index 5aa5798d0..000000000 --- a/dist/js/tether.esm.js +++ /dev/null @@ -1,1974 +0,0 @@ -/*! tether 2.0.0-beta.5 */ - -function _inheritsLoose(subClass, superClass) { - subClass.prototype = Object.create(superClass.prototype); - subClass.prototype.constructor = subClass; - subClass.__proto__ = superClass; -} - -function _assertThisInitialized(self) { - if (self === void 0) { - throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); - } - - return self; -} - -/** - * Checks if `value` is classified as a `Function` object. - * @param {*} value The param to check if it is a function - */ -function isFunction(value) { - return typeof value === 'function'; -} -/** - * Checks if `value` is classified as a `Number` object. - * @param {*} value The param to check if it is a number - */ - -function isNumber(value) { - return typeof value === 'number'; -} -/** - * Checks if `value` is classified as an `Object`. - * @param {*} value The param to check if it is an object - */ - -function isObject(value) { - return typeof value === 'object'; -} -/** - * Checks if `value` is classified as a `String` object. - * @param {*} value The param to check if it is a string - */ - -function isString(value) { - return typeof value === 'string'; -} -/** - * Checks if `value` is undefined. - * @param {*} value The param to check if it is undefined - */ - -function isUndefined(value) { - return value === undefined; -} - -function addClass(el, name) { - name.split(' ').forEach(function (cls) { - if (cls.trim()) { - el.classList.add(cls); - } - }); -} -/** - * Get class string based on previously determined classes - * @param {String} [key=''] - default value for the classes object - * @param {Object} classes - * @param {String} classPrefix - */ - -function getClass(key, classes, classPrefix) { - if (key === void 0) { - key = ''; - } - - if (!isUndefined(classes) && !isUndefined(classes[key])) { - if (classes[key] === false) { - return ''; - } - - return classes[key]; - } else if (classPrefix) { - return classPrefix + "-" + key; - } else { - return key; - } -} -function removeClass(el, name) { - name.split(' ').forEach(function (cls) { - if (cls.trim()) { - el.classList.remove(cls); - } - }); -} -function updateClasses(el, add, all) { - // Of the set of 'all' classes, we need the 'add' classes, and only the - // 'add' classes to be set. - all.forEach(function (cls) { - if (add.indexOf(cls) === -1 && el.classList.contains(cls)) { - removeClass(el, cls); - } - }); - add.forEach(function (cls) { - if (!el.classList.contains(cls)) { - addClass(el, cls); - } - }); -} - -var deferred = []; -function defer(fn) { - deferred.push(fn); -} -function flush() { - var fn; // eslint-disable-next-line - - while (fn = deferred.pop()) { - fn(); - } -} - -var _scrollBarSize = null; -function extend(out) { - if (out === void 0) { - out = {}; - } - - var args = []; - Array.prototype.push.apply(args, arguments); - args.slice(1).forEach(function (obj) { - if (obj) { - for (var key in obj) { - if ({}.hasOwnProperty.call(obj, key)) { - out[key] = obj[key]; - } - } - } - }); - return out; -} -function getScrollBarSize() { - if (_scrollBarSize) { - return _scrollBarSize; - } - - var inner = document.createElement('div'); - inner.style.width = '100%'; - inner.style.height = '200px'; - var outer = document.createElement('div'); - extend(outer.style, { - position: 'absolute', - top: 0, - left: 0, - pointerEvents: 'none', - visibility: 'hidden', - width: '200px', - height: '150px', - overflow: 'hidden' - }); - outer.appendChild(inner); - document.body.appendChild(outer); - var widthContained = inner.offsetWidth; - outer.style.overflow = 'scroll'; - var widthScroll = inner.offsetWidth; - - if (widthContained === widthScroll) { - widthScroll = outer.clientWidth; - } - - document.body.removeChild(outer); - var width = widthContained - widthScroll; - _scrollBarSize = { - width: width, - height: width - }; - return _scrollBarSize; -} -var uniqueId = function () { - var id = 0; - return function () { - return ++id; - }; -}(); - -var zeroPosCache = {}; -var zeroElement = null; -function getBounds(body, el) { - var doc; - - if (el === document) { - doc = document; - el = document.documentElement; - } else { - doc = el.ownerDocument; - } - - var docEl = doc.documentElement; - - var box = _getActualBoundingClientRect(el); - - var origin = _getOrigin(body); - - box.top -= origin.top; - box.left -= origin.left; - - if (isUndefined(box.width)) { - box.width = document.body.scrollWidth - box.left - box.right; - } - - if (isUndefined(box.height)) { - box.height = document.body.scrollHeight - box.top - box.bottom; - } - - box.top = box.top - docEl.clientTop; - box.left = box.left - docEl.clientLeft; - box.right = doc.body.clientWidth - box.width - box.left; - box.bottom = doc.body.clientHeight - box.height - box.top; - return box; -} -/** - * Gets bounds for when target modifiier is 'scroll-handle' - * @param target - * @return {{left: number, width: number, height: number}} - */ - -function getScrollHandleBounds(body, target) { - var bounds; // We have to do the check for the scrollTop and if target === document.body here and set to variables - // because we may reset target below. - - var targetScrollTop = target.scrollTop; - var targetIsBody = target === document.body; - - if (targetIsBody) { - target = document.documentElement; - bounds = { - left: pageXOffset, - top: pageYOffset, - height: innerHeight, - width: innerWidth - }; - } else { - bounds = getBounds(body, target); - } - - var style = getComputedStyle(target); - var hasBottomScroll = target.scrollWidth > target.clientWidth || [style.overflow, style.overflowX].indexOf('scroll') >= 0 || !targetIsBody; - var scrollBottom = 0; - - if (hasBottomScroll) { - scrollBottom = 15; - } - - var height = bounds.height - parseFloat(style.borderTopWidth) - parseFloat(style.borderBottomWidth) - scrollBottom; - var out = { - width: 15, - height: height * 0.975 * (height / target.scrollHeight), - left: bounds.left + bounds.width - parseFloat(style.borderLeftWidth) - 15 - }; - var fitAdj = 0; - - if (height < 408 && targetIsBody) { - fitAdj = -0.00011 * Math.pow(height, 2) - 0.00727 * height + 22.58; - } - - if (!targetIsBody) { - out.height = Math.max(out.height, 24); - } - - var scrollPercentage = targetScrollTop / (target.scrollHeight - height); - out.top = scrollPercentage * (height - out.height - fitAdj) + bounds.top + parseFloat(style.borderTopWidth); - - if (targetIsBody) { - out.height = Math.max(out.height, 24); - } - - return out; -} -/** - * Gets bounds for when target modifiier is 'visible - * @param target - * @return {{top: *, left: *, width: *, height: *}} - */ - -function getVisibleBounds(body, target) { - if (target === document.body) { - return { - top: pageYOffset, - left: pageXOffset, - height: innerHeight, - width: innerWidth - }; - } else { - var bounds = getBounds(body, target); - var out = { - height: bounds.height, - width: bounds.width, - top: bounds.top, - left: bounds.left - }; - out.height = Math.min(out.height, bounds.height - (pageYOffset - bounds.top)); - out.height = Math.min(out.height, bounds.height - (bounds.top + bounds.height - (pageYOffset + innerHeight))); - out.height = Math.min(innerHeight, out.height); - out.height -= 2; - out.width = Math.min(out.width, bounds.width - (pageXOffset - bounds.left)); - out.width = Math.min(out.width, bounds.width - (bounds.left + bounds.width - (pageXOffset + innerWidth))); - out.width = Math.min(innerWidth, out.width); - out.width -= 2; - - if (out.top < pageYOffset) { - out.top = pageYOffset; - } - - if (out.left < pageXOffset) { - out.left = pageXOffset; - } - - return out; - } -} -function removeUtilElements(body) { - if (zeroElement) { - body.removeChild(zeroElement); - } - - zeroElement = null; -} -/** - * Same as native getBoundingClientRect, except it takes into account parent offsets - * if the element lies within a nested document ( or