@atlassian/tipsy
Advanced tools
Comparing version 1.2.0 to 1.3.0
{ | ||
"name": "@atlassian/tipsy", | ||
"version": "1.2.0", | ||
"version": "1.3.0", | ||
"description": "Atlassian fork of tipsy", | ||
"browser": "src/javascripts/jquery.tipsy.js", | ||
"main": "src/javascripts/jquery.tipsy.js", | ||
@@ -10,2 +11,3 @@ "directories": { | ||
"scripts": { | ||
"fix": "prettier --write src/**/*", | ||
"test": "echo \"Error: no test specified\" && exit 1" | ||
@@ -25,3 +27,9 @@ }, | ||
}, | ||
"homepage": "https://github.com/atlassian/tipsy" | ||
"homepage": "https://github.com/atlassian/tipsy", | ||
"devDependencies": { | ||
"eslint": "^5.2.0", | ||
"eslint-config-prettier": "^2.9.0", | ||
"eslint-plugin-prettier": "^2.6.2", | ||
"prettier": "^1.13.7" | ||
} | ||
} |
// tipsy, facebook style tooltips for jquery | ||
// version 1.0.0a | ||
// version 1.3.0 | ||
// (c) 2008-2010 jason frame [jason@onehackoranother.com] | ||
@@ -10,14 +10,14 @@ // released under the MIT license | ||
(function($) { | ||
var liveBindingWarning = "To be compatible with jQuery 1.9 and higher," | ||
var liveBindingWarning = "To be compatible with jQuery 1.9 and higher,"; | ||
" You must pass a selector to tipsy's live argument." + | ||
" For instance, `$(document).tipsy({live: 'a.live'});`"; | ||
" For instance, `$(document).tipsy({live: 'a.live'});`"; | ||
function maybeCall(thing, ctx) { | ||
return (typeof thing == 'function') ? (thing.call(ctx)) : thing; | ||
}; | ||
return typeof thing == "function" ? thing.call(ctx) : thing; | ||
} | ||
function isElementInDOM(ele) { | ||
var el = ele && ele.jquery ? ele.get(0) : ele; | ||
return $.contains(document.documentElement, el); | ||
}; | ||
var el = ele && ele.jquery ? ele.get(0) : ele; | ||
return $.contains(document.documentElement, el); | ||
} | ||
@@ -28,4 +28,4 @@ var tipsyIDcounter = 0; | ||
return "tipsyuid" + tipsyID; | ||
}; | ||
} | ||
function Tipsy(element, options) { | ||
@@ -36,4 +36,4 @@ this.$element = $(element); | ||
this.fixTitle(); | ||
}; | ||
} | ||
Tipsy.prototype = { | ||
@@ -49,7 +49,15 @@ show: function() { | ||
var $tip = this.tip(); | ||
$tip.find('.tipsy-inner')[this.options.html ? 'html' : 'text'](title); | ||
$tip[0].className = 'tipsy'; // reset classname in case of dynamic gravity | ||
$tip.remove().css({top: 0, left: 0, visibility: 'hidden', display: 'block'}).appendTo(document.body); | ||
$tip.find(".tipsy-inner")[this.options.html ? "html" : "text"]( | ||
title | ||
); | ||
$tip[0].className = "tipsy"; // reset classname in case of dynamic gravity | ||
$tip.remove() | ||
.css({ | ||
top: 0, | ||
left: 0, | ||
visibility: "hidden", | ||
display: "block" | ||
}) | ||
.appendTo(document.body); | ||
@@ -61,10 +69,13 @@ var that = this; | ||
function tipOut() { | ||
if (that.hoverState == 'in') return; // If field is still focused. | ||
if (that.hoverState == "in") return; // If field is still focused. | ||
that.hoverTooltip = false; | ||
if (that.options.trigger != 'manual') { | ||
var eventOut = that.options.trigger == 'hover' ? 'mouseleave.tipsy' : 'blur.tipsy'; | ||
if (that.options.trigger != "manual") { | ||
var eventOut = | ||
that.options.trigger == "hover" | ||
? "mouseleave.tipsy" | ||
: "blur.tipsy"; | ||
that.$element.trigger(eventOut); | ||
} | ||
} | ||
if (this.options.hoverable) { | ||
@@ -75,3 +86,5 @@ $tip.hover(tipOver, tipOut); | ||
if (this.options.className) { | ||
$tip.addClass(maybeCall(this.options.className, this.$element[0])); | ||
$tip.addClass( | ||
maybeCall(this.options.className, this.$element[0]) | ||
); | ||
} | ||
@@ -83,3 +96,3 @@ | ||
}); | ||
var tipCss = {}; | ||
@@ -91,6 +104,7 @@ var actualWidth = $tip[0].offsetWidth, | ||
if (gravity.length === 2) { | ||
if (gravity.charAt(1) === 'w') { | ||
if (gravity.charAt(1) === "w") { | ||
tipCss.left = pos.left + pos.width / 2 - 15; | ||
} else { | ||
tipCss.left = pos.left + pos.width / 2 - actualWidth + 15; | ||
tipCss.left = | ||
pos.left + pos.width / 2 - actualWidth + 15; | ||
} | ||
@@ -100,13 +114,15 @@ } | ||
switch (gravity.charAt(0)) { | ||
case 'n': | ||
case "n": | ||
// left could already be set if gravity is 'nw' or 'ne' | ||
if (typeof tipCss.left === 'undefined') { | ||
tipCss.left = pos.left + pos.width / 2 - actualWidth / 2; | ||
if (typeof tipCss.left === "undefined") { | ||
tipCss.left = | ||
pos.left + pos.width / 2 - actualWidth / 2; | ||
} | ||
tipCss.top = pos.top + pos.height + this.options.offset; | ||
break; | ||
case 's': | ||
case "s": | ||
// left could already be set if gravity is 'sw' or 'se' | ||
if (typeof tipCss.left === 'undefined') { | ||
tipCss.left = pos.left + pos.width / 2 - actualWidth / 2; | ||
if (typeof tipCss.left === "undefined") { | ||
tipCss.left = | ||
pos.left + pos.width / 2 - actualWidth / 2; | ||
@@ -119,21 +135,36 @@ // We need to apply the left positioning and then recalculate the tooltip height | ||
} | ||
tipCss.top = pos.top - actualHeight - this.options.offset; | ||
tipCss.top = | ||
pos.top - actualHeight - this.options.offset; | ||
break; | ||
case 'e': | ||
tipCss.left = pos.left - actualWidth - this.options.offset; | ||
tipCss.top = pos.top + pos.height / 2 - actualHeight / 2; | ||
case "e": | ||
tipCss.left = | ||
pos.left - actualWidth - this.options.offset; | ||
tipCss.top = | ||
pos.top + pos.height / 2 - actualHeight / 2; | ||
break; | ||
case 'w': | ||
tipCss.left = pos.left + pos.width + this.options.offset; | ||
tipCss.top = pos.top + pos.height / 2 - actualHeight / 2; | ||
case "w": | ||
tipCss.left = | ||
pos.left + pos.width + this.options.offset; | ||
tipCss.top = | ||
pos.top + pos.height / 2 - actualHeight / 2; | ||
break; | ||
} | ||
$tip.css(tipCss).addClass('tipsy-' + gravity); | ||
$tip.find('.tipsy-arrow')[0].className = 'tipsy-arrow tipsy-arrow-' + gravity.charAt(0); | ||
$tip.css(tipCss).addClass("tipsy-" + gravity); | ||
$tip.find(".tipsy-arrow")[0].className = | ||
"tipsy-arrow tipsy-arrow-" + gravity.charAt(0); | ||
if (this.options.fade) { | ||
$tip.stop().css({opacity: 0, display: 'block', visibility: 'visible'}).animate({opacity: this.options.opacity}); | ||
$tip.stop() | ||
.css({ | ||
opacity: 0, | ||
display: "block", | ||
visibility: "visible" | ||
}) | ||
.animate({ opacity: this.options.opacity }); | ||
} else { | ||
$tip.css({visibility: 'visible', opacity: this.options.opacity}); | ||
$tip.css({ | ||
visibility: "visible", | ||
opacity: this.options.opacity | ||
}); | ||
} | ||
@@ -149,4 +180,4 @@ | ||
destroy: function(){ | ||
this.$element.removeData('tipsy'); | ||
destroy: function() { | ||
this.$element.removeData("tipsy"); | ||
@@ -158,6 +189,6 @@ this.unbindHandlers(); | ||
unbindHandlers: function() { | ||
if(this.options.live){ | ||
$(document).off('.tipsy', this.options.live); | ||
if (this.options.live) { | ||
$(document).off(".tipsy", this.options.live); | ||
} else { | ||
this.$element.off('.tipsy'); | ||
this.$element.off(".tipsy"); | ||
} | ||
@@ -168,3 +199,7 @@ }, | ||
if (this.options.fade) { | ||
this.tip().stop().fadeOut(function() { $(this).remove(); }); | ||
this.tip() | ||
.stop() | ||
.fadeOut(function() { | ||
$(this).remove(); | ||
}); | ||
} else { | ||
@@ -177,31 +212,45 @@ this.tip().remove(); | ||
}, | ||
fixTitle: function() { | ||
var $e = this.$element; | ||
if ($e.attr('title') || typeof($e.attr('original-title')) != 'string') { | ||
$e.attr('original-title', $e.attr('title') || '').removeAttr('title'); | ||
if ( | ||
$e.attr("title") || | ||
typeof $e.attr("original-title") != "string" | ||
) { | ||
$e.attr("original-title", $e.attr("title") || "").removeAttr( | ||
"title" | ||
); | ||
} | ||
}, | ||
getTitle: function() { | ||
var title, $e = this.$element, o = this.options; | ||
var title, | ||
$e = this.$element, | ||
o = this.options; | ||
this.fixTitle(); | ||
var title, o = this.options; | ||
if (typeof o.title == 'string') { | ||
title = $e.attr(o.title == 'title' ? 'original-title' : o.title); | ||
} else if (typeof o.title == 'function') { | ||
var title, | ||
o = this.options; | ||
if (typeof o.title == "string") { | ||
title = $e.attr( | ||
o.title == "title" ? "original-title" : o.title | ||
); | ||
} else if (typeof o.title == "function") { | ||
title = o.title.call($e[0]); | ||
} | ||
title = ('' + title).replace(/(^\s*|\s*$)/, ""); | ||
title = ("" + title).replace(/(^\s*|\s*$)/, ""); | ||
return title || o.fallback; | ||
}, | ||
tip: function() { | ||
if (!this.$tip) { | ||
this.$tip = $('<div class="tipsy"></div>').html('<div class="tipsy-arrow"></div><div class="tipsy-inner"></div>').attr("role","tooltip"); | ||
this.$tip.data('tipsy-pointee', this.$element[0]); | ||
this.$tip = $('<div class="tipsy"></div>') | ||
.html( | ||
'<div class="tipsy-arrow"></div><div class="tipsy-inner"></div>' | ||
) | ||
.attr("role", "tooltip"); | ||
this.$tip.data("tipsy-pointee", this.$element[0]); | ||
} | ||
return this.$tip; | ||
}, | ||
validate: function() { | ||
@@ -214,18 +263,23 @@ if (!this.$element[0].parentNode) { | ||
}, | ||
enable: function() { this.enabled = true; }, | ||
disable: function() { this.enabled = false; }, | ||
toggleEnabled: function() { this.enabled = !this.enabled; } | ||
enable: function() { | ||
this.enabled = true; | ||
}, | ||
disable: function() { | ||
this.enabled = false; | ||
}, | ||
toggleEnabled: function() { | ||
this.enabled = !this.enabled; | ||
} | ||
}; | ||
$.fn.tipsy = function(options) { | ||
if (options === true) { | ||
return this.data('tipsy'); | ||
} else if (typeof options == 'string') { | ||
var tipsy = this.data('tipsy'); | ||
return this.data("tipsy"); | ||
} else if (typeof options == "string") { | ||
var tipsy = this.data("tipsy"); | ||
if (tipsy) tipsy[options](); | ||
return this; | ||
} | ||
options = $.extend({}, $.fn.tipsy.defaults, options); | ||
@@ -249,13 +303,13 @@ if (options.hoverable) { | ||
function get(ele) { | ||
var tipsy = $.data(ele, 'tipsy'); | ||
var tipsy = $.data(ele, "tipsy"); | ||
if (!tipsy) { | ||
tipsy = new Tipsy(ele, $.fn.tipsy.elementOptions(ele, options)); | ||
$.data(ele, 'tipsy', tipsy); | ||
$.data(ele, "tipsy", tipsy); | ||
} | ||
return tipsy; | ||
} | ||
function enter() { | ||
var tipsy = get(this); | ||
tipsy.hoverState = 'in'; | ||
tipsy.hoverState = "in"; | ||
if (options.delayIn == 0) { | ||
@@ -266,3 +320,6 @@ tipsy.show(); | ||
setTimeout(function() { | ||
if (tipsy.hoverState == 'in' && isElementInDOM(tipsy.$element)) { | ||
if ( | ||
tipsy.hoverState == "in" && | ||
isElementInDOM(tipsy.$element) | ||
) { | ||
tipsy.show(); | ||
@@ -272,7 +329,7 @@ } | ||
} | ||
}; | ||
} | ||
function leave() { | ||
var tipsy = get(this); | ||
tipsy.hoverState = 'out'; | ||
tipsy.hoverState = "out"; | ||
if (options.delayOut == 0) { | ||
@@ -282,3 +339,3 @@ tipsy.hide(); | ||
setTimeout(function() { | ||
if (tipsy.hoverState == 'out' && !tipsy.hoverTooltip) { | ||
if (tipsy.hoverState == "out" && !tipsy.hoverTooltip) { | ||
tipsy.hide(); | ||
@@ -288,24 +345,30 @@ } | ||
} | ||
}; | ||
if (!options.live) this.each(function() { get(this); }); | ||
if (options.trigger != 'manual') { | ||
var eventIn = options.trigger == 'hover' ? 'mouseenter.tipsy focus.tipsy' : 'focus.tipsy', | ||
eventOut = options.trigger == 'hover' ? 'mouseleave.tipsy blur.tipsy' : 'blur.tipsy'; | ||
} | ||
if (!options.live) | ||
this.each(function() { | ||
get(this); | ||
}); | ||
if (options.trigger != "manual") { | ||
var eventIn = | ||
options.trigger == "hover" | ||
? "mouseenter.tipsy focus.tipsy" | ||
: "focus.tipsy", | ||
eventOut = | ||
options.trigger == "hover" | ||
? "mouseleave.tipsy blur.tipsy" | ||
: "blur.tipsy"; | ||
if (options.live) { | ||
$(document) | ||
.on(eventIn, options.live, enter) | ||
.on(eventOut, options.live, leave) | ||
.on(eventOut, options.live, leave); | ||
} else { | ||
this | ||
.on(eventIn, enter) | ||
.on(eventOut, leave) | ||
this.on(eventIn, enter).on(eventOut, leave); | ||
} | ||
} | ||
return this; | ||
}; | ||
$.fn.tipsy.defaults = { | ||
@@ -317,4 +380,4 @@ aria: false, | ||
fade: false, | ||
fallback: '', | ||
gravity: 'n', | ||
fallback: "", | ||
gravity: "n", | ||
html: false, | ||
@@ -325,15 +388,15 @@ live: false, | ||
opacity: 0.8, | ||
title: 'title', | ||
trigger: 'hover' | ||
title: "title", | ||
trigger: "hover" | ||
}; | ||
$.fn.tipsy.revalidate = function() { | ||
$('.tipsy').each(function() { | ||
var pointee = $.data(this, 'tipsy-pointee'); | ||
if (!pointee || !isElementInDOM(pointee)) { | ||
$(this).remove(); | ||
} | ||
}); | ||
$(".tipsy").each(function() { | ||
var pointee = $.data(this, "tipsy-pointee"); | ||
if (!pointee || !isElementInDOM(pointee)) { | ||
$(this).remove(); | ||
} | ||
}); | ||
}; | ||
// Overwrite this method to provide options on a per-element basis. | ||
@@ -346,11 +409,17 @@ // For example, you could store the gravity in a 'tipsy-gravity' attribute: | ||
}; | ||
$.fn.tipsy.autoNS = function() { | ||
return $(this).offset().top > ($(document).scrollTop() + $(window).height() / 2) ? 's' : 'n'; | ||
return $(this).offset().top > | ||
$(document).scrollTop() + $(window).height() / 2 | ||
? "s" | ||
: "n"; | ||
}; | ||
$.fn.tipsy.autoWE = function() { | ||
return $(this).offset().left > ($(document).scrollLeft() + $(window).width() / 2) ? 'e' : 'w'; | ||
return $(this).offset().left > | ||
$(document).scrollLeft() + $(window).width() / 2 | ||
? "e" | ||
: "w"; | ||
}; | ||
/** | ||
@@ -366,3 +435,3 @@ * yields a closure of the supplied parameters, producing a function that takes | ||
* gravity. It will try to vary from this minimally, for example, | ||
* if 'sw' is preferred and an element is near the right viewable | ||
* if 'sw' is preferred and an element is near the right viewable | ||
* region edge, but not the top edge, it will set the gravity for | ||
@@ -372,18 +441,32 @@ * that element's tooltip to be 'se', preserving the southern | ||
*/ | ||
$.fn.tipsy.autoBounds = function(margin, prefer) { | ||
return function() { | ||
var dir = {ns: prefer[0], ew: (prefer.length > 1 ? prefer[1] : false)}, | ||
boundTop = $(document).scrollTop() + margin, | ||
boundLeft = $(document).scrollLeft() + margin, | ||
$this = $(this); | ||
$.fn.tipsy.autoBounds = function(margin, prefer) { | ||
return function() { | ||
var dir = { | ||
ns: prefer[0], | ||
ew: prefer.length > 1 ? prefer[1] : false | ||
}, | ||
boundTop = $(document).scrollTop() + margin, | ||
boundLeft = $(document).scrollLeft() + margin, | ||
$this = $(this); | ||
if ($this.offset().top < boundTop) dir.ns = 'n'; | ||
if ($this.offset().left < boundLeft) dir.ew = 'w'; | ||
if ($(window).width() + $(document).scrollLeft() - $this.offset().left < margin) dir.ew = 'e'; | ||
if ($(window).height() + $(document).scrollTop() - $this.offset().top < margin) dir.ns = 's'; | ||
if ($this.offset().top < boundTop) dir.ns = "n"; | ||
if ($this.offset().left < boundLeft) dir.ew = "w"; | ||
if ( | ||
$(window).width() + | ||
$(document).scrollLeft() - | ||
$this.offset().left < | ||
margin | ||
) | ||
dir.ew = "e"; | ||
if ( | ||
$(window).height() + | ||
$(document).scrollTop() - | ||
$this.offset().top < | ||
margin | ||
) | ||
dir.ns = "s"; | ||
return dir.ns + (dir.ew ? dir.ew : ''); | ||
} | ||
}; | ||
return dir.ns + (dir.ew ? dir.ew : ""); | ||
}; | ||
}; | ||
})(jQuery); |
Sorry, the diff of this file is not supported yet
License Policy Violation
LicenseThis package is not allowed per your license policy. Review the package's license to ensure compliance.
Found 1 instance in 1 package
License Policy Violation
LicenseThis package is not allowed per your license policy. Review the package's license to ensure compliance.
Found 1 instance in 1 package
65450
13
521
4