From 6c5346e3008f6f1fa69523e0a373fbc3cacea519 Mon Sep 17 00:00:00 2001
From: Sebastiaan Nijland
Date: Mon, 8 May 2017 02:41:14 +0200
Subject: [PATCH 01/54] Removed several unused scss variables (#22539)
---
scss/_variables.scss | 6 ------
1 file changed, 6 deletions(-)
diff --git a/scss/_variables.scss b/scss/_variables.scss
index 6b00d9b19..fccee460b 100644
--- a/scss/_variables.scss
+++ b/scss/_variables.scss
@@ -329,7 +329,6 @@ $table-head-color: $gray !default;
$table-inverse-bg: $gray-dark !default;
$table-inverse-bg-accent: rgba($white, .05) !default;
$table-inverse-bg-hover: rgba($white, .075) !default;
-$table-inverse-bg-active: $table-inverse-bg-hover !default;
$table-inverse-border-color: lighten($gray-dark, 7.5%) !default;
$table-inverse-color: $body-bg !default;
@@ -565,11 +564,8 @@ $zindex-tooltip: 1070 !default;
// Navs
-$nav-item-margin: .2rem !default;
-$nav-item-inline-spacer: 1rem !default;
$nav-link-padding-y: .5rem !default;
$nav-link-padding-x: 1rem !default;
-$nav-link-hover-bg: $gray-lighter !default;
$nav-disabled-link-color: $gray-light !default;
$nav-tabs-border-color: #ddd !default;
@@ -579,8 +575,6 @@ $nav-tabs-link-hover-border-color: $gray-lighter !default;
$nav-tabs-active-link-color: $gray !default;
$nav-tabs-active-link-bg: $body-bg !default;
$nav-tabs-active-link-border-color: #ddd !default;
-$nav-tabs-justified-link-border-color: #ddd !default;
-$nav-tabs-justified-active-link-border-color: $body-bg !default;
$nav-pills-border-radius: $border-radius !default;
$nav-pills-active-link-color: $component-active-color !default;
From aa68ca3580369de035742768c64498686a6600ff Mon Sep 17 00:00:00 2001
From: Peter Blazejewicz
Date: Tue, 9 May 2017 10:51:44 +0200
Subject: [PATCH 02/54] tooltips/popover must be hidden before their
corresponding element is removed from the DOM
---
docs/components/popovers.md | 1 +
docs/components/tooltips.md | 1 +
2 files changed, 2 insertions(+)
diff --git a/docs/components/popovers.md b/docs/components/popovers.md
index 307b4cb6d..82a45cd45 100644
--- a/docs/components/popovers.md
+++ b/docs/components/popovers.md
@@ -25,6 +25,7 @@ Things to know when using the popover plugin:
- Triggering popovers on hidden elements will not work.
- Popovers for `.disabled` or `disabled` elements must be triggered on a wrapper element.
- When triggered from hyperlinks that span multiple lines, popovers will be centered. Use `white-space: nowrap;` on your ``s to avoid this behavior.
+- Popovers must be hidden before their corresponding elements have been removed from the DOM.
Got all that? Great, let's see how they work with some examples.
diff --git a/docs/components/tooltips.md b/docs/components/tooltips.md
index 55de9a886..393d94c05 100644
--- a/docs/components/tooltips.md
+++ b/docs/components/tooltips.md
@@ -23,6 +23,7 @@ Things to know when using the tooltip plugin:
- Triggering tooltips on hidden elements will not work.
- Tooltips for `.disabled` or `disabled` elements must be triggered on a wrapper element.
- When triggered from hyperlinks that span multiple lines, tooltips will be centered. Use `white-space: nowrap;` on your ` `s to avoid this behavior.
+- Tooltips must be hidden before their corresponding elements have been removed from the DOM.
Got all that? Great, let's see how they work with some examples.
From 6cf0fe878067ba46872212da92e5288fb3331312 Mon Sep 17 00:00:00 2001
From: Johann-S
Date: Thu, 6 Apr 2017 23:16:07 +0200
Subject: [PATCH 03/54] Use Popper for tooltip and popover
---
docs/assets/js/vendor/popper.min.js | 3 ++
docs/assets/js/vendor/tether.min.js | 1 -
js/src/popover.js | 2 -
js/src/tooltip.js | 73 +++++++++--------------------
js/tests/visual/popover.html | 2 +-
js/tests/visual/tooltip.html | 2 +-
6 files changed, 27 insertions(+), 56 deletions(-)
create mode 100644 docs/assets/js/vendor/popper.min.js
delete mode 100644 docs/assets/js/vendor/tether.min.js
diff --git a/docs/assets/js/vendor/popper.min.js b/docs/assets/js/vendor/popper.min.js
new file mode 100644
index 000000000..22ac698ab
--- /dev/null
+++ b/docs/assets/js/vendor/popper.min.js
@@ -0,0 +1,3 @@
+(function(e,t){'object'==typeof exports&&'undefined'!=typeof module?module.exports=t():'function'==typeof define&&define.amd?define(t):e.Popper=t()})(this,function(){'use strict';function e(he){const ce=he.offsetParent,ue=ce&&ce.nodeName;return ue&&'BODY'!==ue&&'HTML'!==ue?ce:window.document.documentElement}function t(he,ce){if(1!==he.nodeType)return[];const ue=window.getComputedStyle(he,null);return ce?ue[ce]:ue}function o(he){return'HTML'===he.nodeName?he:he.parentNode||he.host}function r(he){if(!he||-1!==['HTML','BODY','#document'].indexOf(he.nodeName))return window.document.body;const{overflow:ce,overflowX:ue,overflowY:ge}=t(he);return /(auto|scroll)/.test(ce+ge+ue)?he:r(o(he))}function s(he){const ce=he.nodeName;return'BODY'===ce||'HTML'===ce?!1:'fixed'===t(he,'position')||s(o(he))}function p(he){const ce=e(he),ue=s(ce);return ue?'fixed':'absolute'}function f(he,ce){const ue='x'===ce?'Left':'Top',ge='Left'==ue?'Right':'Bottom';return+he[`border${ue}Width`].split('px')[0]+ +he[`border${ge}Width`].split('px')[0]}function d(he){const ce=-1!==navigator.appVersion.indexOf('MSIE 10');let ue;if(ce)try{ue=he.getBoundingClientRect()}catch(xe){ue={}}else ue=he.getBoundingClientRect();const ge={left:ue.left,top:ue.top,right:ue.right,bottom:ue.bottom,width:ue.right-ue.left,height:ue.bottom-ue.top};if('HTML'===he.nodeName&&ce){const{scrollTop:xe,scrollLeft:ye}=window.document.documentElement;ge.top-=xe,ge.bottom-=xe,ge.left-=ye,ge.right-=ye}let be=ue.width-(he.clientWidth||ue.right-ue.left),we=ue.height-(he.clientHeight||ue.bottom-ue.top);if(be||we){const xe=t(he);be-=f(xe,'x'),we-=f(xe,'y')}return ge.right-=be,ge.width-=be,ge.bottom-=we,ge.height-=we,ge}function l(he,ce='top'){const ue='top'===ce?'scrollTop':'scrollLeft',ge=he.nodeName;if('BODY'===ge||'HTML'===ge){const be=window.document.documentElement,we=window.document.scrollingElement||be;return we[ue]}return he[ue]}function m(he,ce,ue=!1){const ge=l(ce,'top'),be=l(ce,'left'),we=ue?-1:1;return he.top+=ge*we,he.bottom+=ge*we,he.left+=be*we,he.right+=be*we,he}function h(he,ce,ue=!1,ge=!1){const be=r(ce),we=d(he),xe=d(ce);let ye={top:we.top-xe.top,left:we.left-xe.left,bottom:we.top-xe.top+we.height,right:we.left-xe.left+we.width,width:we.width,height:we.height};ue&&!ge?ye=m(ye,be,!0):e(he).contains(be)&&'BODY'!==be.nodeName&&(ye=m(ye,ce));const ve=t(ce),Oe=+ve.borderTopWidth.split('px')[0],Ee=+ve.borderLeftWidth.split('px')[0];return ye.top-=Oe,ye.bottom-=Oe,ye.left-=Ee,ye.right-=Ee,ye}function c(){const he=window.document.body,ce=window.document.documentElement;return{height:Math.max(he.scrollHeight,he.offsetHeight,ce.clientHeight,ce.scrollHeight,ce.offsetHeight),width:Math.max(he.scrollWidth,he.offsetWidth,ce.clientWidth,ce.scrollWidth,ce.offsetWidth)}}function u(he){let ce;if('HTML'===he.nodeName){const{width:ue,height:ge}=c();ce={width:ue,height:ge,left:0,top:0}}else ce={width:he.offsetWidth,height:he.offsetHeight,left:he.offsetLeft,top:he.offsetTop};return ce.right=ce.left+ce.width,ce.bottom=ce.top+ce.height,ce}function g(he){const ce=u(he);if('HTML'!==he.nodeName){const ue=e(he),ge=g(ue),be={width:ce.offsetWidth,height:ce.offsetHeight,left:ce.left+ge.left,top:ce.top+ge.top,right:ce.right-ge.right,bottom:ce.bottom-ge.bottom};return be}return ce}function w(he,ce='top'){const ue=r(he),ge=l(ue,ce);return-1===['BODY','HTML'].indexOf(ue.nodeName)?ge+w(o(ue),ce):ge}function v(he,ce,ue){let ge={top:0,left:0};const be=e(he);if('viewport'===ue){const{left:we,top:xe}=g(be),{clientWidth:ye,clientHeight:ve}=window.document.documentElement;if('fixed'===p(he))ge.right=ye,ge.bottom=ve;else{const Oe=w(he,'left'),Ee=w(he,'top');ge={top:0-xe,right:ye-we+Oe,bottom:ve-xe+Ee,left:0-we}}}else{let we;if(we='scrollParent'===ue?r(o(he)):'window'===ue?window.document.body:ue,'BODY'===we.nodeName){const{height:xe,width:ye}=c();ge.right=ye,ge.bottom=xe}else ge=h(we,be,s(he))}return ge.left+=ce,ge.top+=ce,ge.right-=ce,ge.bottom-=ce,ge}function O(he,ce,ue){if(-1===he.indexOf('auto'))return he;const ge=v(ue,0,'scrollParent'),be={top:ce.top-ge.top,right:ge.right-ce.right,bottom:ge.bottom-ce.bottom,left:ce.left-ge.left},we=Object.keys(be).sort((ye,ve)=>be[ve]-be[ye])[0],xe=he.split('-')[1];return we+(xe?`-${xe}`:'')}function N(he,ce){return Array.prototype.find?he.find(ce):he.filter(ce)[0]}function L(he,ce,ue){if(Array.prototype.findIndex)return he.findIndex((be)=>be[ce]===ue);const ge=N(he,(be)=>be[ce]===ue);return he.indexOf(ge)}function T(he){return fe({},he,{right:he.left+he.width,bottom:he.top+he.height})}function P(he){const ce=window.getComputedStyle(he),ue=parseFloat(ce.marginTop)+parseFloat(ce.marginBottom),ge=parseFloat(ce.marginLeft)+parseFloat(ce.marginRight),be={width:he.offsetWidth+ge,height:he.offsetHeight+ue};return be}function B(he){const ce={left:'right',right:'left',bottom:'top',top:'bottom'};return he.replace(/left|right|bottom|top/g,(ue)=>ce[ue])}function H(he,ce,ue,ge){ge=ge.split('-')[0];const be=P(ce),we={position:he,width:be.width,height:be.height},xe=-1!==['right','left'].indexOf(ge),ye=xe?'top':'left',ve=xe?'left':'top',Oe=xe?'height':'width',Ee=xe?'width':'height';return we[ye]=ue[ye]+ue[Oe]/2-be[Oe]/2,we[ve]=ge===ve?ue[ve]-be[Ee]:ue[B(ve)],we}function W(he,ce,ue){const ge='fixed'===he.position,be=he.isParentTransformed,we=e(ge&&be?ue:ce);return h(ue,we,ge,be)}function D(he){const ce=[!1,'ms','webkit','moz','o'],ue=he.charAt(0).toUpperCase()+he.slice(1);for(let ge=0;gege&&ue===ce)}function R(he,ce,ue){const ge=N(he,({name:be})=>be===ce);return!!ge&&he.some((be)=>{return be.name===ue&&be.enabled&&be.order{ue.removeEventListener('scroll',ce.updateBound)}),ce.updateBound=null,ce.scrollParents=[],ce.scrollElement=null,ce.eventsEnabled=!1,ce}function I(he,ce,ue){const ge=void 0===ue?he:he.slice(0,L(he,'name',ue));return ge.forEach((be)=>{be.enabled&&C(be.function)&&(ce=be.function(ce,be))}),ce}function U(he,ce){Object.keys(ce).forEach(function(ue){const ge=ce[ue];!1===ge?he.removeAttribute(ue):he.setAttribute(ue,ce[ue])})}function q(he,ce){Object.keys(ce).forEach((ue)=>{let ge='';-1!==['width','height','top','right','bottom','left'].indexOf(ue)&&A(ce[ue])&&(ge='px'),he.style[ue]=ce[ue]+ge})}function z(he,ce,ue,ge){const be='BODY'===he.nodeName,we=be?window:he;we.addEventListener(ce,ue,{passive:!0}),be||z(r(we.parentNode),ce,ue,ge),ge.push(we)}function F(he,ce,ue,ge){ue.updateBound=ge,window.addEventListener('resize',ue.updateBound,{passive:!0});const be=r(he);return z(be,'scroll',ue.updateBound,ue.scrollParents),ue.scrollElement=be,ue.eventsEnabled=!0,ue}function X(he){return'end'===he?'start':'start'===he?'end':he}const te=['native code','[object MutationObserverConstructor]'];var oe=(he)=>te.some((ce)=>-1<(he||'').toString().indexOf(ce));const ie='undefined'!=typeof window,re=['Edge','Trident','Firefox'];let ne=0;for(let he=0;he{he(),ce=!1});return be.observe(ge,{attributes:!0}),()=>{ce||(ce=!0,ge.setAttribute('x-index',ue),++ue)}}:function(he){let ce=!1;return()=>{ce||(ce=!0,setTimeout(()=>{ce=!1,he()},ne))}},fe=Object.assign||function(he){for(var ue,ce=1;cerequestAnimationFrame(this.update),this.update=pe(this.update.bind(this)),this.options=fe({},me.Defaults,ue),this.state={isDestroyed:!1,isCreated:!1,scrollParents:[]},this.reference=he.jquery?he[0]:he,this.popper=ce.jquery?ce[0]:ce,this.modifiers=Object.keys(me.Defaults.modifiers).map((be)=>fe({name:be},me.Defaults.modifiers[be])),this.modifiers=this.modifiers.map((be)=>{const we=ue.modifiers&&ue.modifiers[be.name]||{};return fe({},be,we)}),ue.modifiers&&(this.options.modifiers=fe({},me.Defaults.modifiers,ue.modifiers),Object.keys(ue.modifiers).forEach((be)=>{if(void 0===me.Defaults.modifiers[be]){const we=ue.modifiers[be];we.name=be,this.modifiers.push(we)}})),this.state.position=p(this.reference),this.modifiers=this.modifiers.sort((be,we)=>be.order-we.order),this.modifiers.forEach((be)=>{be.enabled&&C(be.onLoad)&&be.onLoad(this.reference,this.popper,this.options,be,this.state)}),this.state.isParentTransformed=k(this.popper.parentNode),this.update();const ge=this.options.eventsEnabled;ge&&this.enableEventListeners(),this.state.eventsEnabled=ge}update(){if(!this.state.isDestroyed){let he={instance:this,styles:{},attributes:{},flipped:!1,offsets:{}};this.state.position=p(this.reference),q(this.popper,{position:this.state.position}),he.offsets.reference=W(this.state,this.popper,this.reference),he.placement=O(this.options.placement,he.offsets.reference,this.popper),he.originalPlacement=this.options.placement,he.offsets.popper=H(this.state,this.popper,he.offsets.reference,he.placement),he=I(this.modifiers,he),this.state.isCreated?this.options.onUpdate(he):(this.state.isCreated=!0,this.options.onCreate(he))}}destroy(){return this.state.isDestroyed=!0,M(this.modifiers,'applyStyle')&&(this.popper.removeAttribute('x-placement'),this.popper.style.left='',this.popper.style.position='',this.popper.style.top='',this.popper.style[D('transform')]=''),this.disableEventListeners(),this.options.removeOnDestroy&&this.popper.parentNode.removeChild(this.popper),this}enableEventListeners(){this.state.eventsEnabled||(this.state=F(this.reference,this.options,this.state,this.scheduleUpdate))}disableEventListeners(){this.state.eventsEnabled&&(window.cancelAnimationFrame(this.scheduleUpdate),this.state=Y(this.reference,this.state))}}return me.Utils={computeAutoPlacement:O,debounce:pe,findIndex:L,getBordersSize:f,getBoundaries:v,getBoundingClientRect:d,getClientRect:T,getOffsetParent:e,getOffsetRect:u,getOffsetRectRelativeToCustomParent:h,getOuterSizes:P,getParentNode:o,getPopperOffsets:H,getPosition:p,getReferenceOffsets:W,getScroll:l,getScrollParent:r,getStyleComputedProperty:t,getSupportedPropertyName:D,getTotalScroll:w,getWindowSizes:c,includeScroll:m,isFixed:s,isFunction:C,isModifierEnabled:M,isModifierRequired:R,isNative:oe,isNumeric:A,isTransformed:k,removeEventListeners:Y,runModifiers:I,setAttributes:U,setStyles:q,setupEventListeners:F},me.placements=['auto','auto-start','auto-end','top','top-start','top-end','right','right-start','right-end','bottom','bottom-start','bottom-end','left','left-start','left-end'],me.Defaults={placement:'bottom',eventsEnabled:!0,onCreate:()=>{},onUpdate:()=>{},modifiers:{shift:{order:100,enabled:!0,function:function(he){const ce=he.placement,ue=ce.split('-')[0],ge=ce.split('-')[1];if(ge){const be=he.offsets.reference,we=T(he.offsets.popper),xe=-1!==['bottom','top'].indexOf(ue),ye=xe?'left':'top',ve=xe?'width':'height',Oe={start:{[ye]:be[ye]},end:{[ye]:be[ye]+be[ve]-we[ve]}};he.offsets.popper=fe({},we,Oe[ge])}return he}},offset:{order:200,enabled:!0,function:function(he,ce){const ue=he.placement,ge=he.offsets.popper;let be;return A(ce.offset)?be=[ce.offset,0]:(be=ce.offset.split(' '),be=be.map((we,xe)=>{const ye=we.match(/(\d*\.?\d*)(.*)/),ve=+ye[1],Oe=ye[2];let Ee=-1!==ue.indexOf('right')||-1!==ue.indexOf('left');1===xe&&(Ee=!Ee);const Se=Ee?'height':'width';if(0===Oe.indexOf('%')){let Ne;switch(Oe){case'%p':Ne=he.offsets.popper;break;case'%':case'$r':default:Ne=he.offsets.reference;}const Le=T(Ne),Te=Le[Se];return Te/100*ve}if('vh'===Oe||'vw'===Oe){let Ne;return Ne='vh'===Oe?Math.max(document.documentElement.clientHeight,window.innerHeight||0):Math.max(document.documentElement.clientWidth,window.innerWidth||0),Ne/100*ve}return'px'===Oe?+ve:+we})),-1===he.placement.indexOf('left')?-1===he.placement.indexOf('right')?-1===he.placement.indexOf('top')?-1!==he.placement.indexOf('bottom')&&(ge.left+=be[0],ge.top+=be[1]||0):(ge.left+=be[0],ge.top-=be[1]||0):(ge.top+=be[0],ge.left+=be[1]||0):(ge.top+=be[0],ge.left-=be[1]||0),he},offset:0},preventOverflow:{order:300,enabled:!0,function:function(he,ce){const ue=ce.boundariesElement||e(he.instance.popper),ge=v(he.instance.popper,ce.padding,ue);ce.boundaries=ge;const be=ce.priority;let we=T(he.offsets.popper);const xe={primary(ye){let ve=we[ye];return we[ye]ge[ye]&&!ce.escapeWithReference&&(Oe=Math.min(we[ve],ge[ye]-('right'===ye?we.width:we.height))),{[ve]:Oe}}};return be.forEach((ye)=>{const ve=-1===['left','top'].indexOf(ye)?'secondary':'primary';we=fe({},we,xe[ve](ye))}),he.offsets.popper=we,he},priority:['left','right','top','bottom'],padding:5,boundariesElement:'scrollParent'},keepTogether:{order:400,enabled:!0,function:function(he){const ce=T(he.offsets.popper),ue=he.offsets.reference,ge=he.placement.split('-')[0],be=Math.floor,we=-1!==['top','bottom'].indexOf(ge),xe=we?'right':'bottom',ye=we?'left':'top',ve=we?'width':'height';return ce[xe]be(ue[xe])&&(he.offsets.popper[ye]=be(ue[xe])),he}},arrow:{order:500,enabled:!0,function:function(he,ce){if(!R(he.instance.modifiers,'arrow','keepTogether'))return console.warn('WARNING: `keepTogether` modifier is required by arrow modifier in order to work, be sure to include it before `arrow`!'),he;let ue=ce.element;if('string'==typeof ue){if(ue=he.instance.popper.querySelector(ue),!ue)return he;}else if(!he.instance.popper.contains(ue))return console.warn('WARNING: `arrow.element` must be child of its popper element!'),he;const ge=he.placement.split('-')[0],be=T(he.offsets.popper),we=he.offsets.reference,xe=-1!==['left','right'].indexOf(ge),ye=xe?'height':'width',ve=xe?'top':'left',Oe=xe?'left':'top',Ee=xe?'bottom':'right',Se=P(ue)[ye];we[Ee]-Sebe[Ee]&&(he.offsets.popper[ve]+=we[ve]+Se-be[Ee]);const Ne=we[ve]+we[ye]/2-Se/2;let Le=Ne-T(he.offsets.popper)[ve];return Le=Math.max(Math.min(be[ye]-Se,Le),0),he.arrowElement=ue,he.offsets.arrow={},he.offsets.arrow[ve]=Le,he.offsets.arrow[Oe]='',he},element:'[x-arrow]'},flip:{order:600,enabled:!0,function:function(he,ce){if(M(he.instance.modifiers,'inner'))return he;if(he.flipped&&he.placement===he.originalPlacement)return he;const ue=v(he.instance.popper,ce.padding,ce.boundariesElement);let ge=he.placement.split('-')[0],be=B(ge),we=he.placement.split('-')[1]||'',xe=[];return xe='flip'===ce.behavior?[ge,be]:ce.behavior,xe.forEach((ye,ve)=>{if(ge!==ye||xe.length===ve+1)return he;ge=he.placement.split('-')[0],be=B(ge);const Oe=T(he.offsets.popper),Ee=he.offsets.reference,Se=Math.floor,Ne='left'===ge&&Se(Oe.right)>Se(Ee.left)||'right'===ge&&Se(Oe.left)Se(Ee.top)||'bottom'===ge&&Se(Oe.top)Se(ue.right),Pe=Se(Oe.top)Se(ue.bottom),He='left'===ge&&Le||'right'===ge&&Te||'top'===ge&&Pe||'bottom'===ge&&Be,We=-1!==['top','bottom'].indexOf(ge),De=!!ce.flipVariations&&(We&&'start'===we&&Le||We&&'end'===we&&Te||!We&&'start'===we&&Pe||!We&&'end'===we&&Be);(Ne||He||De)&&(he.flipped=!0,(Ne||He)&&(ge=xe[ve+1]),De&&(we=X(we)),he.placement=ge+(we?'-'+we:''),he.offsets.popper=H(he.instance.state.position,he.instance.popper,he.offsets.reference,he.placement),he=I(he.instance.modifiers,he,'flip'))}),he},behavior:'flip',padding:5,boundariesElement:'viewport'},inner:{order:700,enabled:!1,function:function(he){const ce=he.placement,ue=ce.split('-')[0],ge=T(he.offsets.popper),be=T(he.offsets.reference),we=-1!==['left','right'].indexOf(ue),xe=-1===['top','left'].indexOf(ue);return ge[we?'left':'top']=be[ce]-(xe?ge[we?'width':'height']:0),he.placement=B(ce),he.offsets.popper=T(ge),he}},hide:{order:800,enabled:!0,function:function(he){if(!R(he.instance.modifiers,'hide','preventOverflow'))return console.warn('WARNING: preventOverflow modifier is required by hide modifier in order to work, be sure to include it before hide!'),he;const ce=he.offsets.reference,ue=N(he.instance.modifiers,(ge)=>'preventOverflow'===ge.name).boundaries;if(ce.bottomue.right||ce.top>ue.bottom||ce.right=0)&&i.push(n)}return i.push(t.ownerDocument.body),t.ownerDocument!==document&&i.push(t.ownerDocument.defaultView),i}function s(){A&&document.body.removeChild(A),A=null}function a(t){var e=void 0;t===document?(e=document,t=document.documentElement):e=t.ownerDocument;var o=e.documentElement,i=n(t),r=P();return i.top-=r.top,i.left-=r.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 f(t){return t.offsetParent||document.documentElement}function l(){if(M)return M;var t=document.createElement("div");t.style.width="100%",t.style.height="200px";var e=document.createElement("div");h(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 M={width:n,height:n}}function h(){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 d(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=c(t).replace(o," ");g(t,i)}}function p(t,e){if("undefined"!=typeof t.classList)e.split(" ").forEach(function(e){e.trim()&&t.classList.add(e)});else{d(t,e);var o=c(t)+(" "+e);g(t,o)}}function u(t,e){if("undefined"!=typeof t.classList)return t.classList.contains(e);var o=c(t);return new RegExp("(^| )"+e+"( |$)","gi").test(o)}function c(t){return t.className instanceof t.ownerDocument.defaultView.SVGAnimatedString?t.className.baseVal:t.className}function g(t,e){t.setAttribute("class",e)}function m(t,e,o){o.forEach(function(o){e.indexOf(o)===-1&&u(t,o)&&d(t,o)}),e.forEach(function(e){u(t,e)||p(t,e)})}function i(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}function v(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 y(t,e){var o=arguments.length<=2||void 0===arguments[2]?1:arguments[2];return t+o>=e&&e>=t-o}function b(){return"undefined"!=typeof performance&&"undefined"!=typeof performance.now?performance.now():+new Date}function w(){for(var t={top:0,left:0},e=arguments.length,o=Array(e),i=0;i1?o-1:0),n=1;n16?(e=Math.min(e-16,250),void(o=setTimeout(n,250))):void("undefined"!=typeof t&&b()-t<10||(null!=o&&(clearTimeout(o),o=null),t=b(),X(),e=b()-t))};"undefined"!=typeof window&&"undefined"!=typeof window.addEventListener&&["resize","scroll","touchmove"].forEach(function(t){window.addEventListener(t,i)})}();var F={center:"center",left:"right",right:"left"},H={middle:"middle",top:"bottom",bottom:"top"},N={top:0,left:0,middle:"50%",center:"50%",bottom:"100%",right:"100%"},U=function(t,e){var o=t.left,i=t.top;return"auto"===o&&(o=F[e.left]),"auto"===i&&(i=H[e.top]),{left:o,top:i}},V=function(t){var e=t.left,o=t.top;return"undefined"!=typeof N[t.left]&&(e=N[t.left]),"undefined"!=typeof N[t.top]&&(o=N[t.top]),{left:e,top:o}},R=function(t){var e=t.split(" "),o=z(e,2),i=o[0],n=o[1];return{top:i,left:n}},q=R,I=function(t){function e(t){var o=this;i(this,e),j(Object.getPrototypeOf(e.prototype),"constructor",this).call(this),this.position=this.position.bind(this),D.push(this),this.history=[],this.setOptions(t,!1),x.modules.forEach(function(t){"undefined"!=typeof t.initialize&&t.initialize.call(o)}),this.position()}return v(e,t),E(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]||arguments[1],i={offset:"0 0",targetOffset:"0 0",targetAttachment:"auto auto",classPrefix:"tether"};this.options=h(i,t);var n=this.options,s=n.element,a=n.target,f=n.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]))}),p(this.element,this.getClass("element")),this.options.addTargetClasses!==!1&&p(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=r(this.target),this.options.enabled!==!1&&this.enable(o)}},{key:"getTargetBounds",value:function(){if("undefined"==typeof this.targetModifier)return a(this.target);if("visible"===this.targetModifier){if(this.target===document.body)return{top:pageYOffset,left:pageXOffset,height:innerHeight,width:innerWidth};var t=a(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,r=0;n&&(r=15);var s=t.height-parseFloat(i.borderTopWidth)-parseFloat(i.borderBottomWidth)-r,e={width:15,height:.975*s*(s/o.scrollHeight),left:t.left+t.width-parseFloat(i.borderLeftWidth)-15},f=0;s<408&&this.target===document.body&&(f=-11e-5*Math.pow(s,2)-.00727*s+22.58),this.target!==document.body&&(e.height=Math.max(e.height,24));var l=this.target.scrollTop/(o.scrollHeight-s);return e.top=l*(s-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]||arguments[0];this.options.addTargetClasses!==!1&&p(this.target,this.getClass("enabled")),p(this.element,this.getClass("enabled")),this.enabled=!0,this.scrollParents.forEach(function(e){e!==t.target.ownerDocument&&e.addEventListener("scroll",t.position)}),e&&this.position()}},{key:"disable",value:function(){var t=this;d(this.target,this.getClass("enabled")),d(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(),D.forEach(function(e,o){e===t&&D.splice(o,1)}),0===D.length&&s()}},{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)}),k(function(){"undefined"!=typeof o._addAttachClasses&&(m(o.element,o._addAttachClasses,r),o.options.addTargetClasses!==!1&&m(o.target,o._addAttachClasses,r),delete o._addAttachClasses)})}},{key:"position",value:function(){var t=this,e=arguments.length<=0||void 0===arguments[0]||arguments[0];if(this.enabled){this.clearCache();var o=U(this.targetAttachment,this.attachment);this.updateAttachClasses(this.attachment,o);var i=this.cache("element-bounds",function(){return a(t.element)}),n=i.width,r=i.height;if(0===n&&0===r&&"undefined"!=typeof this.lastSize){var s=this.lastSize;n=s.width,r=s.height}else this.lastSize={width:n,height:r};var h=this.cache("target-bounds",function(){return t.getTargetBounds()}),d=h,p=C(V(this.attachment),{width:n,height:r}),u=C(V(o),d),c=C(this.offset,{width:n,height:r}),g=C(this.targetOffset,d);p=w(p,c),u=w(u,g);for(var m=h.left+u.left-p.left,v=h.top+u.top-p.top,y=0;yA.documentElement.clientHeight&&(S=this.cache("scrollbar-size",l),E.viewport.bottom-=S.height),T.innerWidth>A.documentElement.clientWidth&&(S=this.cache("scrollbar-size",l),E.viewport.right-=S.width),["","static"].indexOf(A.body.style.position)!==-1&&["","static"].indexOf(A.body.parentElement.style.position)!==-1||(E.page.bottom=A.body.scrollHeight-v-r,E.page.right=A.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 f(t.target)}),o=t.cache("target-offsetparent-bounds",function(){return a(e)}),i=getComputedStyle(e),n=o,r={};if(["Top","Left","Bottom","Right"].forEach(function(t){r[t.toLowerCase()]=parseFloat(i["border"+t+"Width"])}),o.right=A.body.scrollWidth-o.left-n.width+r.right,o.bottom=A.body.scrollHeight-o.top-n.height+r.bottom,E.page.top>=o.top+r.top&&E.page.bottom>=o.bottom&&E.page.left>=o.left+r.left&&E.page.right>=o.right){var s=e.scrollTop,l=e.scrollLeft;E.offset={top:E.page.top-o.top+s-r.top,left:E.page.left-o.left+l-r.left}}}(),this.move(E),this.history.unshift(E),this.history.length>3&&this.history.pop(),e&&_(),!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,s=0;s=0){var c=a.split(" "),m=z(c,2);d=m[0],h=m[1]}else h=d=a;var b=O(e,r);"target"!==d&&"both"!==d||(ob[3]&&"bottom"===v.top&&(o-=p,v.top="top")),"together"===d&&("top"===v.top&&("bottom"===y.top&&ob[3]&&o-(s-p)>=b[1]&&(o-=s-p,v.top="bottom",y.top="bottom")),"bottom"===v.top&&("top"===y.top&&o+s>b[3]?(o-=p,v.top="top",o-=s,y.top="bottom"):"bottom"===y.top&&ob[3]&&"top"===y.top?(o-=s,y.top="bottom"):ob[2]&&"right"===v.left&&(i-=u,v.left="left")),"together"===h&&(ib[2]&&"right"===v.left?"left"===y.left?(i-=u,v.left="left",i-=f,y.left="right"):"right"===y.left&&(i-=u,v.left="left",i+=f,y.left="left"):"center"===v.left&&(i+f>b[2]&&"left"===y.left?(i-=f,y.left="right"):ib[3]&&"top"===y.top&&(o-=s,y.top="bottom")),"element"!==h&&"both"!==h||(ib[2]&&("left"===y.left?(i-=f,y.left="right"):"center"===y.left&&(i-=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=[],C=[];o=0?(o=b[1],w.push("top")):C.push("top")),o+s>b[3]&&(l.indexOf("bottom")>=0?(o=b[3]-s,w.push("bottom")):C.push("bottom")),i=0?(i=b[0],w.push("left")):C.push("left")),i+f>b[2]&&(l.indexOf("right")>=0?(i=b[2]-f,w.push("right")):C.push("right")),w.length&&!function(){var t=void 0;t="undefined"!=typeof e.options.pinnedClass?e.options.pinnedClass:e.getClass("pinned"),g.push(t),w.forEach(function(e){g.push(t+"-"+e)})}(),C.length&&!function(){var t=void 0;t="undefined"!=typeof e.options.outOfBoundsClass?e.options.outOfBoundsClass:e.getClass("out-of-bounds"),g.push(t),C.forEach(function(e){g.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===n.top&&v.left===n.left&&y.top===e.attachment.top&&y.left===e.attachment.left||(e.updateAttachClasses(y,v),e.trigger("update",{attachment:y,targetAttachment:v}))}),k(function(){e.options.addTargetClasses!==!1&&m(e.target,g,c),m(e.element,g,c)}),{top:o,left:i}}});var Y=x.Utils,a=Y.getBounds,m=Y.updateClasses,k=Y.defer;x.modules.push({position:function(t){var e=this,o=t.top,i=t.left,n=this.cache("element-bounds",function(){return a(e.element)}),r=n.height,s=n.width,f=this.getTargetBounds(),l=o+r,h=i+s,d=[];o<=f.bottom&&l>=f.top&&["left","right"].forEach(function(t){var e=f[t];e!==i&&e!==h||d.push(t)}),i<=f.right&&h>=f.left&&["top","bottom"].forEach(function(t){var e=f[t];e!==o&&e!==l||d.push(t)});var p=[],u=[],c=["left","top","right","bottom"];return p.push(this.getClass("abutted")),c.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)}),k(function(){e.options.addTargetClasses!==!1&&m(e.target,u,p),m(e.element,u,p)}),!0}});var z=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 x.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=z(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}}}}),$});
\ No newline at end of file
diff --git a/js/src/popover.js b/js/src/popover.js
index b68b47998..e20b50f97 100644
--- a/js/src/popover.js
+++ b/js/src/popover.js
@@ -118,8 +118,6 @@ const Popover = (($) => {
this.setElementContent($tip.find(Selector.CONTENT), this._getContent())
$tip.removeClass(`${ClassName.FADE} ${ClassName.SHOW}`)
-
- this.cleanupTether()
}
// private
diff --git a/js/src/tooltip.js b/js/src/tooltip.js
index 47c3d8d05..c4c4ee2f6 100644
--- a/js/src/tooltip.js
+++ b/js/src/tooltip.js
@@ -1,4 +1,4 @@
-/* global Tether */
+/* global Popper */
import Util from './util'
@@ -13,11 +13,11 @@ import Util from './util'
const Tooltip = (($) => {
/**
- * Check for Tether dependency
- * Tether - http://tether.io/
+ * Check for Popper dependency
+ * Tether - https://popper.js.org
*/
- if (typeof Tether === 'undefined') {
- throw new Error('Bootstrap tooltips require Tether (http://tether.io/)')
+ if (typeof Popper === 'undefined') {
+ throw new Error('Bootstrap tooltips require Popper (https://popper.js.org)')
}
@@ -33,8 +33,6 @@ const Tooltip = (($) => {
const EVENT_KEY = `.${DATA_KEY}`
const JQUERY_NO_CONFLICT = $.fn[NAME]
const TRANSITION_DURATION = 150
- const CLASS_PREFIX = 'bs-tether'
- const TETHER_PREFIX_REGEX = new RegExp(`(^|\\s)${CLASS_PREFIX}\\S+`, 'g')
const Default = {
animation : true,
@@ -66,10 +64,10 @@ const Tooltip = (($) => {
}
const AttachmentMap = {
- TOP : 'bottom center',
- RIGHT : 'middle left',
- BOTTOM : 'top center',
- LEFT : 'middle right'
+ TOP : 'top',
+ RIGHT : 'right',
+ BOTTOM : 'bottom',
+ LEFT : 'left'
}
const HoverState = {
@@ -100,11 +98,6 @@ const Tooltip = (($) => {
TOOLTIP_INNER : '.tooltip-inner'
}
- const TetherClass = {
- element : false,
- enabled : false
- }
-
const Trigger = {
HOVER : 'hover',
FOCUS : 'focus',
@@ -128,7 +121,7 @@ const Tooltip = (($) => {
this._timeout = 0
this._hoverState = ''
this._activeTrigger = {}
- this._tether = null
+ this._popper = null
// protected
this.element = element
@@ -220,8 +213,6 @@ const Tooltip = (($) => {
dispose() {
clearTimeout(this._timeout)
- this.cleanupTether()
-
$.removeData(this.element, this.constructor.DATA_KEY)
$(this.element).off(this.constructor.EVENT_KEY)
@@ -235,7 +226,7 @@ const Tooltip = (($) => {
this._timeout = null
this._hoverState = null
this._activeTrigger = null
- this._tether = null
+ this._popper = null
this.element = null
this.config = null
@@ -288,19 +279,19 @@ const Tooltip = (($) => {
$(this.element).trigger(this.constructor.Event.INSERTED)
- this._tether = new Tether({
- attachment,
- element : tip,
- target : this.element,
- classes : TetherClass,
- classPrefix : CLASS_PREFIX,
- offset : this.config.offset,
- constraints : this.config.constraints,
- addTargetClasses: false
+ this._popper = new Popper(this.element, tip, {
+ placement : attachment,
+ modifiers : {
+ arrow : {
+ element : Selector.TOOLTIP
+ },
+ offset : {
+ offset : this.config.offset
+ }
+ }
})
Util.reflow(tip)
- this._tether.position()
$(tip).addClass(ClassName.SHOW)
@@ -342,11 +333,9 @@ const Tooltip = (($) => {
tip.parentNode.removeChild(tip)
}
- this._cleanTipClass()
this.element.removeAttribute('aria-describedby')
$(this.element).trigger(this.constructor.Event.HIDDEN)
- this.cleanupTether()
-
+ this._popper.destroy()
if (callback) {
callback()
}
@@ -398,12 +387,8 @@ const Tooltip = (($) => {
setContent() {
const $tip = $(this.getTipElement())
-
this.setElementContent($tip.find(Selector.TOOLTIP_INNER), this.getTitle())
-
$tip.removeClass(`${ClassName.FADE} ${ClassName.SHOW}`)
-
- this.cleanupTether()
}
setElementContent($element, content) {
@@ -434,12 +419,6 @@ const Tooltip = (($) => {
return title
}
- cleanupTether() {
- if (this._tether) {
- this._tether.destroy()
- }
- }
-
// private
@@ -447,14 +426,6 @@ const Tooltip = (($) => {
return AttachmentMap[placement.toUpperCase()]
}
- _cleanTipClass() {
- const $tip = $(this.getTipElement())
- const tabClass = $tip.attr('class').match(TETHER_PREFIX_REGEX)
- if (tabClass !== null && tabClass.length > 0) {
- $tip.removeClass(tabClass.join(''))
- }
- }
-
_setListeners() {
const triggers = this.config.trigger.split(' ')
diff --git a/js/tests/visual/popover.html b/js/tests/visual/popover.html
index 51b5fe506..4fd813c06 100644
--- a/js/tests/visual/popover.html
+++ b/js/tests/visual/popover.html
@@ -29,7 +29,7 @@
-
+
diff --git a/js/tests/visual/tooltip.html b/js/tests/visual/tooltip.html
index f447a533b..c646c2c56 100644
--- a/js/tests/visual/tooltip.html
+++ b/js/tests/visual/tooltip.html
@@ -34,7 +34,7 @@
-
+
From 81e07ec05218d75d64454787449dcb870b5b66ec Mon Sep 17 00:00:00 2001
From: Johann-S
Date: Fri, 7 Apr 2017 11:12:17 +0200
Subject: [PATCH 04/54] Begin to add arrow to Popover and Tooltip
---
js/src/popover.js | 1 +
js/src/tooltip.js | 10 ++++++----
js/tests/visual/modal.html | 2 +-
3 files changed, 8 insertions(+), 5 deletions(-)
diff --git a/js/src/popover.js b/js/src/popover.js
index e20b50f97..02efe2b2e 100644
--- a/js/src/popover.js
+++ b/js/src/popover.js
@@ -28,6 +28,7 @@ const Popover = (($) => {
trigger : 'click',
content : '',
template : ''
})
diff --git a/js/src/tooltip.js b/js/src/tooltip.js
index c4c4ee2f6..505a8d492 100644
--- a/js/src/tooltip.js
+++ b/js/src/tooltip.js
@@ -37,6 +37,7 @@ const Tooltip = (($) => {
const Default = {
animation : true,
template : '',
trigger : 'hover focus',
title : '',
@@ -281,10 +282,8 @@ const Tooltip = (($) => {
this._popper = new Popper(this.element, tip, {
placement : attachment,
+ arrowElement : '.arrow',
modifiers : {
- arrow : {
- element : Selector.TOOLTIP
- },
offset : {
offset : this.config.offset
}
@@ -335,7 +334,10 @@ const Tooltip = (($) => {
this.element.removeAttribute('aria-describedby')
$(this.element).trigger(this.constructor.Event.HIDDEN)
- this._popper.destroy()
+ if (this._popper !== null) {
+ this._popper.destroy()
+ }
+
if (callback) {
callback()
}
diff --git a/js/tests/visual/modal.html b/js/tests/visual/modal.html
index e999514f7..90b814e67 100644
--- a/js/tests/visual/modal.html
+++ b/js/tests/visual/modal.html
@@ -170,7 +170,7 @@
-
+
From b40b1bc396adb80944b887f72d0ae616277c852d Mon Sep 17 00:00:00 2001
From: Johann-S
Date: Fri, 7 Apr 2017 13:20:34 +0200
Subject: [PATCH 05/54] Add attachment classes
---
js/src/popover.js | 14 ++++++++++++++
js/src/tooltip.js | 16 ++++++++++++++++
js/tests/index.html | 2 +-
js/tests/unit/tooltip.js | 2 +-
4 files changed, 32 insertions(+), 2 deletions(-)
diff --git a/js/src/popover.js b/js/src/popover.js
index 02efe2b2e..f89d3d5c8 100644
--- a/js/src/popover.js
+++ b/js/src/popover.js
@@ -22,6 +22,8 @@ const Popover = (($) => {
const DATA_KEY = 'bs.popover'
const EVENT_KEY = `.${DATA_KEY}`
const JQUERY_NO_CONFLICT = $.fn[NAME]
+ const CLASS_PREFIX = 'bs-popover'
+ const BSCLS_PREFIX_REGEX = new RegExp(`(^|\\s)${CLASS_PREFIX}\\S+`, 'g')
const Default = $.extend({}, Tooltip.Default, {
placement : 'right',
@@ -107,6 +109,10 @@ const Popover = (($) => {
return this.getTitle() || this._getContent()
}
+ addAttachmentClass(attachment) {
+ $(this.getTipElement()).addClass(`${CLASS_PREFIX}-${attachment}`)
+ }
+
getTipElement() {
return this.tip = this.tip || $(this.config.template)[0]
}
@@ -130,6 +136,14 @@ const Popover = (($) => {
this.config.content)
}
+ _cleanTipClass() {
+ const $tip = $(this.getTipElement())
+ const tabClass = $tip.attr('class').match(BSCLS_PREFIX_REGEX)
+ if (tabClass !== null && tabClass.length > 0) {
+ $tip.removeClass(tabClass.join(''))
+ }
+ }
+
// static
diff --git a/js/src/tooltip.js b/js/src/tooltip.js
index 505a8d492..fb4ff131c 100644
--- a/js/src/tooltip.js
+++ b/js/src/tooltip.js
@@ -33,6 +33,8 @@ const Tooltip = (($) => {
const EVENT_KEY = `.${DATA_KEY}`
const JQUERY_NO_CONFLICT = $.fn[NAME]
const TRANSITION_DURATION = 150
+ const CLASS_PREFIX = 'bs-tooltip'
+ const BSCLS_PREFIX_REGEX = new RegExp(`(^|\\s)${CLASS_PREFIX}\\S+`, 'g')
const Default = {
animation : true,
@@ -269,6 +271,7 @@ const Tooltip = (($) => {
this.config.placement
const attachment = this._getAttachment(placement)
+ this.addAttachmentClass(attachment)
const container = this.config.container === false ? document.body : $(this.config.container)
@@ -332,6 +335,7 @@ const Tooltip = (($) => {
tip.parentNode.removeChild(tip)
}
+ this._cleanTipClass()
this.element.removeAttribute('aria-describedby')
$(this.element).trigger(this.constructor.Event.HIDDEN)
if (this._popper !== null) {
@@ -383,6 +387,10 @@ const Tooltip = (($) => {
return Boolean(this.getTitle())
}
+ addAttachmentClass(attachment) {
+ $(this.getTipElement()).addClass(`${CLASS_PREFIX}-${attachment}`)
+ }
+
getTipElement() {
return this.tip = this.tip || $(this.config.template)[0]
}
@@ -624,6 +632,14 @@ const Tooltip = (($) => {
return config
}
+ _cleanTipClass() {
+ const $tip = $(this.getTipElement())
+ const tabClass = $tip.attr('class').match(BSCLS_PREFIX_REGEX)
+ if (tabClass !== null && tabClass.length > 0) {
+ $tip.removeClass(tabClass.join(''))
+ }
+ }
+
// static
diff --git a/js/tests/index.html b/js/tests/index.html
index 81efd5876..d17608e4a 100644
--- a/js/tests/index.html
+++ b/js/tests/index.html
@@ -7,7 +7,7 @@
-
+
diff --git a/js/tests/unit/tooltip.js b/js/tests/unit/tooltip.js
index 8cb1a6fdf..dc6364415 100644
--- a/js/tests/unit/tooltip.js
+++ b/js/tests/unit/tooltip.js
@@ -111,7 +111,7 @@ $(function () {
assert
.ok($('.tooltip')
- .is('.fade.bs-tether-element-attached-top.bs-tether-element-attached-center.show'), 'has correct classes applied')
+ .is('.fade.bs-tooltip-bottom.show'), 'has correct classes applied')
$tooltip.bootstrapTooltip('hide')
From d8996a7e0a90ad2a00151c5e14bae6a37bf8e186 Mon Sep 17 00:00:00 2001
From: Johann-S
Date: Sat, 8 Apr 2017 21:13:15 +0200
Subject: [PATCH 06/54] Fix arrow for tooltip and popover
---
js/src/tooltip.js | 19 ++++-----
js/tests/unit/tooltip.js | 83 ++++++++++++------------------------
js/tests/visual/tooltip.html | 3 ++
scss/_popover.scss | 56 +++++++++++-------------
scss/_tooltip.scss | 22 ++++------
5 files changed, 73 insertions(+), 110 deletions(-)
diff --git a/js/src/tooltip.js b/js/src/tooltip.js
index fb4ff131c..c380f8675 100644
--- a/js/src/tooltip.js
+++ b/js/src/tooltip.js
@@ -285,11 +285,8 @@ const Tooltip = (($) => {
this._popper = new Popper(this.element, tip, {
placement : attachment,
- arrowElement : '.arrow',
- modifiers : {
- offset : {
- offset : this.config.offset
- }
+ offsets : {
+ popper : this.config.offset
}
})
@@ -632,13 +629,13 @@ const Tooltip = (($) => {
return config
}
- _cleanTipClass() {
- const $tip = $(this.getTipElement())
- const tabClass = $tip.attr('class').match(BSCLS_PREFIX_REGEX)
- if (tabClass !== null && tabClass.length > 0) {
- $tip.removeClass(tabClass.join(''))
+ _cleanTipClass() {
+ const $tip = $(this.getTipElement())
+ const tabClass = $tip.attr('class').match(BSCLS_PREFIX_REGEX)
+ if (tabClass !== null && tabClass.length > 0) {
+ $tip.removeClass(tabClass.join(''))
+ }
}
- }
// static
diff --git a/js/tests/unit/tooltip.js b/js/tests/unit/tooltip.js
index dc6364415..0bb90156b 100644
--- a/js/tests/unit/tooltip.js
+++ b/js/tests/unit/tooltip.js
@@ -364,32 +364,31 @@ $(function () {
})
QUnit.test('should add position class before positioning so that position-specific styles are taken into account', function (assert) {
- assert.expect(1)
+ assert.expect(2)
+ var done = assert.async()
var styles = ''
var $styles = $(styles).appendTo('head')
var $container = $('
').appendTo('#qunit-fixture')
- var $target = $(' ')
+ $(' ')
.appendTo($container)
.bootstrapTooltip({
- placement: 'right'
+ placement: 'right',
+ trigger: 'manual'
+ })
+ .on('inserted.bs.tooltip', function () {
+ var $tooltip = $($(this).data('bs.tooltip').tip)
+ assert.ok($tooltip.hasClass('bs-tooltip-right'))
+ assert.ok($tooltip.attr('style') === undefined)
+ $(this).bootstrapTooltip('hide')
+ $container.remove()
+ $styles.remove()
+ done()
})
.bootstrapTooltip('show')
-
- var $tooltip = $($target.data('bs.tooltip').tip)
-
- // this is some dumb hack stuff because sub pixels in firefox
- var top = Math.round($target.offset().top + $target[0].offsetHeight / 2 - $tooltip[0].offsetHeight / 2)
- var top2 = Math.round($tooltip.offset().top)
- var topDiff = top - top2
- assert.ok(topDiff <= 1 && topDiff >= -1)
- $target.bootstrapTooltip('hide')
-
- $container.remove()
- $styles.remove()
})
QUnit.test('should use title attribute for tooltip text', function (assert) {
@@ -476,6 +475,12 @@ $(function () {
})
.appendTo('#qunit-fixture')
+ $('#qunit-fixture').css({
+ position : 'relative',
+ top : '0px',
+ left : '0px'
+ })
+
var $trigger = $container
.find('a')
.css('margin-top', 200)
@@ -489,6 +494,11 @@ $(function () {
setTimeout(function () {
assert.ok(Math.round($tooltip.offset().top + $tooltip.outerHeight()) <= Math.round($trigger.offset().top))
+ $('#qunit-fixture').css({
+ position : 'absolute',
+ top : '-10000px',
+ left : '-10000px'
+ })
done()
}, 0)
})
@@ -629,45 +639,6 @@ $(function () {
$tooltip.trigger('mouseenter')
})
- QUnit.test('should correctly position tooltips on SVG elements', function (assert) {
- if (!window.SVGElement) {
- // Skip IE8 since it doesn't support SVG
- assert.expect(0)
- return
- }
- assert.expect(2)
-
- var done = assert.async()
-
- var styles = ''
- var $styles = $(styles).appendTo('head')
-
- $('#qunit-fixture').append(
- ''
- + ' '
- + ' '
- + ' '
- + '
')
- var $circle = $('#theCircle')
-
- $circle
- .on('shown.bs.tooltip', function () {
- var offset = $('.tooltip').offset()
- $styles.remove()
- assert.ok(Math.abs(offset.left - 88) <= 1, 'tooltip has correct horizontal location')
- $circle.bootstrapTooltip('hide')
- assert.strictEqual($('.tooltip').length, 0, 'tooltip removed from dom')
- done()
- })
- .bootstrapTooltip({ placement: 'top', trigger: 'manual' })
-
- $circle.bootstrapTooltip('show')
- })
-
QUnit.test('should not reload the tooltip on subsequent mouseenter events', function (assert) {
assert.expect(1)
var titleHtml = function () {
diff --git a/js/tests/visual/tooltip.html b/js/tests/visual/tooltip.html
index c646c2c56..9fbd196b6 100644
--- a/js/tests/visual/tooltip.html
+++ b/js/tests/visual/tooltip.html
@@ -30,6 +30,9 @@
Tooltip with HTML
+
+
+
diff --git a/scss/_popover.scss b/scss/_popover.scss
index c259916d7..d763039ff 100644
--- a/scss/_popover.scss
+++ b/scss/_popover.scss
@@ -21,69 +21,66 @@
// Popover directions
- &.popover-top,
- &.bs-tether-element-attached-bottom {
- margin-top: -$popover-arrow-width;
+ &.bs-popover-top {
+ margin-bottom: $popover-arrow-width;
- &::before,
- &::after {
+ ::before,
+ ::after {
left: 50%;
border-bottom-width: 0;
}
- &::before {
+ ::before {
bottom: -$popover-arrow-outer-width;
margin-left: -$popover-arrow-outer-width;
border-top-color: $popover-arrow-outer-color;
}
- &::after {
+ ::after {
bottom: -($popover-arrow-outer-width - 1);
margin-left: -$popover-arrow-width;
border-top-color: $popover-arrow-color;
}
}
- &.popover-right,
- &.bs-tether-element-attached-left {
+ &.bs-popover-right {
margin-left: $popover-arrow-width;
- &::before,
- &::after {
+ ::before,
+ ::after {
top: 50%;
border-left-width: 0;
}
- &::before {
+ ::before {
left: -$popover-arrow-outer-width;
margin-top: -$popover-arrow-outer-width;
border-right-color: $popover-arrow-outer-color;
}
- &::after {
+ ::after {
left: -($popover-arrow-outer-width - 1);
margin-top: -($popover-arrow-outer-width - 1);
border-right-color: $popover-arrow-color;
}
}
- &.popover-bottom,
- &.bs-tether-element-attached-top {
+ &.bs-popover-bottom {
margin-top: $popover-arrow-width;
- &::before,
- &::after {
+ ::before,
+ ::after {
left: 50%;
border-top-width: 0;
}
- &::before {
+ ::before {
top: -$popover-arrow-outer-width;
margin-left: -$popover-arrow-outer-width;
border-bottom-color: $popover-arrow-outer-color;
}
- &::after {
+ ::after {
top: -($popover-arrow-outer-width - 1);
margin-left: -$popover-arrow-width;
border-bottom-color: $popover-arrow-color;
@@ -102,23 +99,22 @@
}
}
- &.popover-left,
- &.bs-tether-element-attached-right {
- margin-left: -$popover-arrow-width;
+ &.bs-popover-left {
+ margin-right: $popover-arrow-width;
- &::before,
- &::after {
+ ::before,
+ ::after {
top: 50%;
border-right-width: 0;
}
- &::before {
+ ::before {
right: -$popover-arrow-outer-width;
margin-top: -$popover-arrow-outer-width;
border-left-color: $popover-arrow-outer-color;
}
- &::after {
+ ::after {
right: -($popover-arrow-outer-width - 1);
margin-top: -($popover-arrow-outer-width - 1);
border-left-color: $popover-arrow-color;
@@ -153,8 +149,8 @@
//
// .popover-arrow is outer, .popover-arrow::after is inner
-.popover::before,
-.popover::after {
+.arrow::before,
+.arrow::after {
position: absolute;
display: block;
width: 0;
@@ -163,11 +159,11 @@
border-style: solid;
}
-.popover::before {
+.arrow::before {
content: "";
border-width: $popover-arrow-outer-width;
}
-.popover::after {
+.arrow::after {
content: "";
border-width: $popover-arrow-width;
}
diff --git a/scss/_tooltip.scss b/scss/_tooltip.scss
index 24e198d46..4006b46d9 100644
--- a/scss/_tooltip.scss
+++ b/scss/_tooltip.scss
@@ -13,12 +13,11 @@
&.show { opacity: $tooltip-opacity; }
- &.tooltip-top,
- &.bs-tether-element-attached-bottom {
+ &.bs-tooltip-top {
padding: $tooltip-arrow-width 0;
margin-top: -$tooltip-margin;
- .tooltip-inner::before {
+ .arrow::before {
bottom: 0;
left: 50%;
margin-left: -$tooltip-arrow-width;
@@ -27,12 +26,11 @@
border-top-color: $tooltip-arrow-color;
}
}
- &.tooltip-right,
- &.bs-tether-element-attached-left {
+ &.bs-tooltip-right {
padding: 0 $tooltip-arrow-width;
margin-left: $tooltip-margin;
- .tooltip-inner::before {
+ .arrow::before {
top: 50%;
left: 0;
margin-top: -$tooltip-arrow-width;
@@ -41,12 +39,11 @@
border-right-color: $tooltip-arrow-color;
}
}
- &.tooltip-bottom,
- &.bs-tether-element-attached-top {
+ &.bs-tooltip-bottom {
padding: $tooltip-arrow-width 0;
margin-top: $tooltip-margin;
- .tooltip-inner::before {
+ .arrow::before {
top: 0;
left: 50%;
margin-left: -$tooltip-arrow-width;
@@ -55,12 +52,11 @@
border-bottom-color: $tooltip-arrow-color;
}
}
- &.tooltip-left,
- &.bs-tether-element-attached-right {
+ &.bs-tooltip-left {
padding: 0 $tooltip-arrow-width;
margin-left: -$tooltip-margin;
- .tooltip-inner::before {
+ .arrow::before {
top: 50%;
right: 0;
margin-top: -$tooltip-arrow-width;
@@ -80,7 +76,7 @@
background-color: $tooltip-bg;
@include border-radius($border-radius);
- &::before {
+ .arrow::before {
position: absolute;
width: 0;
height: 0;
From 54a8ab40111dacdf50fad22e6f36d2801ba653c9 Mon Sep 17 00:00:00 2001
From: Johann-S
Date: Fri, 14 Apr 2017 11:25:53 +0200
Subject: [PATCH 07/54] Begin to use Popper for Dropdown
---
js/src/dropdown.js | 98 ++++++++++++++++++++++++++++++++---
js/src/tooltip.js | 2 +-
js/tests/visual/dropdown.html | 1 +
scss/_dropdown.scss | 18 ++-----
4 files changed, 97 insertions(+), 22 deletions(-)
diff --git a/js/src/dropdown.js b/js/src/dropdown.js
index eb536dc7d..a2b5561c2 100644
--- a/js/src/dropdown.js
+++ b/js/src/dropdown.js
@@ -10,6 +10,13 @@ import Util from './util'
const Dropdown = (($) => {
+ /**
+ * Check for Popper dependency
+ * Popper - https://popper.js.org
+ */
+ if (typeof Popper === 'undefined') {
+ throw new Error('Bootstrap dropdown require Popper (https://popper.js.org)')
+ }
/**
* ------------------------------------------------------------------------
@@ -55,6 +62,20 @@ const Dropdown = (($) => {
VISIBLE_ITEMS : '.dropdown-menu .dropdown-item:not(.disabled)'
}
+ const Default = {
+ animation : true,
+ trigger : 'click',
+ placement : 'bottom',
+ offset : '0 0'
+ }
+
+ const DefaultType = {
+ animation : 'boolean',
+ trigger : 'string',
+ placement : 'string',
+ offset : 'string'
+ }
+
/**
* ------------------------------------------------------------------------
@@ -64,8 +85,11 @@ const Dropdown = (($) => {
class Dropdown {
- constructor(element) {
+ constructor(element, config) {
this._element = element
+ this._popper = null
+ this._config = this._getConfig(config)
+ this._menu = this._getMenuElement()
this._addEventListeners()
}
@@ -77,16 +101,30 @@ const Dropdown = (($) => {
return VERSION
}
+ static get Default() {
+ return Default
+ }
+
+ static get DefaultType() {
+ return DefaultType
+ }
+
// public
toggle() {
- if (this.disabled || $(this).hasClass(ClassName.DISABLED)) {
+ let context = $(this).data(DATA_KEY)
+ if (!context) {
+ context = new Dropdown(this)
+ $(this).data(DATA_KEY, context)
+ }
+
+ if (context.disabled || $(this).hasClass(ClassName.DISABLED)) {
return false
}
const parent = Dropdown._getParentFromElement(this)
- const isActive = $(parent).hasClass(ClassName.SHOW)
+ const isActive = $(context._menu).hasClass(ClassName.SHOW)
Dropdown._clearMenus()
@@ -97,7 +135,7 @@ const Dropdown = (($) => {
const relatedTarget = {
relatedTarget : this
}
- const showEvent = $.Event(Event.SHOW, relatedTarget)
+ const showEvent = $.Event(Event.SHOW, relatedTarget)
$(parent).trigger(showEvent)
@@ -105,6 +143,13 @@ const Dropdown = (($) => {
return false
}
+ this._popper = new Popper(this, context._menu, {
+ placement : context._config.placement,
+ offsets : {
+ popper : context._config.offset
+ }
+ })
+
// if this is a touch-enabled device we add extra
// empty mouseover listeners to the body's immediate children;
// only needed because of broken event delegation on iOS
@@ -117,8 +162,10 @@ const Dropdown = (($) => {
this.focus()
this.setAttribute('aria-expanded', true)
- $(parent).toggleClass(ClassName.SHOW)
- $(parent).trigger($.Event(Event.SHOWN, relatedTarget))
+ $(context._menu).toggleClass(ClassName.SHOW)
+ $(parent)
+ .toggleClass(ClassName.SHOW)
+ .trigger($.Event(Event.SHOWN, relatedTarget))
return false
}
@@ -127,6 +174,10 @@ const Dropdown = (($) => {
$.removeData(this._element, DATA_KEY)
$(this._element).off(EVENT_KEY)
this._element = null
+ this._menu = null
+ if (this._popper !== null) {
+ this._popper.destroy()
+ }
}
@@ -136,15 +187,40 @@ const Dropdown = (($) => {
$(this._element).on(Event.CLICK, this.toggle)
}
+ _getConfig(config) {
+ config = $.extend(
+ {},
+ this.constructor.Default,
+ $(this._element).data(),
+ config
+ )
+
+ Util.typeCheckConfig(
+ NAME,
+ config,
+ this.constructor.DefaultType
+ )
+
+ return config
+ }
+
+ _getMenuElement() {
+ if (!this._menu) {
+ let parent = Dropdown._getParentFromElement(this._element)
+ this._menu = $(parent).find(Selector.MENU)[0]
+ }
+ return this._menu
+ }
// static
static _jQueryInterface(config) {
return this.each(function () {
let data = $(this).data(DATA_KEY)
+ let _config = typeof config === 'object' ? config : null
if (!data) {
- data = new Dropdown(this)
+ data = new Dropdown(this, _config)
$(this).data(DATA_KEY, data)
}
@@ -164,13 +240,18 @@ const Dropdown = (($) => {
}
const toggles = $.makeArray($(Selector.DATA_TOGGLE))
-
for (let i = 0; i < toggles.length; i++) {
const parent = Dropdown._getParentFromElement(toggles[i])
+ let context = $(toggles[i]).data(DATA_KEY)
const relatedTarget = {
relatedTarget : toggles[i]
}
+ if (!context) {
+ continue
+ }
+
+ let dropdownMenu = context._menu
if (!$(parent).hasClass(ClassName.SHOW)) {
continue
}
@@ -195,6 +276,7 @@ const Dropdown = (($) => {
toggles[i].setAttribute('aria-expanded', 'false')
+ $(dropdownMenu).removeClass(ClassName.SHOW)
$(parent)
.removeClass(ClassName.SHOW)
.trigger($.Event(Event.HIDDEN, relatedTarget))
diff --git a/js/src/tooltip.js b/js/src/tooltip.js
index c380f8675..2c22a7ed4 100644
--- a/js/src/tooltip.js
+++ b/js/src/tooltip.js
@@ -14,7 +14,7 @@ const Tooltip = (($) => {
/**
* Check for Popper dependency
- * Tether - https://popper.js.org
+ * Popper - https://popper.js.org
*/
if (typeof Popper === 'undefined') {
throw new Error('Bootstrap tooltips require Popper (https://popper.js.org)')
diff --git a/js/tests/visual/dropdown.html b/js/tests/visual/dropdown.html
index cc8a6e709..d96b367e9 100644
--- a/js/tests/visual/dropdown.html
+++ b/js/tests/visual/dropdown.html
@@ -61,6 +61,7 @@
+
diff --git a/scss/_dropdown.scss b/scss/_dropdown.scss
index 3c5a5c66e..2c57f0209 100644
--- a/scss/_dropdown.scss
+++ b/scss/_dropdown.scss
@@ -100,11 +100,6 @@
// Open state for the dropdown
.show {
- // Show the menu
- > .dropdown-menu {
- display: block;
- }
-
// Remove the outline when :focus is triggered
> a {
outline: 0;
@@ -125,6 +120,10 @@
left: 0;
}
+.dropdown-menu.show {
+ display: block;
+}
+
// Dropdown section headers
.dropdown-header {
display: block;
@@ -139,11 +138,4 @@
//
// Just add .dropup after the standard .dropdown class and you're set.
-.dropup {
- // Different positioning for bottom up menu
- .dropdown-menu {
- top: auto;
- bottom: 100%;
- margin-bottom: $dropdown-margin-top;
- }
-}
+.dropup {}
From c21a2b0d92ca78b63bb9ec21ca0fbf9e9206a18e Mon Sep 17 00:00:00 2001
From: Johann-S
Date: Fri, 14 Apr 2017 12:05:54 +0200
Subject: [PATCH 08/54] Remove constraints option and check every options
---
js/src/dropdown.js | 14 ++++++--------
js/src/tooltip.js | 12 ++++++------
2 files changed, 12 insertions(+), 14 deletions(-)
diff --git a/js/src/dropdown.js b/js/src/dropdown.js
index a2b5561c2..ad5ee8d9f 100644
--- a/js/src/dropdown.js
+++ b/js/src/dropdown.js
@@ -63,17 +63,13 @@ const Dropdown = (($) => {
}
const Default = {
- animation : true,
- trigger : 'click',
placement : 'bottom',
- offset : '0 0'
+ offset : {}
}
const DefaultType = {
- animation : 'boolean',
- trigger : 'string',
placement : 'string',
- offset : 'string'
+ offset : 'number'
}
@@ -145,8 +141,10 @@ const Dropdown = (($) => {
this._popper = new Popper(this, context._menu, {
placement : context._config.placement,
- offsets : {
- popper : context._config.offset
+ modifiers : {
+ offset : {
+ offset : this.config.offset
+ }
}
})
diff --git a/js/src/tooltip.js b/js/src/tooltip.js
index 2c22a7ed4..5f5e3d7bc 100644
--- a/js/src/tooltip.js
+++ b/js/src/tooltip.js
@@ -47,8 +47,7 @@ const Tooltip = (($) => {
html : false,
selector : false,
placement : 'top',
- offset : '0 0',
- constraints : [],
+ offset : {},
container : false
}
@@ -61,8 +60,7 @@ const Tooltip = (($) => {
html : 'boolean',
selector : '(string|boolean)',
placement : '(string|function)',
- offset : 'string',
- constraints : 'array',
+ offset : 'number',
container : '(string|element|boolean)'
}
@@ -285,8 +283,10 @@ const Tooltip = (($) => {
this._popper = new Popper(this.element, tip, {
placement : attachment,
- offsets : {
- popper : this.config.offset
+ modifiers : {
+ offset : {
+ offset : this.config.offset
+ }
}
})
From 69de65180f750cadf5f96a774d2524f69d19beab Mon Sep 17 00:00:00 2001
From: Johann-S
Date: Fri, 14 Apr 2017 13:30:55 +0200
Subject: [PATCH 09/54] Fix unit tests + Update Popper to 1.6.0
---
docs/assets/js/vendor/popper.min.js | 4 +-
js/src/dropdown.js | 14 ++++---
js/src/tooltip.js | 2 +-
js/tests/unit/dropdown.js | 48 +++++++++++-----------
js/tests/unit/popover.js | 15 ++++---
js/tests/unit/tooltip.js | 64 +++--------------------------
js/tests/visual/tooltip.html | 18 ++++++++
scss/_dropdown.scss | 2 +-
8 files changed, 70 insertions(+), 97 deletions(-)
diff --git a/docs/assets/js/vendor/popper.min.js b/docs/assets/js/vendor/popper.min.js
index 22ac698ab..fffdb1d1b 100644
--- a/docs/assets/js/vendor/popper.min.js
+++ b/docs/assets/js/vendor/popper.min.js
@@ -1,3 +1,3 @@
-(function(e,t){'object'==typeof exports&&'undefined'!=typeof module?module.exports=t():'function'==typeof define&&define.amd?define(t):e.Popper=t()})(this,function(){'use strict';function e(he){const ce=he.offsetParent,ue=ce&&ce.nodeName;return ue&&'BODY'!==ue&&'HTML'!==ue?ce:window.document.documentElement}function t(he,ce){if(1!==he.nodeType)return[];const ue=window.getComputedStyle(he,null);return ce?ue[ce]:ue}function o(he){return'HTML'===he.nodeName?he:he.parentNode||he.host}function r(he){if(!he||-1!==['HTML','BODY','#document'].indexOf(he.nodeName))return window.document.body;const{overflow:ce,overflowX:ue,overflowY:ge}=t(he);return /(auto|scroll)/.test(ce+ge+ue)?he:r(o(he))}function s(he){const ce=he.nodeName;return'BODY'===ce||'HTML'===ce?!1:'fixed'===t(he,'position')||s(o(he))}function p(he){const ce=e(he),ue=s(ce);return ue?'fixed':'absolute'}function f(he,ce){const ue='x'===ce?'Left':'Top',ge='Left'==ue?'Right':'Bottom';return+he[`border${ue}Width`].split('px')[0]+ +he[`border${ge}Width`].split('px')[0]}function d(he){const ce=-1!==navigator.appVersion.indexOf('MSIE 10');let ue;if(ce)try{ue=he.getBoundingClientRect()}catch(xe){ue={}}else ue=he.getBoundingClientRect();const ge={left:ue.left,top:ue.top,right:ue.right,bottom:ue.bottom,width:ue.right-ue.left,height:ue.bottom-ue.top};if('HTML'===he.nodeName&&ce){const{scrollTop:xe,scrollLeft:ye}=window.document.documentElement;ge.top-=xe,ge.bottom-=xe,ge.left-=ye,ge.right-=ye}let be=ue.width-(he.clientWidth||ue.right-ue.left),we=ue.height-(he.clientHeight||ue.bottom-ue.top);if(be||we){const xe=t(he);be-=f(xe,'x'),we-=f(xe,'y')}return ge.right-=be,ge.width-=be,ge.bottom-=we,ge.height-=we,ge}function l(he,ce='top'){const ue='top'===ce?'scrollTop':'scrollLeft',ge=he.nodeName;if('BODY'===ge||'HTML'===ge){const be=window.document.documentElement,we=window.document.scrollingElement||be;return we[ue]}return he[ue]}function m(he,ce,ue=!1){const ge=l(ce,'top'),be=l(ce,'left'),we=ue?-1:1;return he.top+=ge*we,he.bottom+=ge*we,he.left+=be*we,he.right+=be*we,he}function h(he,ce,ue=!1,ge=!1){const be=r(ce),we=d(he),xe=d(ce);let ye={top:we.top-xe.top,left:we.left-xe.left,bottom:we.top-xe.top+we.height,right:we.left-xe.left+we.width,width:we.width,height:we.height};ue&&!ge?ye=m(ye,be,!0):e(he).contains(be)&&'BODY'!==be.nodeName&&(ye=m(ye,ce));const ve=t(ce),Oe=+ve.borderTopWidth.split('px')[0],Ee=+ve.borderLeftWidth.split('px')[0];return ye.top-=Oe,ye.bottom-=Oe,ye.left-=Ee,ye.right-=Ee,ye}function c(){const he=window.document.body,ce=window.document.documentElement;return{height:Math.max(he.scrollHeight,he.offsetHeight,ce.clientHeight,ce.scrollHeight,ce.offsetHeight),width:Math.max(he.scrollWidth,he.offsetWidth,ce.clientWidth,ce.scrollWidth,ce.offsetWidth)}}function u(he){let ce;if('HTML'===he.nodeName){const{width:ue,height:ge}=c();ce={width:ue,height:ge,left:0,top:0}}else ce={width:he.offsetWidth,height:he.offsetHeight,left:he.offsetLeft,top:he.offsetTop};return ce.right=ce.left+ce.width,ce.bottom=ce.top+ce.height,ce}function g(he){const ce=u(he);if('HTML'!==he.nodeName){const ue=e(he),ge=g(ue),be={width:ce.offsetWidth,height:ce.offsetHeight,left:ce.left+ge.left,top:ce.top+ge.top,right:ce.right-ge.right,bottom:ce.bottom-ge.bottom};return be}return ce}function w(he,ce='top'){const ue=r(he),ge=l(ue,ce);return-1===['BODY','HTML'].indexOf(ue.nodeName)?ge+w(o(ue),ce):ge}function v(he,ce,ue){let ge={top:0,left:0};const be=e(he);if('viewport'===ue){const{left:we,top:xe}=g(be),{clientWidth:ye,clientHeight:ve}=window.document.documentElement;if('fixed'===p(he))ge.right=ye,ge.bottom=ve;else{const Oe=w(he,'left'),Ee=w(he,'top');ge={top:0-xe,right:ye-we+Oe,bottom:ve-xe+Ee,left:0-we}}}else{let we;if(we='scrollParent'===ue?r(o(he)):'window'===ue?window.document.body:ue,'BODY'===we.nodeName){const{height:xe,width:ye}=c();ge.right=ye,ge.bottom=xe}else ge=h(we,be,s(he))}return ge.left+=ce,ge.top+=ce,ge.right-=ce,ge.bottom-=ce,ge}function O(he,ce,ue){if(-1===he.indexOf('auto'))return he;const ge=v(ue,0,'scrollParent'),be={top:ce.top-ge.top,right:ge.right-ce.right,bottom:ge.bottom-ce.bottom,left:ce.left-ge.left},we=Object.keys(be).sort((ye,ve)=>be[ve]-be[ye])[0],xe=he.split('-')[1];return we+(xe?`-${xe}`:'')}function N(he,ce){return Array.prototype.find?he.find(ce):he.filter(ce)[0]}function L(he,ce,ue){if(Array.prototype.findIndex)return he.findIndex((be)=>be[ce]===ue);const ge=N(he,(be)=>be[ce]===ue);return he.indexOf(ge)}function T(he){return fe({},he,{right:he.left+he.width,bottom:he.top+he.height})}function P(he){const ce=window.getComputedStyle(he),ue=parseFloat(ce.marginTop)+parseFloat(ce.marginBottom),ge=parseFloat(ce.marginLeft)+parseFloat(ce.marginRight),be={width:he.offsetWidth+ge,height:he.offsetHeight+ue};return be}function B(he){const ce={left:'right',right:'left',bottom:'top',top:'bottom'};return he.replace(/left|right|bottom|top/g,(ue)=>ce[ue])}function H(he,ce,ue,ge){ge=ge.split('-')[0];const be=P(ce),we={position:he,width:be.width,height:be.height},xe=-1!==['right','left'].indexOf(ge),ye=xe?'top':'left',ve=xe?'left':'top',Oe=xe?'height':'width',Ee=xe?'width':'height';return we[ye]=ue[ye]+ue[Oe]/2-be[Oe]/2,we[ve]=ge===ve?ue[ve]-be[Ee]:ue[B(ve)],we}function W(he,ce,ue){const ge='fixed'===he.position,be=he.isParentTransformed,we=e(ge&&be?ue:ce);return h(ue,we,ge,be)}function D(he){const ce=[!1,'ms','webkit','moz','o'],ue=he.charAt(0).toUpperCase()+he.slice(1);for(let ge=0;gege&&ue===ce)}function R(he,ce,ue){const ge=N(he,({name:be})=>be===ce);return!!ge&&he.some((be)=>{return be.name===ue&&be.enabled&&be.order{ue.removeEventListener('scroll',ce.updateBound)}),ce.updateBound=null,ce.scrollParents=[],ce.scrollElement=null,ce.eventsEnabled=!1,ce}function I(he,ce,ue){const ge=void 0===ue?he:he.slice(0,L(he,'name',ue));return ge.forEach((be)=>{be.enabled&&C(be.function)&&(ce=be.function(ce,be))}),ce}function U(he,ce){Object.keys(ce).forEach(function(ue){const ge=ce[ue];!1===ge?he.removeAttribute(ue):he.setAttribute(ue,ce[ue])})}function q(he,ce){Object.keys(ce).forEach((ue)=>{let ge='';-1!==['width','height','top','right','bottom','left'].indexOf(ue)&&A(ce[ue])&&(ge='px'),he.style[ue]=ce[ue]+ge})}function z(he,ce,ue,ge){const be='BODY'===he.nodeName,we=be?window:he;we.addEventListener(ce,ue,{passive:!0}),be||z(r(we.parentNode),ce,ue,ge),ge.push(we)}function F(he,ce,ue,ge){ue.updateBound=ge,window.addEventListener('resize',ue.updateBound,{passive:!0});const be=r(he);return z(be,'scroll',ue.updateBound,ue.scrollParents),ue.scrollElement=be,ue.eventsEnabled=!0,ue}function X(he){return'end'===he?'start':'start'===he?'end':he}const te=['native code','[object MutationObserverConstructor]'];var oe=(he)=>te.some((ce)=>-1<(he||'').toString().indexOf(ce));const ie='undefined'!=typeof window,re=['Edge','Trident','Firefox'];let ne=0;for(let he=0;he{he(),ce=!1});return be.observe(ge,{attributes:!0}),()=>{ce||(ce=!0,ge.setAttribute('x-index',ue),++ue)}}:function(he){let ce=!1;return()=>{ce||(ce=!0,setTimeout(()=>{ce=!1,he()},ne))}},fe=Object.assign||function(he){for(var ue,ce=1;cerequestAnimationFrame(this.update),this.update=pe(this.update.bind(this)),this.options=fe({},me.Defaults,ue),this.state={isDestroyed:!1,isCreated:!1,scrollParents:[]},this.reference=he.jquery?he[0]:he,this.popper=ce.jquery?ce[0]:ce,this.modifiers=Object.keys(me.Defaults.modifiers).map((be)=>fe({name:be},me.Defaults.modifiers[be])),this.modifiers=this.modifiers.map((be)=>{const we=ue.modifiers&&ue.modifiers[be.name]||{};return fe({},be,we)}),ue.modifiers&&(this.options.modifiers=fe({},me.Defaults.modifiers,ue.modifiers),Object.keys(ue.modifiers).forEach((be)=>{if(void 0===me.Defaults.modifiers[be]){const we=ue.modifiers[be];we.name=be,this.modifiers.push(we)}})),this.state.position=p(this.reference),this.modifiers=this.modifiers.sort((be,we)=>be.order-we.order),this.modifiers.forEach((be)=>{be.enabled&&C(be.onLoad)&&be.onLoad(this.reference,this.popper,this.options,be,this.state)}),this.state.isParentTransformed=k(this.popper.parentNode),this.update();const ge=this.options.eventsEnabled;ge&&this.enableEventListeners(),this.state.eventsEnabled=ge}update(){if(!this.state.isDestroyed){let he={instance:this,styles:{},attributes:{},flipped:!1,offsets:{}};this.state.position=p(this.reference),q(this.popper,{position:this.state.position}),he.offsets.reference=W(this.state,this.popper,this.reference),he.placement=O(this.options.placement,he.offsets.reference,this.popper),he.originalPlacement=this.options.placement,he.offsets.popper=H(this.state,this.popper,he.offsets.reference,he.placement),he=I(this.modifiers,he),this.state.isCreated?this.options.onUpdate(he):(this.state.isCreated=!0,this.options.onCreate(he))}}destroy(){return this.state.isDestroyed=!0,M(this.modifiers,'applyStyle')&&(this.popper.removeAttribute('x-placement'),this.popper.style.left='',this.popper.style.position='',this.popper.style.top='',this.popper.style[D('transform')]=''),this.disableEventListeners(),this.options.removeOnDestroy&&this.popper.parentNode.removeChild(this.popper),this}enableEventListeners(){this.state.eventsEnabled||(this.state=F(this.reference,this.options,this.state,this.scheduleUpdate))}disableEventListeners(){this.state.eventsEnabled&&(window.cancelAnimationFrame(this.scheduleUpdate),this.state=Y(this.reference,this.state))}}return me.Utils={computeAutoPlacement:O,debounce:pe,findIndex:L,getBordersSize:f,getBoundaries:v,getBoundingClientRect:d,getClientRect:T,getOffsetParent:e,getOffsetRect:u,getOffsetRectRelativeToCustomParent:h,getOuterSizes:P,getParentNode:o,getPopperOffsets:H,getPosition:p,getReferenceOffsets:W,getScroll:l,getScrollParent:r,getStyleComputedProperty:t,getSupportedPropertyName:D,getTotalScroll:w,getWindowSizes:c,includeScroll:m,isFixed:s,isFunction:C,isModifierEnabled:M,isModifierRequired:R,isNative:oe,isNumeric:A,isTransformed:k,removeEventListeners:Y,runModifiers:I,setAttributes:U,setStyles:q,setupEventListeners:F},me.placements=['auto','auto-start','auto-end','top','top-start','top-end','right','right-start','right-end','bottom','bottom-start','bottom-end','left','left-start','left-end'],me.Defaults={placement:'bottom',eventsEnabled:!0,onCreate:()=>{},onUpdate:()=>{},modifiers:{shift:{order:100,enabled:!0,function:function(he){const ce=he.placement,ue=ce.split('-')[0],ge=ce.split('-')[1];if(ge){const be=he.offsets.reference,we=T(he.offsets.popper),xe=-1!==['bottom','top'].indexOf(ue),ye=xe?'left':'top',ve=xe?'width':'height',Oe={start:{[ye]:be[ye]},end:{[ye]:be[ye]+be[ve]-we[ve]}};he.offsets.popper=fe({},we,Oe[ge])}return he}},offset:{order:200,enabled:!0,function:function(he,ce){const ue=he.placement,ge=he.offsets.popper;let be;return A(ce.offset)?be=[ce.offset,0]:(be=ce.offset.split(' '),be=be.map((we,xe)=>{const ye=we.match(/(\d*\.?\d*)(.*)/),ve=+ye[1],Oe=ye[2];let Ee=-1!==ue.indexOf('right')||-1!==ue.indexOf('left');1===xe&&(Ee=!Ee);const Se=Ee?'height':'width';if(0===Oe.indexOf('%')){let Ne;switch(Oe){case'%p':Ne=he.offsets.popper;break;case'%':case'$r':default:Ne=he.offsets.reference;}const Le=T(Ne),Te=Le[Se];return Te/100*ve}if('vh'===Oe||'vw'===Oe){let Ne;return Ne='vh'===Oe?Math.max(document.documentElement.clientHeight,window.innerHeight||0):Math.max(document.documentElement.clientWidth,window.innerWidth||0),Ne/100*ve}return'px'===Oe?+ve:+we})),-1===he.placement.indexOf('left')?-1===he.placement.indexOf('right')?-1===he.placement.indexOf('top')?-1!==he.placement.indexOf('bottom')&&(ge.left+=be[0],ge.top+=be[1]||0):(ge.left+=be[0],ge.top-=be[1]||0):(ge.top+=be[0],ge.left+=be[1]||0):(ge.top+=be[0],ge.left-=be[1]||0),he},offset:0},preventOverflow:{order:300,enabled:!0,function:function(he,ce){const ue=ce.boundariesElement||e(he.instance.popper),ge=v(he.instance.popper,ce.padding,ue);ce.boundaries=ge;const be=ce.priority;let we=T(he.offsets.popper);const xe={primary(ye){let ve=we[ye];return we[ye]ge[ye]&&!ce.escapeWithReference&&(Oe=Math.min(we[ve],ge[ye]-('right'===ye?we.width:we.height))),{[ve]:Oe}}};return be.forEach((ye)=>{const ve=-1===['left','top'].indexOf(ye)?'secondary':'primary';we=fe({},we,xe[ve](ye))}),he.offsets.popper=we,he},priority:['left','right','top','bottom'],padding:5,boundariesElement:'scrollParent'},keepTogether:{order:400,enabled:!0,function:function(he){const ce=T(he.offsets.popper),ue=he.offsets.reference,ge=he.placement.split('-')[0],be=Math.floor,we=-1!==['top','bottom'].indexOf(ge),xe=we?'right':'bottom',ye=we?'left':'top',ve=we?'width':'height';return ce[xe]be(ue[xe])&&(he.offsets.popper[ye]=be(ue[xe])),he}},arrow:{order:500,enabled:!0,function:function(he,ce){if(!R(he.instance.modifiers,'arrow','keepTogether'))return console.warn('WARNING: `keepTogether` modifier is required by arrow modifier in order to work, be sure to include it before `arrow`!'),he;let ue=ce.element;if('string'==typeof ue){if(ue=he.instance.popper.querySelector(ue),!ue)return he;}else if(!he.instance.popper.contains(ue))return console.warn('WARNING: `arrow.element` must be child of its popper element!'),he;const ge=he.placement.split('-')[0],be=T(he.offsets.popper),we=he.offsets.reference,xe=-1!==['left','right'].indexOf(ge),ye=xe?'height':'width',ve=xe?'top':'left',Oe=xe?'left':'top',Ee=xe?'bottom':'right',Se=P(ue)[ye];we[Ee]-Sebe[Ee]&&(he.offsets.popper[ve]+=we[ve]+Se-be[Ee]);const Ne=we[ve]+we[ye]/2-Se/2;let Le=Ne-T(he.offsets.popper)[ve];return Le=Math.max(Math.min(be[ye]-Se,Le),0),he.arrowElement=ue,he.offsets.arrow={},he.offsets.arrow[ve]=Le,he.offsets.arrow[Oe]='',he},element:'[x-arrow]'},flip:{order:600,enabled:!0,function:function(he,ce){if(M(he.instance.modifiers,'inner'))return he;if(he.flipped&&he.placement===he.originalPlacement)return he;const ue=v(he.instance.popper,ce.padding,ce.boundariesElement);let ge=he.placement.split('-')[0],be=B(ge),we=he.placement.split('-')[1]||'',xe=[];return xe='flip'===ce.behavior?[ge,be]:ce.behavior,xe.forEach((ye,ve)=>{if(ge!==ye||xe.length===ve+1)return he;ge=he.placement.split('-')[0],be=B(ge);const Oe=T(he.offsets.popper),Ee=he.offsets.reference,Se=Math.floor,Ne='left'===ge&&Se(Oe.right)>Se(Ee.left)||'right'===ge&&Se(Oe.left)Se(Ee.top)||'bottom'===ge&&Se(Oe.top)Se(ue.right),Pe=Se(Oe.top)Se(ue.bottom),He='left'===ge&&Le||'right'===ge&&Te||'top'===ge&&Pe||'bottom'===ge&&Be,We=-1!==['top','bottom'].indexOf(ge),De=!!ce.flipVariations&&(We&&'start'===we&&Le||We&&'end'===we&&Te||!We&&'start'===we&&Pe||!We&&'end'===we&&Be);(Ne||He||De)&&(he.flipped=!0,(Ne||He)&&(ge=xe[ve+1]),De&&(we=X(we)),he.placement=ge+(we?'-'+we:''),he.offsets.popper=H(he.instance.state.position,he.instance.popper,he.offsets.reference,he.placement),he=I(he.instance.modifiers,he,'flip'))}),he},behavior:'flip',padding:5,boundariesElement:'viewport'},inner:{order:700,enabled:!1,function:function(he){const ce=he.placement,ue=ce.split('-')[0],ge=T(he.offsets.popper),be=T(he.offsets.reference),we=-1!==['left','right'].indexOf(ue),xe=-1===['top','left'].indexOf(ue);return ge[we?'left':'top']=be[ce]-(xe?ge[we?'width':'height']:0),he.placement=B(ce),he.offsets.popper=T(ge),he}},hide:{order:800,enabled:!0,function:function(he){if(!R(he.instance.modifiers,'hide','preventOverflow'))return console.warn('WARNING: preventOverflow modifier is required by hide modifier in order to work, be sure to include it before hide!'),he;const ce=he.offsets.reference,ue=N(he.instance.modifiers,(ge)=>'preventOverflow'===ge.name).boundaries;if(ce.bottomue.right||ce.top>ue.bottom||ce.rightve[Ne]&&!we.escapeWithReference&&(Pe=_Mathmin(Ee[Te],ve[Ne]-('right'===Ne?Ee.width:Ee.height))),ne({},Te,Pe)}};return Oe.forEach(function(Le){var Ne=-1===['left','top'].indexOf(Le)?'secondary':'primary';Ee=re({},Ee,Se[Ne](Le))}),ye.offsets.popper=Ee,ye},priority:['left','right','top','bottom'],padding:5,boundariesElement:'scrollParent'},keepTogether:{order:400,enabled:!0,function:function(ye){var we=h(ye.offsets.popper),xe=ye.offsets.reference,ve=ye.placement.split('-')[0],Oe=_Mathfloor,Ee=-1!==['top','bottom'].indexOf(ve),Se=Ee?'right':'bottom',Le=Ee?'left':'top',Ne=Ee?'width':'height';return we[Se]Oe(xe[Se])&&(ye.offsets.popper[Le]=Oe(xe[Se])),ye}},arrow:{order:500,enabled:!0,function:function(ye,we){if(!R(ye.instance.modifiers,'arrow','keepTogether'))return console.warn('WARNING: `keepTogether` modifier is required by arrow modifier in order to work, be sure to include it before `arrow`!'),ye;var xe=we.element;if('string'==typeof xe){if(xe=ye.instance.popper.querySelector(xe),!xe)return ye;}else if(!ye.instance.popper.contains(xe))return console.warn('WARNING: `arrow.element` must be child of its popper element!'),ye;var ve=ye.placement.split('-')[0],Oe=h(ye.offsets.popper),Ee=ye.offsets.reference,Se=-1!==['left','right'].indexOf(ve),Le=Se?'height':'width',Ne=Se?'top':'left',Te=Se?'left':'top',Pe=Se?'bottom':'right',We=W(xe)[Le];Ee[Pe]-WeOe[Pe]&&(ye.offsets.popper[Ne]+=Ee[Ne]+We-Oe[Pe]);var He=Ee[Ne]+Ee[Le]/2-We/2,Be=He-h(ye.offsets.popper)[Ne];return Be=_Mathmax(_Mathmin(Oe[Le]-We,Be),0),ye.arrowElement=xe,ye.offsets.arrow={},ye.offsets.arrow[Ne]=Be,ye.offsets.arrow[Te]='',ye},element:'[x-arrow]'},flip:{order:600,enabled:!0,function:function(ye,we){if(A(ye.instance.modifiers,'inner'))return ye;if(ye.flipped&&ye.placement===ye.originalPlacement)return ye;var xe=O(ye.instance.popper,ye.instance.reference,we.padding,we.boundariesElement),ve=ye.placement.split('-')[0],Oe=H(ve),Ee=ye.placement.split('-')[1]||'',Se=[];return Se='flip'===we.behavior?[ve,Oe]:we.behavior,Se.forEach(function(Le,Ne){if(ve!==Le||Se.length===Ne+1)return ye;ve=ye.placement.split('-')[0],Oe=H(ve);var Te=h(ye.offsets.popper),Pe=ye.offsets.reference,We=_Mathfloor,He='left'===ve&&We(Te.right)>We(Pe.left)||'right'===ve&&We(Te.left)We(Pe.top)||'bottom'===ve&&We(Te.top)We(xe.right),De=We(Te.top)We(xe.bottom),ke='left'===ve&&Be||'right'===ve&&Ce||'top'===ve&&De||'bottom'===ve&&Me,Ae=-1!==['top','bottom'].indexOf(ve),Re=!!we.flipVariations&&(Ae&&'start'===Ee&&Be||Ae&&'end'===Ee&&Ce||!Ae&&'start'===Ee&&De||!Ae&&'end'===Ee&&Me);(He||ke||Re)&&(ye.flipped=!0,(He||ke)&&(ve=Se[Ne+1]),Re&&(Ee=X(Ee)),ye.placement=ve+(Ee?'-'+Ee:''),ye.offsets.popper=B(ye.instance.state.position,ye.instance.popper,ye.offsets.reference,ye.placement),ye=U(ye.instance.modifiers,ye,'flip'))}),ye},behavior:'flip',padding:5,boundariesElement:'viewport'},inner:{order:700,enabled:!1,function:function(ye){var we=ye.placement,xe=we.split('-')[0],ve=h(ye.offsets.popper),Oe=h(ye.offsets.reference),Ee=-1!==['left','right'].indexOf(xe),Se=-1===['top','left'].indexOf(xe);return ve[Ee?'left':'top']=Oe[we]-(Se?ve[Ee?'width':'height']:0),ye.placement=H(we),ye.offsets.popper=h(ve),ye}},hide:{order:800,enabled:!0,function:function(ye){if(!R(ye.instance.modifiers,'hide','preventOverflow'))return console.warn('WARNING: preventOverflow modifier is required by hide modifier in order to work, be sure to include it before hide!'),ye;var we=ye.offsets.reference,xe=N(ye.instance.modifiers,function(ve){return'preventOverflow'===ve.name}).boundaries;if(we.bottomxe.right||we.top>xe.bottom||we.right {
const Default = {
placement : 'bottom',
- offset : {}
+ offset : 0
}
const DefaultType = {
@@ -143,7 +145,7 @@ const Dropdown = (($) => {
placement : context._config.placement,
modifiers : {
offset : {
- offset : this.config.offset
+ offset : context._config.offset
}
}
})
@@ -204,7 +206,7 @@ const Dropdown = (($) => {
_getMenuElement() {
if (!this._menu) {
- let parent = Dropdown._getParentFromElement(this._element)
+ const parent = Dropdown._getParentFromElement(this._element)
this._menu = $(parent).find(Selector.MENU)[0]
}
return this._menu
@@ -215,7 +217,7 @@ const Dropdown = (($) => {
static _jQueryInterface(config) {
return this.each(function () {
let data = $(this).data(DATA_KEY)
- let _config = typeof config === 'object' ? config : null
+ const _config = typeof config === 'object' ? config : null
if (!data) {
data = new Dropdown(this, _config)
@@ -240,7 +242,7 @@ const Dropdown = (($) => {
const toggles = $.makeArray($(Selector.DATA_TOGGLE))
for (let i = 0; i < toggles.length; i++) {
const parent = Dropdown._getParentFromElement(toggles[i])
- let context = $(toggles[i]).data(DATA_KEY)
+ const context = $(toggles[i]).data(DATA_KEY)
const relatedTarget = {
relatedTarget : toggles[i]
}
@@ -249,7 +251,7 @@ const Dropdown = (($) => {
continue
}
- let dropdownMenu = context._menu
+ const dropdownMenu = context._menu
if (!$(parent).hasClass(ClassName.SHOW)) {
continue
}
diff --git a/js/src/tooltip.js b/js/src/tooltip.js
index 5f5e3d7bc..9995cede7 100644
--- a/js/src/tooltip.js
+++ b/js/src/tooltip.js
@@ -47,7 +47,7 @@ const Tooltip = (($) => {
html : false,
selector : false,
placement : 'top',
- offset : {},
+ offset : 0,
container : false
}
diff --git a/js/tests/unit/dropdown.js b/js/tests/unit/dropdown.js
index a15eb5245..1dd675b0b 100644
--- a/js/tests/unit/dropdown.js
+++ b/js/tests/unit/dropdown.js
@@ -275,20 +275,20 @@ $(function () {
$first.parent('.dropdown')
.on('shown.bs.dropdown', function () {
assert.strictEqual($first.parents('.show').length, 1, '"show" class added on click')
- assert.strictEqual($('#qunit-fixture .show').length, 1, 'only one dropdown is shown')
+ assert.strictEqual($('#qunit-fixture .dropdown-menu.show').length, 1, 'only one dropdown is shown')
$(document.body).trigger('click')
}).on('hidden.bs.dropdown', function () {
- assert.strictEqual($('#qunit-fixture .show').length, 0, '"show" class removed')
+ assert.strictEqual($('#qunit-fixture .dropdown-menu.show').length, 0, '"show" class removed')
$last.trigger('click')
})
$last.parent('.btn-group')
.on('shown.bs.dropdown', function () {
assert.strictEqual($last.parent('.show').length, 1, '"show" class added on click')
- assert.strictEqual($('#qunit-fixture .show').length, 1, 'only one dropdown is shown')
+ assert.strictEqual($('#qunit-fixture .dropdown-menu.show').length, 1, 'only one dropdown is shown')
$(document.body).trigger('click')
}).on('hidden.bs.dropdown', function () {
- assert.strictEqual($('#qunit-fixture .show').length, 0, '"show" class removed')
+ assert.strictEqual($('#qunit-fixture .dropdown-menu.show').length, 0, '"show" class removed')
done()
})
$first.trigger('click')
@@ -321,24 +321,24 @@ $(function () {
$first.parent('.dropdown')
.on('shown.bs.dropdown', function () {
assert.strictEqual($first.parents('.show').length, 1, '"show" class added on click')
- assert.strictEqual($('#qunit-fixture .show').length, 1, 'only one dropdown is shown')
+ assert.strictEqual($('#qunit-fixture .dropdown-menu.show').length, 1, 'only one dropdown is shown')
var e = $.Event('keyup')
e.which = 9 // Tab
$(document.body).trigger(e)
}).on('hidden.bs.dropdown', function () {
- assert.strictEqual($('#qunit-fixture .show').length, 0, '"show" class removed')
+ assert.strictEqual($('#qunit-fixture .dropdown-menu.show').length, 0, '"show" class removed')
$last.trigger('click')
})
$last.parent('.btn-group')
.on('shown.bs.dropdown', function () {
assert.strictEqual($last.parent('.show').length, 1, '"show" class added on click')
- assert.strictEqual($('#qunit-fixture .show').length, 1, 'only one dropdown is shown')
+ assert.strictEqual($('#qunit-fixture .dropdown-menu.show').length, 1, 'only one dropdown is shown')
var e = $.Event('keyup')
e.which = 9 // Tab
$(document.body).trigger(e)
}).on('hidden.bs.dropdown', function () {
- assert.strictEqual($('#qunit-fixture .show').length, 0, '"show" class removed')
+ assert.strictEqual($('#qunit-fixture .dropdown-menu.show').length, 0, '"show" class removed')
done()
})
$first.trigger('click')
@@ -552,7 +552,7 @@ $(function () {
})
QUnit.test('should not close the dropdown if the user clicks on a text field', function (assert) {
- assert.expect(1)
+ assert.expect(2)
var done = assert.async()
var dropdownHTML = ''
+ '
Dropdown '
@@ -565,23 +565,23 @@ $(function () {
.find('[data-toggle="dropdown"]')
.bootstrapDropdown()
+ var $textfield = $('#textField')
+ $textfield.on('click', function () {
+ assert.ok($dropdown.parent('.dropdown').hasClass('show'), 'dropdown menu is shown')
+ done()
+ })
+
$dropdown
.parent('.dropdown')
.on('shown.bs.dropdown', function () {
- $('#textField').trigger('click')
- assert.ok($dropdown.parent('.dropdown').hasClass('show'), 'dropdown menu is shown')
- setTimeout(function () {
- done()
- }, 300)
- })
- .on('hidden.bs.dropdown', function () {
assert.ok($dropdown.parent('.dropdown').hasClass('show'), 'dropdown menu is shown')
+ $textfield.trigger($.Event('click'))
})
$dropdown.trigger('click')
})
QUnit.test('should not close the dropdown if the user clicks on a textarea', function (assert) {
- assert.expect(1)
+ assert.expect(2)
var done = assert.async()
var dropdownHTML = '
'
+ '
Dropdown '
@@ -594,17 +594,17 @@ $(function () {
.find('[data-toggle="dropdown"]')
.bootstrapDropdown()
+ var $textarea = $('#textArea')
+ $textarea.on('click', function () {
+ assert.ok($dropdown.parent('.dropdown').hasClass('show'), 'dropdown menu is shown')
+ done()
+ })
+
$dropdown
.parent('.dropdown')
.on('shown.bs.dropdown', function () {
- $('#textArea').trigger('click')
- assert.ok($dropdown.parent('.dropdown').hasClass('show'), 'dropdown menu is shown')
- setTimeout(function () {
- done()
- }, 300)
- })
- .on('hidden.bs.dropdown', function () {
assert.ok($dropdown.parent('.dropdown').hasClass('show'), 'dropdown menu is shown')
+ $textarea.trigger($.Event('click'))
})
$dropdown.trigger('click')
})
diff --git a/js/tests/unit/popover.js b/js/tests/unit/popover.js
index eaa9fa0c0..a7762bfab 100644
--- a/js/tests/unit/popover.js
+++ b/js/tests/unit/popover.js
@@ -47,13 +47,18 @@ $(function () {
QUnit.test('should render popover element', function (assert) {
assert.expect(2)
- var $popover = $('
@mdo ')
+ var done = assert.async()
+ $('
@mdo ')
.appendTo('#qunit-fixture')
+ .on('shown.bs.popover', function () {
+ assert.notEqual($('.popover').length, 0, 'popover was inserted')
+ $(this).bootstrapPopover('hide')
+ })
+ .on('hidden.bs.popover', function () {
+ assert.strictEqual($('.popover').length, 0, 'popover removed')
+ done()
+ })
.bootstrapPopover('show')
-
- assert.notEqual($('.popover').length, 0, 'popover was inserted')
- $popover.bootstrapPopover('hide')
- assert.strictEqual($('.popover').length, 0, 'popover removed')
})
QUnit.test('should store popover instance in popover data object', function (assert) {
diff --git a/js/tests/unit/tooltip.js b/js/tests/unit/tooltip.js
index 0bb90156b..f47a97e30 100644
--- a/js/tests/unit/tooltip.js
+++ b/js/tests/unit/tooltip.js
@@ -383,8 +383,6 @@ $(function () {
var $tooltip = $($(this).data('bs.tooltip').tip)
assert.ok($tooltip.hasClass('bs-tooltip-right'))
assert.ok($tooltip.attr('style') === undefined)
- $(this).bootstrapTooltip('hide')
- $container.remove()
$styles.remove()
done()
})
@@ -475,32 +473,19 @@ $(function () {
})
.appendTo('#qunit-fixture')
- $('#qunit-fixture').css({
- position : 'relative',
- top : '0px',
- left : '0px'
- })
-
- var $trigger = $container
+ $container
.find('a')
.css('margin-top', 200)
.bootstrapTooltip({
placement: 'top',
animate: false
})
- .bootstrapTooltip('show')
-
- var $tooltip = $($trigger.data('bs.tooltip').tip)
-
- setTimeout(function () {
- assert.ok(Math.round($tooltip.offset().top + $tooltip.outerHeight()) <= Math.round($trigger.offset().top))
- $('#qunit-fixture').css({
- position : 'absolute',
- top : '-10000px',
- left : '-10000px'
+ .on('shown.bs.tooltip', function () {
+ var $tooltip = $($(this).data('bs.tooltip').tip)
+ assert.ok(Math.round($tooltip.offset().top + $tooltip.outerHeight()) >= Math.round($(this).offset().top))
+ done()
})
- done()
- }, 0)
+ .bootstrapTooltip('show')
})
QUnit.test('should show tooltip if leave event hasn\'t occurred before delay expires', function (assert) {
@@ -702,43 +687,6 @@ $(function () {
assert.strictEqual(currentUid, $('#tt-content').text())
})
- QUnit.test('should correctly position tooltips on transformed elements', function (assert) {
- var styleProps = document.documentElement.style
- if (!('transform' in styleProps) && !('webkitTransform' in styleProps) && !('msTransform' in styleProps)) {
- assert.expect(0)
- return
- }
- assert.expect(2)
-
- var done = assert.async()
-
- var styles = ''
- var $styles = $(styles).appendTo('head')
-
- var $element = $('
').appendTo('#qunit-fixture')
-
- $element
- .on('shown.bs.tooltip', function () {
- var offset = $('.tooltip').offset()
- $styles.remove()
- assert.ok(Math.abs(offset.left - 88) <= 1, 'tooltip has correct horizontal location')
- assert.ok(Math.abs(offset.top - 126) <= 1, 'tooltip has correct vertical location')
- $element.bootstrapTooltip('hide')
- done()
- })
- .bootstrapTooltip({
- trigger: 'manual'
- })
-
- $element.bootstrapTooltip('show')
- })
-
QUnit.test('should do nothing when an attempt is made to hide an uninitialized tooltip', function (assert) {
assert.expect(1)
diff --git a/js/tests/visual/tooltip.html b/js/tests/visual/tooltip.html
index 9fbd196b6..c45926eba 100644
--- a/js/tests/visual/tooltip.html
+++ b/js/tests/visual/tooltip.html
@@ -5,6 +5,19 @@
Tooltip
+
@@ -44,6 +58,10 @@
diff --git a/scss/_dropdown.scss b/scss/_dropdown.scss
index 2c57f0209..4f0e6fcce 100644
--- a/scss/_dropdown.scss
+++ b/scss/_dropdown.scss
@@ -138,4 +138,4 @@
//
// Just add .dropup after the standard .dropdown class and you're set.
-.dropup {}
+//.dropup {}
From 53ee455bc735af9fc54de586ed4d23ac56b69ab8 Mon Sep 17 00:00:00 2001
From: Johann-S
Date: Mon, 17 Apr 2017 14:26:40 +0200
Subject: [PATCH 10/54] Handle dropup for Dropdown
---
js/src/dropdown.js | 11 +++++++++--
js/tests/unit/tooltip.js | 9 +++++++--
js/tests/visual/dropdown.html | 13 +++++++++++++
scss/_dropdown.scss | 8 ++------
4 files changed, 31 insertions(+), 10 deletions(-)
diff --git a/js/src/dropdown.js b/js/src/dropdown.js
index ce25e9671..33171cf20 100644
--- a/js/src/dropdown.js
+++ b/js/src/dropdown.js
@@ -64,8 +64,13 @@ const Dropdown = (($) => {
VISIBLE_ITEMS : '.dropdown-menu .dropdown-item:not(.disabled)'
}
+ const AttachmentMap = {
+ TOP : 'top',
+ BOTTOM : 'bottom'
+ }
+
const Default = {
- placement : 'bottom',
+ placement : AttachmentMap.BOTTOM,
offset : 0
}
@@ -141,8 +146,10 @@ const Dropdown = (($) => {
return false
}
+ // Handle dropup
+ const dropdownPlacement = $(this).parent().hasClass('dropup') ? AttachmentMap.TOP : context._config.placement
this._popper = new Popper(this, context._menu, {
- placement : context._config.placement,
+ placement : dropdownPlacement,
modifiers : {
offset : {
offset : context._config.offset
diff --git a/js/tests/unit/tooltip.js b/js/tests/unit/tooltip.js
index f47a97e30..c0cafefe5 100644
--- a/js/tests/unit/tooltip.js
+++ b/js/tests/unit/tooltip.js
@@ -456,7 +456,7 @@ $(function () {
assert.expect(1)
var done = assert.async()
- var containerHTML = ''
+ var containerHTML = '
'
+ '
'
+ 'Hover me '
+ '
'
@@ -482,7 +482,12 @@ $(function () {
})
.on('shown.bs.tooltip', function () {
var $tooltip = $($(this).data('bs.tooltip').tip)
- assert.ok(Math.round($tooltip.offset().top + $tooltip.outerHeight()) >= Math.round($(this).offset().top))
+ if (/iPhone|iPad|iPod/.test(navigator.userAgent)) {
+ assert.ok(Math.round($tooltip.offset().top + $tooltip.outerHeight()) <= Math.round($(this).offset().top))
+ }
+ else {
+ assert.ok(Math.round($tooltip.offset().top + $tooltip.outerHeight()) >= Math.round($(this).offset().top))
+ }
done()
})
.bootstrapTooltip('show')
diff --git a/js/tests/visual/dropdown.html b/js/tests/visual/dropdown.html
index d96b367e9..45c5d5172 100644
--- a/js/tests/visual/dropdown.html
+++ b/js/tests/visual/dropdown.html
@@ -58,6 +58,19 @@
+
+
+
+ Dropup
+
+ Toggle Dropdown
+
+
+
diff --git a/scss/_dropdown.scss b/scss/_dropdown.scss
index 4f0e6fcce..7826e0212 100644
--- a/scss/_dropdown.scss
+++ b/scss/_dropdown.scss
@@ -23,6 +23,8 @@
}
}
+// Allow for dropdowns to go bottom up (aka, dropup-menu)
+// Just add .dropup after the standard .dropdown class and you're set.
.dropup {
.dropdown-toggle {
&::after {
@@ -133,9 +135,3 @@
color: $dropdown-header-color;
white-space: nowrap; // as with > li > a
}
-
-// Allow for dropdowns to go bottom up (aka, dropup-menu)
-//
-// Just add .dropup after the standard .dropdown class and you're set.
-
-//.dropup {}
From c4b4d534a4e935db72a37b54f0f41f4dba4c83de Mon Sep 17 00:00:00 2001
From: Johann-S
Date: Mon, 17 Apr 2017 15:20:53 +0200
Subject: [PATCH 11/54] Remove Tether from package.json + Update Popper
---
docs/assets/js/vendor/popper.min.js | 2 +-
package.json | 2 +-
2 files changed, 2 insertions(+), 2 deletions(-)
diff --git a/docs/assets/js/vendor/popper.min.js b/docs/assets/js/vendor/popper.min.js
index fffdb1d1b..529fd2108 100644
--- a/docs/assets/js/vendor/popper.min.js
+++ b/docs/assets/js/vendor/popper.min.js
@@ -1,3 +1,3 @@
-var _Mathfloor=Math.floor,_Mathmin=Math.min,_Mathround=Math.round,_Mathmax=Math.max,_typeof='function'==typeof Symbol&&'symbol'==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&'function'==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?'symbol':typeof e};(function(e,t){'object'===('undefined'==typeof exports?'undefined':_typeof(exports))&&'undefined'!=typeof module?module.exports=t():'function'==typeof define&&define.amd?define(t):e.Popper=t()})(this,function(){'use strict';function e(ye,we){if(1!==ye.nodeType)return[];var xe=window.getComputedStyle(ye,null);return we?xe[we]:xe}function t(ye){return'HTML'===ye.nodeName?ye:ye.parentNode||ye.host}function o(ye){if(!ye||-1!==['HTML','BODY','#document'].indexOf(ye.nodeName))return window.document.body;var we=e(ye),xe=we.overflow,ve=we.overflowX,Oe=we.overflowY;return /(auto|scroll)/.test(xe+Oe+ve)?ye:o(t(ye))}function r(ye){return'HTML'===ye.nodeName||ye.firstElementChild.offsetParent===ye}function s(ye){return null===ye.parentNode?ye:s(ye.parentNode)}function p(ye){var we=ye&&ye.offsetParent,xe=we&&we.nodeName;return xe&&'BODY'!==xe&&'HTML'!==xe?we:window.document.documentElement}function f(ye,we){if(!ye||!ye.nodeType||!we||!we.nodeType)return window.document.documentElement;var xe=ye.compareDocumentPosition(we)&Node.DOCUMENT_POSITION_FOLLOWING,ve=xe?ye:we,Oe=xe?we:ye,Ee=document.createRange();Ee.setStart(ve,0),Ee.setEnd(Oe,0);var Se=Ee.commonAncestorContainer;if(ye!==Se&&we!==Se)return r(Se)?Se:p(Se);var Le=s(ye);return Le.host?f(Le.host,we):f(ye,s(we).host)}function d(ye){var we=1ve[Ne]&&!we.escapeWithReference&&(Pe=_Mathmin(Ee[Te],ve[Ne]-('right'===Ne?Ee.width:Ee.height))),ne({},Te,Pe)}};return Oe.forEach(function(Le){var Ne=-1===['left','top'].indexOf(Le)?'secondary':'primary';Ee=re({},Ee,Se[Ne](Le))}),ye.offsets.popper=Ee,ye},priority:['left','right','top','bottom'],padding:5,boundariesElement:'scrollParent'},keepTogether:{order:400,enabled:!0,function:function(ye){var we=h(ye.offsets.popper),xe=ye.offsets.reference,ve=ye.placement.split('-')[0],Oe=_Mathfloor,Ee=-1!==['top','bottom'].indexOf(ve),Se=Ee?'right':'bottom',Le=Ee?'left':'top',Ne=Ee?'width':'height';return we[Se]Oe(xe[Se])&&(ye.offsets.popper[Le]=Oe(xe[Se])),ye}},arrow:{order:500,enabled:!0,function:function(ye,we){if(!R(ye.instance.modifiers,'arrow','keepTogether'))return console.warn('WARNING: `keepTogether` modifier is required by arrow modifier in order to work, be sure to include it before `arrow`!'),ye;var xe=we.element;if('string'==typeof xe){if(xe=ye.instance.popper.querySelector(xe),!xe)return ye;}else if(!ye.instance.popper.contains(xe))return console.warn('WARNING: `arrow.element` must be child of its popper element!'),ye;var ve=ye.placement.split('-')[0],Oe=h(ye.offsets.popper),Ee=ye.offsets.reference,Se=-1!==['left','right'].indexOf(ve),Le=Se?'height':'width',Ne=Se?'top':'left',Te=Se?'left':'top',Pe=Se?'bottom':'right',We=W(xe)[Le];Ee[Pe]-WeOe[Pe]&&(ye.offsets.popper[Ne]+=Ee[Ne]+We-Oe[Pe]);var He=Ee[Ne]+Ee[Le]/2-We/2,Be=He-h(ye.offsets.popper)[Ne];return Be=_Mathmax(_Mathmin(Oe[Le]-We,Be),0),ye.arrowElement=xe,ye.offsets.arrow={},ye.offsets.arrow[Ne]=Be,ye.offsets.arrow[Te]='',ye},element:'[x-arrow]'},flip:{order:600,enabled:!0,function:function(ye,we){if(A(ye.instance.modifiers,'inner'))return ye;if(ye.flipped&&ye.placement===ye.originalPlacement)return ye;var xe=O(ye.instance.popper,ye.instance.reference,we.padding,we.boundariesElement),ve=ye.placement.split('-')[0],Oe=H(ve),Ee=ye.placement.split('-')[1]||'',Se=[];return Se='flip'===we.behavior?[ve,Oe]:we.behavior,Se.forEach(function(Le,Ne){if(ve!==Le||Se.length===Ne+1)return ye;ve=ye.placement.split('-')[0],Oe=H(ve);var Te=h(ye.offsets.popper),Pe=ye.offsets.reference,We=_Mathfloor,He='left'===ve&&We(Te.right)>We(Pe.left)||'right'===ve&&We(Te.left)We(Pe.top)||'bottom'===ve&&We(Te.top)We(xe.right),De=We(Te.top)We(xe.bottom),ke='left'===ve&&Be||'right'===ve&&Ce||'top'===ve&&De||'bottom'===ve&&Me,Ae=-1!==['top','bottom'].indexOf(ve),Re=!!we.flipVariations&&(Ae&&'start'===Ee&&Be||Ae&&'end'===Ee&&Ce||!Ae&&'start'===Ee&&De||!Ae&&'end'===Ee&&Me);(He||ke||Re)&&(ye.flipped=!0,(He||ke)&&(ve=Se[Ne+1]),Re&&(Ee=X(Ee)),ye.placement=ve+(Ee?'-'+Ee:''),ye.offsets.popper=B(ye.instance.state.position,ye.instance.popper,ye.offsets.reference,ye.placement),ye=U(ye.instance.modifiers,ye,'flip'))}),ye},behavior:'flip',padding:5,boundariesElement:'viewport'},inner:{order:700,enabled:!1,function:function(ye){var we=ye.placement,xe=we.split('-')[0],ve=h(ye.offsets.popper),Oe=h(ye.offsets.reference),Ee=-1!==['left','right'].indexOf(xe),Se=-1===['top','left'].indexOf(xe);return ve[Ee?'left':'top']=Oe[we]-(Se?ve[Ee?'width':'height']:0),ye.placement=H(we),ye.offsets.popper=h(ve),ye}},hide:{order:800,enabled:!0,function:function(ye){if(!R(ye.instance.modifiers,'hide','preventOverflow'))return console.warn('WARNING: preventOverflow modifier is required by hide modifier in order to work, be sure to include it before hide!'),ye;var we=ye.offsets.reference,xe=N(ye.instance.modifiers,function(ve){return'preventOverflow'===ve.name}).boundaries;if(we.bottomxe.right||we.top>xe.bottom||we.rightza[Ea]&&!xa.escapeWithReference&&(Ga=_Mathmin(Ba[Fa],za[Ea]-('right'===Ea?Ba.width:Ba.height))),la({},Fa,Ga)}};return Aa.forEach(function(Da){var Ea=-1===['left','top'].indexOf(Da)?'secondary':'primary';Ba=ma({},Ba,Ca[Ea](Da))}),wa.offsets.popper=Ba,wa},priority:['left','right','top','bottom'],padding:5,boundariesElement:'scrollParent'},keepTogether:{order:400,enabled:!0,function:function(wa){var xa=u(wa.offsets.popper),ya=wa.offsets.reference,za=wa.placement.split('-')[0],Aa=_Mathfloor,Ba=-1!==['top','bottom'].indexOf(za),Ca=Ba?'right':'bottom',Da=Ba?'left':'top',Ea=Ba?'width':'height';return xa[Ca]Aa(ya[Ca])&&(wa.offsets.popper[Da]=Aa(ya[Ca])),wa}},arrow:{order:500,enabled:!0,function:function(wa,xa){if(!S(wa.instance.modifiers,'arrow','keepTogether'))return console.warn('WARNING: `keepTogether` modifier is required by arrow modifier in order to work, be sure to include it before `arrow`!'),wa;var ya=xa.element;if('string'==typeof ya){if(ya=wa.instance.popper.querySelector(ya),!ya)return wa;}else if(!wa.instance.popper.contains(ya))return console.warn('WARNING: `arrow.element` must be child of its popper element!'),wa;var za=wa.placement.split('-')[0],Aa=u(wa.offsets.popper),Ba=wa.offsets.reference,Ca=-1!==['left','right'].indexOf(za),Da=Ca?'height':'width',Ea=Ca?'top':'left',Fa=Ca?'left':'top',Ga=Ca?'bottom':'right',Ha=A(ya)[Da];Ba[Ga]-HaAa[Ga]&&(wa.offsets.popper[Ea]+=Ba[Ea]+Ha-Aa[Ga]);var Ia=Ba[Ea]+Ba[Da]/2-Ha/2,Ja=Ia-u(wa.offsets.popper)[Ea];return Ja=_Mathmax(_Mathmin(Aa[Da]-Ha,Ja),0),wa.arrowElement=ya,wa.offsets.arrow={},wa.offsets.arrow[Ea]=Ja,wa.offsets.arrow[Fa]='',wa},element:'[x-arrow]'},flip:{order:600,enabled:!0,function:function(wa,xa){if(K(wa.instance.modifiers,'inner'))return wa;if(wa.flipped&&wa.placement===wa.originalPlacement)return wa;var ya=N(wa.instance.popper,wa.instance.reference,xa.padding,xa.boundariesElement),za=wa.placement.split('-')[0],Aa=B(za),Ba=wa.placement.split('-')[1]||'',Ca=[];switch(xa.behavior){case sa.FLIP:Ca=[za,Aa];break;case sa.CLOCKWISE:Ca=V(za);break;case sa.COUNTERCLOCKWISE:Ca=V(za,!0);break;default:Ca=xa.behavior;}return Ca.forEach(function(Da,Ea){if(za!==Da||Ca.length===Ea+1)return wa;za=wa.placement.split('-')[0],Aa=B(za);var Fa=u(wa.offsets.popper),Ga=wa.offsets.reference,Ha=_Mathfloor,Ia='left'===za&&Ha(Fa.right)>Ha(Ga.left)||'right'===za&&Ha(Fa.left)Ha(Ga.top)||'bottom'===za&&Ha(Fa.top)Ha(ya.right),La=Ha(Fa.top)Ha(ya.bottom),Na='left'===za&&Ja||'right'===za&&Ka||'top'===za&&La||'bottom'===za&&Ma,Oa=-1!==['top','bottom'].indexOf(za),Pa=!!xa.flipVariations&&(Oa&&'start'===Ba&&Ja||Oa&&'end'===Ba&&Ka||!Oa&&'start'===Ba&&La||!Oa&&'end'===Ba&&Ma);(Ia||Na||Pa)&&(wa.flipped=!0,(Ia||Na)&&(za=Ca[Ea+1]),Pa&&(Ba=U(Ba)),wa.placement=za+(Ba?'-'+Ba:''),wa.offsets.popper=C(wa.instance.state.position,wa.instance.popper,wa.offsets.reference,wa.placement),wa=J(wa.instance.modifiers,wa,'flip'))}),wa},behavior:'flip',padding:5,boundariesElement:'viewport'},inner:{order:700,enabled:!1,function:function(wa){var xa=wa.placement,ya=xa.split('-')[0],za=u(wa.offsets.popper),Aa=u(wa.offsets.reference),Ba=-1!==['left','right'].indexOf(ya),Ca=-1===['top','left'].indexOf(ya);return za[Ba?'left':'top']=Aa[xa]-(Ca?za[Ba?'width':'height']:0),wa.placement=B(xa),wa.offsets.popper=u(za),wa}},hide:{order:800,enabled:!0,function:function(wa){if(!S(wa.instance.modifiers,'hide','preventOverflow'))return console.warn('WARNING: preventOverflow modifier is required by hide modifier in order to work, be sure to include it before hide!'),wa;var xa=wa.offsets.reference,ya=H(wa.instance.modifiers,function(za){return'preventOverflow'===za.name}).boundaries;if(xa.bottomya.right||xa.top>ya.bottom||xa.right=1.9.1",
- "tether": "^1.4.0"
+ "Popper": "^1.8.1"
},
"devDependencies": {
"autoprefixer": "^6.7.7",
From d5fabf8de50710c5a09ecd91f4b9e961e67d7937 Mon Sep 17 00:00:00 2001
From: Johann-S
Date: Tue, 18 Apr 2017 14:02:24 +0200
Subject: [PATCH 12/54] Remove totaly Tether from documentation + dependencies
---
_config.yml | 4 +-
bower.json | 2 +-
build/npm-shrinkwrap.json | 20 +++++++--
docs/_includes/footer.html | 2 +-
docs/assets/js/vendor/popper.min.js | 4 +-
docs/assets/js/vendor/popper.min.js.map | Bin 0 -> 108917 bytes
docs/components/dropdowns.md | 38 +++++++++++++++++-
docs/components/popovers.md | 14 ++-----
docs/components/tooltips.md | 14 ++-----
docs/examples/album/index.html | 2 +-
docs/examples/blog/index.html | 2 +-
docs/examples/carousel/index.html | 2 +-
docs/examples/cover/index.html | 2 +-
docs/examples/dashboard/index.html | 2 +-
docs/examples/jumbotron/index.html | 2 +-
docs/examples/justified-nav/index.html | 2 +-
docs/examples/navbar-top-fixed/index.html | 2 +-
docs/examples/navbar-top/index.html | 2 +-
docs/examples/navbars/index.html | 2 +-
docs/examples/offcanvas/index.html | 2 +-
docs/examples/starter-template/index.html | 2 +-
docs/examples/sticky-footer-navbar/index.html | 2 +-
docs/examples/tooltip-viewport/index.html | 3 +-
docs/getting-started/introduction.md | 8 ++--
docs/index.html | 2 +-
js/src/dropdown.js | 6 +--
js/src/tooltip.js | 4 +-
package.json | 2 +-
28 files changed, 91 insertions(+), 58 deletions(-)
create mode 100644 docs/assets/js/vendor/popper.min.js.map
diff --git a/_config.yml b/_config.yml
index 6d62f17e5..6389e4977 100644
--- a/_config.yml
+++ b/_config.yml
@@ -51,5 +51,5 @@ cdn:
js_hash: "sha384-vBWWzlZJ8ea9aCX4pEW3rVHjgjt7zpkNpZk+02D9phzyeVkE+jo0ieGizqPLForn"
jquery: https://code.jquery.com/jquery-3.2.1.slim.min.js
jquery_hash: "sha384-KJ3o2DKtIkvYIK3UENzmM7KCkRr/rE9/Qpg6aAZGJwFDMVNA/GpGFF93hXpG5KkN"
- tether: https://cdnjs.cloudflare.com/ajax/libs/tether/1.4.0/js/tether.min.js
- tether_hash: "sha384-DztdAPBWPRXSA/3eYEEUWrWCy7G5KFbe8fFjk5JAIxUYHKkDx6Qin1DkWx51bBrb"
+ popper: https://cdnjs.cloudflare.com/ajax/libs/popper.js/1.8.1/popper.es5.min.js
+ popper_hash: "sha256-Gr5YOrP8Q27ZkmCuWjLEzY633yb1qY2JJp3yvJFcF0w="
diff --git a/bower.json b/bower.json
index cf339b7f1..d88e8ba90 100644
--- a/bower.json
+++ b/bower.json
@@ -31,6 +31,6 @@
],
"dependencies": {
"jquery": ">=1.9.1",
- "tether": "^1.4.0"
+ "popper.js": "^1.8.1"
}
}
diff --git a/build/npm-shrinkwrap.json b/build/npm-shrinkwrap.json
index 347d92658..35aade058 100644
--- a/build/npm-shrinkwrap.json
+++ b/build/npm-shrinkwrap.json
@@ -3809,10 +3809,22 @@
"resolved": "https://registry.npmjs.org/tar/-/tar-2.2.1.tgz",
"dev": true
},
- "tether": {
- "version": "1.4.0",
- "from": "tether@>=1.4.0 <2.0.0",
- "resolved": "https://registry.npmjs.org/tether/-/tether-1.4.0.tgz"
+ "tar-stream": {
+ "version": "1.5.2",
+ "from": "tar-stream@>=1.5.0 <2.0.0",
+ "resolved": "https://registry.npmjs.org/tar-stream/-/tar-stream-1.5.2.tgz",
+ "dev": true
+ },
+ "temporary": {
+ "version": "0.0.8",
+ "from": "temporary@>=0.0.8 <0.0.9",
+ "resolved": "https://registry.npmjs.org/temporary/-/temporary-0.0.8.tgz",
+ "dev": true
+ },
+ "popper.js": {
+ "version": "1.8.2",
+ "from": "popper.js@>=1.8.0 <2.0.0",
+ "resolved": "https://registry.npmjs.org/popper.js/-/popper.js-1.8.2.tgz"
},
"text-table": {
"version": "0.2.0",
diff --git a/docs/_includes/footer.html b/docs/_includes/footer.html
index b8603f0d7..2c17fb925 100644
--- a/docs/_includes/footer.html
+++ b/docs/_includes/footer.html
@@ -14,7 +14,7 @@
-
+
{% if site.github %}
diff --git a/docs/assets/js/vendor/popper.min.js b/docs/assets/js/vendor/popper.min.js
index 529fd2108..5bbe8bbce 100644
--- a/docs/assets/js/vendor/popper.min.js
+++ b/docs/assets/js/vendor/popper.min.js
@@ -1,3 +1,3 @@
-var _Mathfloor=Math.floor,_Mathmin=Math.min,_Mathround=Math.round,_Mathmax=Math.max;(function(c,d){'object'==typeof exports&&'undefined'!=typeof module?module.exports=d():'function'==typeof define&&define.amd?define(d):c.Popper=d()})(this,function(){'use strict';function e(wa){return''!==wa&&!isNaN(parseFloat(wa))&&isFinite(wa)}function f(wa,xa){Object.keys(xa).forEach(function(ya){var za='';-1!==['width','height','top','right','bottom','left'].indexOf(ya)&&e(xa[ya])&&(za='px'),wa.style[ya]=xa[ya]+za})}function g(wa){for(var xa=[!1,'ms','webkit','moz','o'],ya=wa.charAt(0).toUpperCase()+wa.slice(1),za=0;zaza[Ea]&&!xa.escapeWithReference&&(Ga=_Mathmin(Ba[Fa],za[Ea]-('right'===Ea?Ba.width:Ba.height))),la({},Fa,Ga)}};return Aa.forEach(function(Da){var Ea=-1===['left','top'].indexOf(Da)?'secondary':'primary';Ba=ma({},Ba,Ca[Ea](Da))}),wa.offsets.popper=Ba,wa},priority:['left','right','top','bottom'],padding:5,boundariesElement:'scrollParent'},keepTogether:{order:400,enabled:!0,function:function(wa){var xa=u(wa.offsets.popper),ya=wa.offsets.reference,za=wa.placement.split('-')[0],Aa=_Mathfloor,Ba=-1!==['top','bottom'].indexOf(za),Ca=Ba?'right':'bottom',Da=Ba?'left':'top',Ea=Ba?'width':'height';return xa[Ca]Aa(ya[Ca])&&(wa.offsets.popper[Da]=Aa(ya[Ca])),wa}},arrow:{order:500,enabled:!0,function:function(wa,xa){if(!S(wa.instance.modifiers,'arrow','keepTogether'))return console.warn('WARNING: `keepTogether` modifier is required by arrow modifier in order to work, be sure to include it before `arrow`!'),wa;var ya=xa.element;if('string'==typeof ya){if(ya=wa.instance.popper.querySelector(ya),!ya)return wa;}else if(!wa.instance.popper.contains(ya))return console.warn('WARNING: `arrow.element` must be child of its popper element!'),wa;var za=wa.placement.split('-')[0],Aa=u(wa.offsets.popper),Ba=wa.offsets.reference,Ca=-1!==['left','right'].indexOf(za),Da=Ca?'height':'width',Ea=Ca?'top':'left',Fa=Ca?'left':'top',Ga=Ca?'bottom':'right',Ha=A(ya)[Da];Ba[Ga]-HaAa[Ga]&&(wa.offsets.popper[Ea]+=Ba[Ea]+Ha-Aa[Ga]);var Ia=Ba[Ea]+Ba[Da]/2-Ha/2,Ja=Ia-u(wa.offsets.popper)[Ea];return Ja=_Mathmax(_Mathmin(Aa[Da]-Ha,Ja),0),wa.arrowElement=ya,wa.offsets.arrow={},wa.offsets.arrow[Ea]=Ja,wa.offsets.arrow[Fa]='',wa},element:'[x-arrow]'},flip:{order:600,enabled:!0,function:function(wa,xa){if(K(wa.instance.modifiers,'inner'))return wa;if(wa.flipped&&wa.placement===wa.originalPlacement)return wa;var ya=N(wa.instance.popper,wa.instance.reference,xa.padding,xa.boundariesElement),za=wa.placement.split('-')[0],Aa=B(za),Ba=wa.placement.split('-')[1]||'',Ca=[];switch(xa.behavior){case sa.FLIP:Ca=[za,Aa];break;case sa.CLOCKWISE:Ca=V(za);break;case sa.COUNTERCLOCKWISE:Ca=V(za,!0);break;default:Ca=xa.behavior;}return Ca.forEach(function(Da,Ea){if(za!==Da||Ca.length===Ea+1)return wa;za=wa.placement.split('-')[0],Aa=B(za);var Fa=u(wa.offsets.popper),Ga=wa.offsets.reference,Ha=_Mathfloor,Ia='left'===za&&Ha(Fa.right)>Ha(Ga.left)||'right'===za&&Ha(Fa.left)Ha(Ga.top)||'bottom'===za&&Ha(Fa.top)Ha(ya.right),La=Ha(Fa.top)Ha(ya.bottom),Na='left'===za&&Ja||'right'===za&&Ka||'top'===za&&La||'bottom'===za&&Ma,Oa=-1!==['top','bottom'].indexOf(za),Pa=!!xa.flipVariations&&(Oa&&'start'===Ba&&Ja||Oa&&'end'===Ba&&Ka||!Oa&&'start'===Ba&&La||!Oa&&'end'===Ba&&Ma);(Ia||Na||Pa)&&(wa.flipped=!0,(Ia||Na)&&(za=Ca[Ea+1]),Pa&&(Ba=U(Ba)),wa.placement=za+(Ba?'-'+Ba:''),wa.offsets.popper=C(wa.instance.state.position,wa.instance.popper,wa.offsets.reference,wa.placement),wa=J(wa.instance.modifiers,wa,'flip'))}),wa},behavior:'flip',padding:5,boundariesElement:'viewport'},inner:{order:700,enabled:!1,function:function(wa){var xa=wa.placement,ya=xa.split('-')[0],za=u(wa.offsets.popper),Aa=u(wa.offsets.reference),Ba=-1!==['left','right'].indexOf(ya),Ca=-1===['top','left'].indexOf(ya);return za[Ba?'left':'top']=Aa[xa]-(Ca?za[Ba?'width':'height']:0),wa.placement=B(xa),wa.offsets.popper=u(za),wa}},hide:{order:800,enabled:!0,function:function(wa){if(!S(wa.instance.modifiers,'hide','preventOverflow'))return console.warn('WARNING: preventOverflow modifier is required by hide modifier in order to work, be sure to include it before hide!'),wa;var xa=wa.offsets.reference,ya=H(wa.instance.modifiers,function(za){return'preventOverflow'===za.name}).boundaries;if(xa.bottomya.right||xa.top>ya.bottom||xa.rightnativeHints.some((d)=>-1<(c||'').toString().indexOf(d));const isBrowser='undefined'!=typeof window,longerTimeoutBrowsers=['Edge','Trident','Firefox'];let timeoutDuration=0;for(let c=0;c{c(),d=!1});return g.observe(f,{attributes:!0}),()=>{d||(d=!0,f.setAttribute('x-index',e),++e)}}function taskDebounce(c){let d=!1;return()=>{d||(d=!0,setTimeout(()=>{d=!1,c()},timeoutDuration))}}const supportsNativeMutationObserver=isBrowser&&isNative(window.MutationObserver);var debounce=supportsNativeMutationObserver?microtaskDebounce:taskDebounce;function isNumeric(c){return''!==c&&!isNaN(parseFloat(c))&&isFinite(c)}function setStyles(c,d){Object.keys(d).forEach((e)=>{let f='';-1!==['width','height','top','right','bottom','left'].indexOf(e)&&isNumeric(d[e])&&(f='px'),c.style[e]=d[e]+f})}function getSupportedPropertyName(c){const d=[!1,'ms','webkit','moz','o'],e=c.charAt(0).toUpperCase()+c.slice(1);for(let f=0;fd[e])}function getPopperOffsets(c,d,e,f){f=f.split('-')[0];const g=getOuterSizes(d),h={position:c,width:g.width,height:g.height},j=-1!==['right','left'].indexOf(f),k=j?'top':'left',l=j?'left':'top',m=j?'height':'width',o=j?'width':'height';return h[k]=e[k]+e[m]/2-g[m]/2,h[l]=f===l?e[l]-g[o]:e[getOppositePlacement(l)],h}function isFunction(c){return c&&'[object Function]'==={}.toString.call(c)}function attachToScrollParents(c,d,e,f){const g='BODY'===c.nodeName,h=g?window:c;h.addEventListener(d,e,{passive:!0}),g||attachToScrollParents(getScrollParent(h.parentNode),d,e,f),f.push(h)}function setupEventListeners(c,d,e,f){e.updateBound=f,window.addEventListener('resize',e.updateBound,{passive:!0});const g=getScrollParent(c);return attachToScrollParents(g,'scroll',e.updateBound,e.scrollParents),e.scrollElement=g,e.eventsEnabled=!0,e}function removeEventListeners(c,d){return window.removeEventListener('resize',d.updateBound),d.scrollParents.forEach((e)=>{e.removeEventListener('scroll',d.updateBound)}),d.updateBound=null,d.scrollParents=[],d.scrollElement=null,d.eventsEnabled=!1,d}function find(c,d){return Array.prototype.find?c.find(d):c.filter(d)[0]}function findIndex(c,d,e){if(Array.prototype.findIndex)return c.findIndex((g)=>g[d]===e);const f=find(c,(g)=>g[d]===e);return c.indexOf(f)}function runModifiers(c,d,e){const f=void 0===e?c:c.slice(0,findIndex(c,'name',e));return f.forEach((g)=>{g.enabled&&isFunction(g.function)&&(d=g.function(d,g))}),d}function isModifierEnabled(c,d){return c.some(({name:e,enabled:f})=>f&&e===d)}function getViewportOffsetRectRelativeToArtbitraryNode(c){const d=window.document.documentElement,e=getOffsetRectRelativeToArbitraryNode(c,d),f=_Mathmax(d.clientWidth,window.innerWidth||0),g=_Mathmax(d.clientHeight,window.innerHeight||0),h=getScroll(d),j=getScroll(d,'left'),k={top:h-e.top+e.marginTop,left:j-e.left+e.marginLeft,width:f,height:g};return getClientRect(k)}function isFixed(c){const d=c.nodeName;return'BODY'===d||'HTML'===d?!1:!('fixed'!==getStyleComputedProperty(c,'position'))||isFixed(getParentNode(c))}function getBoundaries(c,d,e,f){let g={top:0,left:0};const h=findCommonOffsetParent(c,d);if('viewport'===f)g=getViewportOffsetRectRelativeToArtbitraryNode(h);else{let j;'scrollParent'===f?(j=getScrollParent(getParentNode(c)),'BODY'===j.nodeName&&(j=window.document.documentElement)):'window'===f?j=window.document.documentElement:j=f;const k=getOffsetRectRelativeToArbitraryNode(j,h);if('HTML'===j.nodeName&&!isFixed(h)){const{height:l,width:m}=getWindowSizes();g.top+=k.top-k.marginTop,g.bottom=l+k.top,g.left+=k.left-k.marginLeft,g.right=m+k.left}else g=k}return g.left+=e,g.top+=e,g.right-=e,g.bottom-=e,g}function computeAutoPlacement(c,d,e,f){if(-1===c.indexOf('auto'))return c;const g=getBoundaries(e,f,0,'scrollParent'),h={top:d.top-g.top,right:g.right-d.right,bottom:g.bottom-d.bottom,left:d.left-g.left},j=Object.keys(h).sort((l,m)=>h[m]-h[l])[0],k=c.split('-')[1];return j+(k?`-${k}`:'')}const placements=['auto-start','auto','auto-end','top-start','top','top-end','right-start','right','right-end','bottom-end','bottom','bottom-start','left-end','left','left-start'];function setAttributes(c,d){Object.keys(d).forEach(function(e){const f=d[e];!1===f?c.removeAttribute(e):c.setAttribute(e,d[e])})}function applyStyle(c,d){const e={position:c.offsets.popper.position},f={'x-placement':c.placement},g=_Mathround(c.offsets.popper.left),h=_Mathround(c.offsets.popper.top),j=getSupportedPropertyName('transform');return d.gpuAcceleration&&j?(e[j]='translate3d('+g+'px, '+h+'px, 0)',e.top=0,e.left=0,e.willChange='transform'):(e.left=g,e.top=h,e.willChange='top, left'),setStyles(c.instance.popper,_extends({},e,c.styles)),setAttributes(c.instance.popper,_extends({},f,c.attributes)),c.offsets.arrow&&setStyles(c.arrowElement,c.offsets.arrow),c}function applyStyleOnLoad(c,d,e,f,g){const h=getReferenceOffsets(g,d,c);return e.placement=computeAutoPlacement(e.placement,h,d,c),d.setAttribute('x-placement',e.placement),e}function isModifierRequired(c,d,e){const f=find(c,({name:g})=>g===d);return!!f&&c.some((g)=>{return g.name===e&&g.enabled&&g.orderg[o]&&(c.offsets.popper[l]+=h[l]+p-g[o]);const q=h[l]+h[k]/2-p/2;let r=q-getClientRect(c.offsets.popper)[l];return r=_Mathmax(_Mathmin(g[k]-p,r),0),c.arrowElement=e,c.offsets.arrow={},c.offsets.arrow[l]=r,c.offsets.arrow[m]='',c}function getOppositeVariation(c){if('end'===c)return'start';return'start'===c?'end':c}const validPlacements=placements.slice(3);function clockwise(c,d=!1){const e=validPlacements.indexOf(c),f=validPlacements.slice(e+1).concat(validPlacements.slice(0,e));return d?f.reverse():f}const BEHAVIORS={FLIP:'flip',CLOCKWISE:'clockwise',COUNTERCLOCKWISE:'counterclockwise'};function flip(c,d){if(isModifierEnabled(c.instance.modifiers,'inner'))return c;if(c.flipped&&c.placement===c.originalPlacement)return c;const e=getBoundaries(c.instance.popper,c.instance.reference,d.padding,d.boundariesElement);let f=c.placement.split('-')[0],g=getOppositePlacement(f),h=c.placement.split('-')[1]||'',j=[];switch(d.behavior){case BEHAVIORS.FLIP:j=[f,g];break;case BEHAVIORS.CLOCKWISE:j=clockwise(f);break;case BEHAVIORS.COUNTERCLOCKWISE:j=clockwise(f,!0);break;default:j=d.behavior;}return j.forEach((k,l)=>{if(f!==k||j.length===l+1)return c;f=c.placement.split('-')[0],g=getOppositePlacement(f);const m=getClientRect(c.offsets.popper),o=c.offsets.reference,p=_Mathfloor,q='left'===f&&p(m.right)>p(o.left)||'right'===f&&p(m.left)p(o.top)||'bottom'===f&&p(m.top)
p(e.right),t=p(m.top)
p(e.bottom),v='left'===f&&r||'right'===f&&s||'top'===f&&t||'bottom'===f&&u,w=-1!==['top','bottom'].indexOf(f),z=!!d.flipVariations&&(w&&'start'===h&&r||w&&'end'===h&&s||!w&&'start'===h&&t||!w&&'end'===h&&u);(q||v||z)&&(c.flipped=!0,(q||v)&&(f=j[l+1]),z&&(h=getOppositeVariation(h)),c.placement=f+(h?'-'+h:''),c.offsets.popper=getPopperOffsets(c.instance.state.position,c.instance.popper,c.offsets.reference,c.placement),c=runModifiers(c.instance.modifiers,c,'flip'))}),c}function keepTogether(c){const d=getClientRect(c.offsets.popper),e=c.offsets.reference,f=c.placement.split('-')[0],g=_Mathfloor,h=-1!==['top','bottom'].indexOf(f),j=h?'right':'bottom',k=h?'left':'top',l=h?'width':'height';return d[j]g(e[j])&&(c.offsets.popper[k]=g(e[j])),c}function offset(c,d){const e=c.placement,f=c.offsets.popper;let g;return isNumeric(d.offset)?g=[d.offset,0]:(g=d.offset.split(' '),g=g.map((h,j)=>{const k=h.match(/(\d*\.?\d*)(.*)/),l=+k[1],m=k[2];let o=-1!==e.indexOf('right')||-1!==e.indexOf('left');1===j&&(o=!o);const p=o?'height':'width';if(0===m.indexOf('%')){let q;switch(m){case'%p':q=c.offsets.popper;break;case'%':case'$r':default:q=c.offsets.reference;}const r=getClientRect(q),s=r[p];return s/100*l}if('vh'===m||'vw'===m){let q;return q='vh'===m?_Mathmax(document.documentElement.clientHeight,window.innerHeight||0):_Mathmax(document.documentElement.clientWidth,window.innerWidth||0),q/100*l}return'px'===m?+l:+h})),-1===c.placement.indexOf('left')?-1===c.placement.indexOf('right')?-1===c.placement.indexOf('top')?-1!==c.placement.indexOf('bottom')&&(f.left+=g[0],f.top+=g[1]||0):(f.left+=g[0],f.top-=g[1]||0):(f.top+=g[0],f.left+=g[1]||0):(f.top+=g[0],f.left-=g[1]||0),c}function preventOverflow(c,d){const e=d.boundariesElement||getOffsetParent(c.instance.popper),f=getBoundaries(c.instance.popper,c.instance.reference,d.padding,e);d.boundaries=f;const g=d.priority;let h=getClientRect(c.offsets.popper);const j={primary(k){let l=h[k];return h[k]f[k]&&!d.escapeWithReference&&(m=_Mathmin(h[l],f[k]-('right'===k?h.width:h.height))),{[l]:m}}};return g.forEach((k)=>{const l=-1===['left','top'].indexOf(k)?'secondary':'primary';h=_extends({},h,j[l](k))}),c.offsets.popper=h,c}function shift(c){const d=c.placement,e=d.split('-')[0],f=d.split('-')[1];if(f){const g=c.offsets.reference,h=getClientRect(c.offsets.popper),j=-1!==['bottom','top'].indexOf(e),k=j?'left':'top',l=j?'width':'height',m={start:{[k]:g[k]},end:{[k]:g[k]+g[l]-h[l]}};c.offsets.popper=_extends({},h,m[f])}return c}function hide(c){if(!isModifierRequired(c.instance.modifiers,'hide','preventOverflow'))return console.warn('WARNING: preventOverflow modifier is required by hide modifier in order to work, be sure to include it before hide!'),c;const d=c.offsets.reference,e=find(c.instance.modifiers,(f)=>'preventOverflow'===f.name).boundaries;if(d.bottome.right||d.top>e.bottom||d.right{},onUpdate:()=>{},modifiers};class Popper{constructor(c,d,e={}){this.scheduleUpdate=()=>requestAnimationFrame(this.update),this.update=debounce(this.update.bind(this)),this.options=_extends({},Popper.Defaults,e),this.state={isDestroyed:!1,isCreated:!1,scrollParents:[]},this.reference=c.jquery?c[0]:c,this.popper=d.jquery?d[0]:d,setStyles(this.popper,{position:'absolute'}),this.modifiers=Object.keys(Popper.Defaults.modifiers).map((g)=>_extends({name:g},Popper.Defaults.modifiers[g])),this.modifiers=this.modifiers.map((g)=>{const h=e.modifiers&&e.modifiers[g.name]||{};return _extends({},g,h)}),e.modifiers&&(this.options.modifiers=_extends({},Popper.Defaults.modifiers,e.modifiers),Object.keys(e.modifiers).forEach((g)=>{if(Popper.Defaults.modifiers[g]===void 0){const h=e.modifiers[g];h.name=g,this.modifiers.push(h)}})),this.modifiers=this.modifiers.sort((g,h)=>g.order-h.order),this.modifiers.forEach((g)=>{g.enabled&&isFunction(g.onLoad)&&g.onLoad(this.reference,this.popper,this.options,g,this.state)}),this.update();const f=this.options.eventsEnabled;f&&this.enableEventListeners(),this.state.eventsEnabled=f}update(){if(this.state.isDestroyed)return;let c={instance:this,styles:{},attributes:{},flipped:!1,offsets:{}};c.offsets.reference=getReferenceOffsets(this.state,this.popper,this.reference),c.placement=computeAutoPlacement(this.options.placement,c.offsets.reference,this.popper,this.reference),c.originalPlacement=this.options.placement,c.offsets.popper=getPopperOffsets(this.state,this.popper,c.offsets.reference,c.placement),c=runModifiers(this.modifiers,c),this.state.isCreated?this.options.onUpdate(c):(this.state.isCreated=!0,this.options.onCreate(c))}destroy(){return this.state.isDestroyed=!0,isModifierEnabled(this.modifiers,'applyStyle')&&(this.popper.removeAttribute('x-placement'),this.popper.style.left='',this.popper.style.position='',this.popper.style.top='',this.popper.style[getSupportedPropertyName('transform')]=''),this.disableEventListeners(),this.options.removeOnDestroy&&this.popper.parentNode.removeChild(this.popper),this}enableEventListeners(){this.state.eventsEnabled||(this.state=setupEventListeners(this.reference,this.options,this.state,this.scheduleUpdate))}disableEventListeners(){this.state.eventsEnabled&&(window.cancelAnimationFrame(this.scheduleUpdate),this.state=removeEventListeners(this.reference,this.state))}}Popper.Utils=window.PopperUtils,Popper.placements=placements,Popper.Defaults=DEFAULTS;export default Popper;
-//# sourceMappingURL=popper.es5.min.js.map
\ No newline at end of file
+//# sourceMappingURL=popper.min.js.map
\ No newline at end of file
diff --git a/docs/assets/js/vendor/popper.min.js.map b/docs/assets/js/vendor/popper.min.js.map
new file mode 100644
index 0000000000000000000000000000000000000000..d87633d1f96cdeea050ae261b55694da799a2f49
GIT binary patch
literal 108917
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
D27hvE
literal 0
HcmV?d00001
diff --git a/docs/components/dropdowns.md b/docs/components/dropdowns.md
index 4da232b7d..938447f3d 100644
--- a/docs/components/dropdowns.md
+++ b/docs/components/dropdowns.md
@@ -12,6 +12,12 @@ Dropdowns are toggleable, contextual overlays for displaying lists of links and
* Will be replaced with the ToC, excluding the "Contents" header
{:toc}
+## Overview
+
+Things to know when using the popover plugin:
+
+- Dropdown rely on the 3rd party library [Popper.js](https://popper.js.org) for positioning. You must include [popper.min.js](https://cdnjs.cloudflare.com/ajax/libs/popper.js/1.8.1/popper.es5.min.js) before bootstrap.js in order for dropdowns to work!
+
## Examples
Wrap the dropdown's toggle (your button or link) and the dropdown menu within `.dropdown`, or another element that declares `position: relative;`. Dropdowns can be triggered from `` or `` elements to better fit your potential needs.
@@ -19,7 +25,7 @@ Wrap the dropdown's toggle (your button or link) and the dropdown menu within `.
{% callout info %}
### Dropdown menu accessibility
-The [WAI ARIA ](https://www.w3.org/TR/wai-aria/) standard defines an actual [`role="menu"` widget](https://www.w3.org/TR/wai-aria/roles#menu), but this is specific to application-like menus which trigger actions or functions. ARIA menus can only contain menu items, checkbox menu items, radio button menu items, radio button groups, and sub-menus.
+The [WAI ARIA ](https://www.w3.org/TR/wai-aria/) standard defines an actual [`role="menu"` widget](https://www.w3.org/TR/wai-aria/roles#menu), but this is specific to application-like menus which trigger actions or functions. ARIA menus can only contain menu items, checkbox menu items, radio button menu items, radio button groups, and sub-menus.
Bootstrap's dropdowns, on the other hand, are designed to be generic and applicable to a variety of situations and markup structures. For instance, it is possible to create dropdowns that contain additional inputs and form controls, such as search fields or login forms. For this reason, Bootstrap does not expect (nor automatically add) any of the `role` and `aria-` attributes required for true ARIA menus. Authors will have to include these more specific attributes themselves.
@@ -527,7 +533,35 @@ Regardless of whether you call your dropdown via JavaScript or instead use the d
### Options
-*None.*
+Options can be passed via data attributes or JavaScript. For data attributes, append the option name to `data-`, as in `data-placement=""`.
+
+
+
+
+ Name
+ Type
+ Default
+ Description
+
+
+
+
+ placement
+ string | function
+ 'bottom'
+
+ How to position the popover - top | bottom.
+ When a function is used to determine the placement, it is called with the popover DOM node as its first argument and the triggering element DOM node as its second. The this context is set to the dropdown instance.
+
+
+
+ offset
+ number | string
+ 0
+ Offset of the dropdown relative to its target. For more information refer to Popper.js's offset docs .
+
+
+
### Methods
diff --git a/docs/components/popovers.md b/docs/components/popovers.md
index 82a45cd45..71d488fd4 100644
--- a/docs/components/popovers.md
+++ b/docs/components/popovers.md
@@ -17,7 +17,7 @@ Add small overlay content, like those found in iOS, to any element for housing s
Things to know when using the popover plugin:
-- Popovers rely on the 3rd party library [Tether](http://tether.io/) for positioning. You must include [tether.min.js](https://github.com/HubSpot/tether/blob/master/dist/js/tether.min.js) before bootstrap.js in order for popovers to work!
+- Popovers rely on the 3rd party library [Popper.js](https://popper.js.org) for positioning. You must include [popper.min.js](https://cdnjs.cloudflare.com/ajax/libs/popper.js/1.8.1/popper.es5.min.js) before bootstrap.js in order for popovers to work!
- Popovers require the [tooltip plugin]({{ site.baseurl }}/components/tooltips/) as a dependency.
- Popovers are opt-in for performance reasons, so **you must initialize them yourself**.
- Zero-length `title` and `content` values will never show a popover.
@@ -255,17 +255,11 @@ Options can be passed via data attributes or JavaScript. For data attributes, ap
'click'
How popover is triggered - click | hover | focus | manual. You may pass multiple triggers; separate them with a space. `manual` cannot be combined with any other trigger.
-
- constraints
- Array
- 'hover focus'
- An array of constraints - passed through to Tether. For more information refer to Tether's constraint docs .
-
offset
- string
- '0 0'
- Offset of the popover relative to its target. For more information refer to Tether's offset docs .
+ number | string
+ 0
+ Offset of the popover relative to its target. For more information refer to Popper.js's offset docs .
diff --git a/docs/components/tooltips.md b/docs/components/tooltips.md
index 393d94c05..e8a7ce96f 100644
--- a/docs/components/tooltips.md
+++ b/docs/components/tooltips.md
@@ -16,7 +16,7 @@ Inspired by the excellent Tipsy jQuery plugin written by Jason Frame. Tooltips a
Things to know when using the tooltip plugin:
-- Tooltips rely on the 3rd party library [Tether](http://tether.io/) for positioning. You must include [tether.min.js](https://github.com/HubSpot/tether/blob/master/dist/js/tether.min.js) before bootstrap.js in order for tooltips to work!
+- Tooltips rely on the 3rd party library [Popper.js](https://popper.js.org) for positioning. You must include [popper.min.js](https://cdnjs.cloudflare.com/ajax/libs/popper.js/1.8.1/popper.es5.min.js) before bootstrap.js in order for tooltips to work!
- Tooltips are opt-in for performance reasons, so **you must initialize them yourself**.
- Tooltips with zero-length titles are never displayed.
- Specify `container: 'body'` to avoid rendering problems in more complex components (like our input groups, button groups, etc).
@@ -232,17 +232,11 @@ Options can be passed via data attributes or JavaScript. For data attributes, ap
'hover focus'
How tooltip is triggered - click | hover | focus | manual. You may pass multiple triggers; separate them with a space. `manual` cannot be combined with any other trigger.
-
- constraints
- Array
- []
- An array of constraints - passed through to Tether. For more information refer to Tether's constraint docs .
-
offset
- string
- '0 0'
- Offset of the tooltip relative to its target. For more information refer to Tether's offset docs .
+ number | string
+ 0
+ Offset of the tooltip relative to its target. For more information refer to Popper.js's offset docs .
diff --git a/docs/examples/album/index.html b/docs/examples/album/index.html
index 36d567540..4f739ca9d 100644
--- a/docs/examples/album/index.html
+++ b/docs/examples/album/index.html
@@ -118,7 +118,7 @@
-
+
-
+
diff --git a/docs/examples/carousel/index.html b/docs/examples/carousel/index.html
index 072129a61..004895d13 100644
--- a/docs/examples/carousel/index.html
+++ b/docs/examples/carousel/index.html
@@ -176,7 +176,7 @@
-
+
diff --git a/docs/examples/cover/index.html b/docs/examples/cover/index.html
index 62897fae4..24d656d9d 100644
--- a/docs/examples/cover/index.html
+++ b/docs/examples/cover/index.html
@@ -60,7 +60,7 @@
-
+
diff --git a/docs/examples/dashboard/index.html b/docs/examples/dashboard/index.html
index 923c5a594..0a7344803 100644
--- a/docs/examples/dashboard/index.html
+++ b/docs/examples/dashboard/index.html
@@ -254,7 +254,7 @@
-
+
diff --git a/docs/examples/jumbotron/index.html b/docs/examples/jumbotron/index.html
index 35c308d14..5f9b7f2c4 100644
--- a/docs/examples/jumbotron/index.html
+++ b/docs/examples/jumbotron/index.html
@@ -93,7 +93,7 @@
-
+
diff --git a/docs/examples/justified-nav/index.html b/docs/examples/justified-nav/index.html
index 23615bd60..bbd4df887 100644
--- a/docs/examples/justified-nav/index.html
+++ b/docs/examples/justified-nav/index.html
@@ -96,7 +96,7 @@
-
+
diff --git a/docs/examples/navbar-top-fixed/index.html b/docs/examples/navbar-top-fixed/index.html
index e7685c5be..e6000bcd3 100644
--- a/docs/examples/navbar-top-fixed/index.html
+++ b/docs/examples/navbar-top-fixed/index.html
@@ -56,7 +56,7 @@
-
+
diff --git a/docs/examples/navbar-top/index.html b/docs/examples/navbar-top/index.html
index c748a33a5..c7b712200 100644
--- a/docs/examples/navbar-top/index.html
+++ b/docs/examples/navbar-top/index.html
@@ -56,7 +56,7 @@
-
+
diff --git a/docs/examples/navbars/index.html b/docs/examples/navbars/index.html
index d3c53edc5..dcb987cff 100644
--- a/docs/examples/navbars/index.html
+++ b/docs/examples/navbars/index.html
@@ -351,7 +351,7 @@
-
+
diff --git a/docs/examples/offcanvas/index.html b/docs/examples/offcanvas/index.html
index 8183714b1..1b2014015 100644
--- a/docs/examples/offcanvas/index.html
+++ b/docs/examples/offcanvas/index.html
@@ -127,7 +127,7 @@
-
+
diff --git a/docs/examples/starter-template/index.html b/docs/examples/starter-template/index.html
index 37e5b04f3..39e888ff3 100644
--- a/docs/examples/starter-template/index.html
+++ b/docs/examples/starter-template/index.html
@@ -66,7 +66,7 @@
-
+
diff --git a/docs/examples/sticky-footer-navbar/index.html b/docs/examples/sticky-footer-navbar/index.html
index dffcbc464..c92dbb036 100644
--- a/docs/examples/sticky-footer-navbar/index.html
+++ b/docs/examples/sticky-footer-navbar/index.html
@@ -64,7 +64,7 @@
-
+
diff --git a/docs/examples/tooltip-viewport/index.html b/docs/examples/tooltip-viewport/index.html
index 8fd3f8049..eb30fd6ad 100644
--- a/docs/examples/tooltip-viewport/index.html
+++ b/docs/examples/tooltip-viewport/index.html
@@ -39,9 +39,8 @@
-
+
-
diff --git a/docs/getting-started/introduction.md b/docs/getting-started/introduction.md
index 0ca845a8a..94edff52b 100644
--- a/docs/getting-started/introduction.md
+++ b/docs/getting-started/introduction.md
@@ -25,11 +25,11 @@ Copy-paste the stylesheet ` ` into your `` before all other styleshee
{% endhighlight %}
-Add our JavaScript plugins, jQuery, and Tether near the end of your pages, right before the closing `` tag. Be sure to place jQuery and Tether first, as our code depends on them. While we use [jQuery's slim build](https://blog.jquery.com/2016/06/09/jquery-3-0-final-released/) in our docs, the full version is also supported.
+Add our JavaScript plugins, jQuery, and Popper.js near the end of your pages, right before the closing `
Hello, world!
-
+
-
+