From fca04c07131a81e625a516cf7b98a8c7df0df1c1 Mon Sep 17 00:00:00 2001 From: XhmikosR Date: Fri, 13 May 2022 09:07:23 +0300 Subject: Dist --- js/dist/tooltip.js | 867 ++++++++++++++++------------------------------------- 1 file changed, 263 insertions(+), 604 deletions(-) (limited to 'js/dist/tooltip.js') diff --git a/js/dist/tooltip.js b/js/dist/tooltip.js index 883c8dbb0..9af74c8db 100644 --- a/js/dist/tooltip.js +++ b/js/dist/tooltip.js @@ -1,19 +1,19 @@ /*! - * Bootstrap tooltip.js v5.1.3 (https://getbootstrap.com/) - * Copyright 2011-2021 The Bootstrap Authors (https://github.com/twbs/bootstrap/graphs/contributors) + * Bootstrap tooltip.js v5.2.0-beta1 (https://getbootstrap.com/) + * Copyright 2011-2022 The Bootstrap Authors (https://github.com/twbs/bootstrap/graphs/contributors) * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE) */ (function (global, factory) { - typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory(require('@popperjs/core'), require('./dom/data.js'), require('./dom/event-handler.js'), require('./dom/manipulator.js'), require('./dom/selector-engine.js'), require('./base-component.js')) : - typeof define === 'function' && define.amd ? define(['@popperjs/core', './dom/data', './dom/event-handler', './dom/manipulator', './dom/selector-engine', './base-component'], factory) : - (global = typeof globalThis !== 'undefined' ? globalThis : global || self, global.Tooltip = factory(global.Popper, global.Data, global.EventHandler, global.Manipulator, global.SelectorEngine, global.Base)); -})(this, (function (Popper, Data, EventHandler, Manipulator, SelectorEngine, BaseComponent) { 'use strict'; + typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory(require('@popperjs/core'), require('./util/index'), require('./util/sanitizer'), require('./dom/event-handler'), require('./dom/manipulator'), require('./base-component'), require('./util/template-factory')) : + typeof define === 'function' && define.amd ? define(['@popperjs/core', './util/index', './util/sanitizer', './dom/event-handler', './dom/manipulator', './base-component', './util/template-factory'], factory) : + (global = typeof globalThis !== 'undefined' ? globalThis : global || self, global.Tooltip = factory(global["@popperjs/core"], global.Index, global.Sanitizer, global.EventHandler, global.Manipulator, global.BaseComponent, global.TemplateFactory)); +})(this, (function (Popper, index, sanitizer, EventHandler, Manipulator, BaseComponent, TemplateFactory) { 'use strict'; const _interopDefaultLegacy = e => e && typeof e === 'object' && 'default' in e ? e : { default: e }; function _interopNamespace(e) { if (e && e.__esModule) return e; - const n = Object.create(null); + const n = Object.create(null, { [Symbol.toStringTag]: { value: 'Module' } }); if (e) { for (const k in e) { if (k !== 'default') { @@ -30,308 +30,49 @@ } const Popper__namespace = /*#__PURE__*/_interopNamespace(Popper); - const Data__default = /*#__PURE__*/_interopDefaultLegacy(Data); const EventHandler__default = /*#__PURE__*/_interopDefaultLegacy(EventHandler); const Manipulator__default = /*#__PURE__*/_interopDefaultLegacy(Manipulator); - const SelectorEngine__default = /*#__PURE__*/_interopDefaultLegacy(SelectorEngine); const BaseComponent__default = /*#__PURE__*/_interopDefaultLegacy(BaseComponent); + const TemplateFactory__default = /*#__PURE__*/_interopDefaultLegacy(TemplateFactory); /** * -------------------------------------------------------------------------- - * Bootstrap (v5.1.3): util/index.js + * Bootstrap (v5.2.0-beta1): tooltip.js * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE) * -------------------------------------------------------------------------- */ - const MAX_UID = 1000000; - - const toType = obj => { - if (obj === null || obj === undefined) { - return `${obj}`; - } - - return {}.toString.call(obj).match(/\s([a-z]+)/i)[1].toLowerCase(); - }; /** - * -------------------------------------------------------------------------- - * Public Util Api - * -------------------------------------------------------------------------- - */ - - - const getUID = prefix => { - do { - prefix += Math.floor(Math.random() * MAX_UID); - } while (document.getElementById(prefix)); - - return prefix; - }; - - const isElement = obj => { - if (!obj || typeof obj !== 'object') { - return false; - } - - if (typeof obj.jquery !== 'undefined') { - obj = obj[0]; - } - - return typeof obj.nodeType !== 'undefined'; - }; - - const getElement = obj => { - if (isElement(obj)) { - // it's a jQuery object or a node element - return obj.jquery ? obj[0] : obj; - } - - if (typeof obj === 'string' && obj.length > 0) { - return document.querySelector(obj); - } - - return null; - }; - - const typeCheckConfig = (componentName, config, configTypes) => { - Object.keys(configTypes).forEach(property => { - const expectedTypes = configTypes[property]; - const value = config[property]; - const valueType = value && isElement(value) ? 'element' : toType(value); - - if (!new RegExp(expectedTypes).test(valueType)) { - throw new TypeError(`${componentName.toUpperCase()}: Option "${property}" provided type "${valueType}" but expected type "${expectedTypes}".`); - } - }); - }; - - const findShadowRoot = element => { - if (!document.documentElement.attachShadow) { - return null; - } // Can find the shadow root otherwise it'll return the document - - - if (typeof element.getRootNode === 'function') { - const root = element.getRootNode(); - return root instanceof ShadowRoot ? root : null; - } - - if (element instanceof ShadowRoot) { - return element; - } // when we don't find a shadow root - - - if (!element.parentNode) { - return null; - } - - return findShadowRoot(element.parentNode); - }; - - const noop = () => {}; - - const getjQuery = () => { - const { - jQuery - } = window; - - if (jQuery && !document.body.hasAttribute('data-bs-no-jquery')) { - return jQuery; - } - - return null; - }; - - const DOMContentLoadedCallbacks = []; - - const onDOMContentLoaded = callback => { - if (document.readyState === 'loading') { - // add listener on the first call when the document is in loading state - if (!DOMContentLoadedCallbacks.length) { - document.addEventListener('DOMContentLoaded', () => { - DOMContentLoadedCallbacks.forEach(callback => callback()); - }); - } - - DOMContentLoadedCallbacks.push(callback); - } else { - callback(); - } - }; - - const isRTL = () => document.documentElement.dir === 'rtl'; - - const defineJQueryPlugin = plugin => { - onDOMContentLoaded(() => { - const $ = getjQuery(); - /* istanbul ignore if */ - - if ($) { - const name = plugin.NAME; - const JQUERY_NO_CONFLICT = $.fn[name]; - $.fn[name] = plugin.jQueryInterface; - $.fn[name].Constructor = plugin; - - $.fn[name].noConflict = () => { - $.fn[name] = JQUERY_NO_CONFLICT; - return plugin.jQueryInterface; - }; - } - }); - }; - - /** - * -------------------------------------------------------------------------- - * Bootstrap (v5.1.3): util/sanitizer.js - * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE) - * -------------------------------------------------------------------------- - */ - const uriAttributes = new Set(['background', 'cite', 'href', 'itemtype', 'longdesc', 'poster', 'src', 'xlink:href']); - const ARIA_ATTRIBUTE_PATTERN = /^aria-[\w-]*$/i; - /** - * A pattern that recognizes a commonly useful subset of URLs that are safe. - * - * Shoutout to Angular https://github.com/angular/angular/blob/12.2.x/packages/core/src/sanitization/url_sanitizer.ts - */ - - const SAFE_URL_PATTERN = /^(?:(?:https?|mailto|ftp|tel|file|sms):|[^#&/:?]*(?:[#/?]|$))/i; - /** - * A pattern that matches safe data URLs. Only matches image, video and audio types. - * - * Shoutout to Angular https://github.com/angular/angular/blob/12.2.x/packages/core/src/sanitization/url_sanitizer.ts - */ - - const DATA_URL_PATTERN = /^data:(?:image\/(?:bmp|gif|jpeg|jpg|png|tiff|webp)|video\/(?:mpeg|mp4|ogg|webm)|audio\/(?:mp3|oga|ogg|opus));base64,[\d+/a-z]+=*$/i; - - const allowedAttribute = (attribute, allowedAttributeList) => { - const attributeName = attribute.nodeName.toLowerCase(); - - if (allowedAttributeList.includes(attributeName)) { - if (uriAttributes.has(attributeName)) { - return Boolean(SAFE_URL_PATTERN.test(attribute.nodeValue) || DATA_URL_PATTERN.test(attribute.nodeValue)); - } - - return true; - } - - const regExp = allowedAttributeList.filter(attributeRegex => attributeRegex instanceof RegExp); // Check if a regular expression validates the attribute. - - for (let i = 0, len = regExp.length; i < len; i++) { - if (regExp[i].test(attributeName)) { - return true; - } - } - - return false; - }; - - const DefaultAllowlist = { - // Global attributes allowed on any supplied element below. - '*': ['class', 'dir', 'id', 'lang', 'role', ARIA_ATTRIBUTE_PATTERN], - a: ['target', 'href', 'title', 'rel'], - area: [], - b: [], - br: [], - col: [], - code: [], - div: [], - em: [], - hr: [], - h1: [], - h2: [], - h3: [], - h4: [], - h5: [], - h6: [], - i: [], - img: ['src', 'srcset', 'alt', 'title', 'width', 'height'], - li: [], - ol: [], - p: [], - pre: [], - s: [], - small: [], - span: [], - sub: [], - sup: [], - strong: [], - u: [], - ul: [] - }; - function sanitizeHtml(unsafeHtml, allowList, sanitizeFn) { - if (!unsafeHtml.length) { - return unsafeHtml; - } - - if (sanitizeFn && typeof sanitizeFn === 'function') { - return sanitizeFn(unsafeHtml); - } - - const domParser = new window.DOMParser(); - const createdDocument = domParser.parseFromString(unsafeHtml, 'text/html'); - const elements = [].concat(...createdDocument.body.querySelectorAll('*')); - - for (let i = 0, len = elements.length; i < len; i++) { - const element = elements[i]; - const elementName = element.nodeName.toLowerCase(); - - if (!Object.keys(allowList).includes(elementName)) { - element.remove(); - continue; - } - - const attributeList = [].concat(...element.attributes); - const allowedAttributes = [].concat(allowList['*'] || [], allowList[elementName] || []); - attributeList.forEach(attribute => { - if (!allowedAttribute(attribute, allowedAttributes)) { - element.removeAttribute(attribute.nodeName); - } - }); - } - - return createdDocument.body.innerHTML; - } - - /** - * -------------------------------------------------------------------------- - * Bootstrap (v5.1.3): tooltip.js - * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE) - * -------------------------------------------------------------------------- - */ - /** - * ------------------------------------------------------------------------ * Constants - * ------------------------------------------------------------------------ */ const NAME = 'tooltip'; - const DATA_KEY = 'bs.tooltip'; - const EVENT_KEY = `.${DATA_KEY}`; - const CLASS_PREFIX = 'bs-tooltip'; const DISALLOWED_ATTRIBUTES = new Set(['sanitize', 'allowList', 'sanitizeFn']); - const DefaultType = { - animation: 'boolean', - template: 'string', - title: '(string|element|function)', - trigger: 'string', - delay: '(number|object)', - html: 'boolean', - selector: '(string|boolean)', - placement: '(string|function)', - offset: '(array|string|function)', - container: '(string|element|boolean)', - fallbackPlacements: 'array', - boundary: '(string|element)', - customClass: '(string|function)', - sanitize: 'boolean', - sanitizeFn: '(null|function)', - allowList: 'object', - popperConfig: '(null|object|function)' - }; + const CLASS_NAME_FADE = 'fade'; + const CLASS_NAME_MODAL = 'modal'; + const CLASS_NAME_SHOW = 'show'; + const SELECTOR_TOOLTIP_INNER = '.tooltip-inner'; + const SELECTOR_MODAL = `.${CLASS_NAME_MODAL}`; + const EVENT_MODAL_HIDE = 'hide.bs.modal'; + const TRIGGER_HOVER = 'hover'; + const TRIGGER_FOCUS = 'focus'; + const TRIGGER_CLICK = 'click'; + const TRIGGER_MANUAL = 'manual'; + const EVENT_HIDE = 'hide'; + const EVENT_HIDDEN = 'hidden'; + const EVENT_SHOW = 'show'; + const EVENT_SHOWN = 'shown'; + const EVENT_INSERTED = 'inserted'; + const EVENT_CLICK = 'click'; + const EVENT_FOCUSIN = 'focusin'; + const EVENT_FOCUSOUT = 'focusout'; + const EVENT_MOUSEENTER = 'mouseenter'; + const EVENT_MOUSELEAVE = 'mouseleave'; const AttachmentMap = { AUTO: 'auto', TOP: 'top', - RIGHT: isRTL() ? 'left' : 'right', + RIGHT: index.isRTL() ? 'left' : 'right', BOTTOM: 'bottom', - LEFT: isRTL() ? 'right' : 'left' + LEFT: index.isRTL() ? 'right' : 'left' }; const Default = { animation: true, @@ -349,37 +90,30 @@ customClass: '', sanitize: true, sanitizeFn: null, - allowList: DefaultAllowlist, + allowList: sanitizer.DefaultAllowlist, popperConfig: null }; - const Event = { - HIDE: `hide${EVENT_KEY}`, - HIDDEN: `hidden${EVENT_KEY}`, - SHOW: `show${EVENT_KEY}`, - SHOWN: `shown${EVENT_KEY}`, - INSERTED: `inserted${EVENT_KEY}`, - CLICK: `click${EVENT_KEY}`, - FOCUSIN: `focusin${EVENT_KEY}`, - FOCUSOUT: `focusout${EVENT_KEY}`, - MOUSEENTER: `mouseenter${EVENT_KEY}`, - MOUSELEAVE: `mouseleave${EVENT_KEY}` + const DefaultType = { + animation: 'boolean', + template: 'string', + title: '(string|element|function)', + trigger: 'string', + delay: '(number|object)', + html: 'boolean', + selector: '(string|boolean)', + placement: '(string|function)', + offset: '(array|string|function)', + container: '(string|element|boolean)', + fallbackPlacements: 'array', + boundary: '(string|element)', + customClass: '(string|function)', + sanitize: 'boolean', + sanitizeFn: '(null|function)', + allowList: 'object', + popperConfig: '(null|object|function)' }; - const CLASS_NAME_FADE = 'fade'; - const CLASS_NAME_MODAL = 'modal'; - const CLASS_NAME_SHOW = 'show'; - const HOVER_STATE_SHOW = 'show'; - const HOVER_STATE_OUT = 'out'; - const SELECTOR_TOOLTIP_INNER = '.tooltip-inner'; - const SELECTOR_MODAL = `.${CLASS_NAME_MODAL}`; - const EVENT_MODAL_HIDE = 'hide.bs.modal'; - const TRIGGER_HOVER = 'hover'; - const TRIGGER_FOCUS = 'focus'; - const TRIGGER_CLICK = 'click'; - const TRIGGER_MANUAL = 'manual'; /** - * ------------------------------------------------------------------------ - * Class Definition - * ------------------------------------------------------------------------ + * Class definition */ class Tooltip extends BaseComponent__default.default { @@ -388,15 +122,15 @@ throw new TypeError('Bootstrap\'s tooltips require Popper (https://popper.js.org)'); } - super(element); // private + super(element, config); // Private this._isEnabled = true; this._timeout = 0; - this._hoverState = ''; + this._isHovered = false; this._activeTrigger = {}; - this._popper = null; // Protected + this._popper = null; + this._templateFactory = null; // Protected - this._config = this._getConfig(config); this.tip = null; this._setListeners(); @@ -407,16 +141,12 @@ return Default; } - static get NAME() { - return NAME; - } - - static get Event() { - return Event; - } - static get DefaultType() { return DefaultType; + } + + static get NAME() { + return NAME; } // Public @@ -443,19 +173,21 @@ context._activeTrigger.click = !context._activeTrigger.click; if (context._isWithActiveTrigger()) { - context._enter(null, context); + context._enter(); } else { - context._leave(null, context); + context._leave(); } - } else { - if (this.getTipElement().classList.contains(CLASS_NAME_SHOW)) { - this._leave(null, this); - return; - } + return; + } + + if (this._isShown()) { + this._leave(); - this._enter(null, this); + return; } + + this._enter(); } dispose() { @@ -476,233 +208,208 @@ throw new Error('Please use show on visible elements'); } - if (!(this.isWithContent() && this._isEnabled)) { + if (!(this._isWithContent() && this._isEnabled)) { return; } - const showEvent = EventHandler__default.default.trigger(this._element, this.constructor.Event.SHOW); - const shadowRoot = findShadowRoot(this._element); - const isInTheDom = shadowRoot === null ? this._element.ownerDocument.documentElement.contains(this._element) : shadowRoot.contains(this._element); + const showEvent = EventHandler__default.default.trigger(this._element, this.constructor.eventName(EVENT_SHOW)); + const shadowRoot = index.findShadowRoot(this._element); + + const isInTheDom = (shadowRoot || this._element.ownerDocument.documentElement).contains(this._element); if (showEvent.defaultPrevented || !isInTheDom) { return; - } // A trick to recreate a tooltip in case a new title is given by using the NOT documented `data-bs-original-title` - // This will be removed later in favor of a `setContent` method - - - if (this.constructor.NAME === 'tooltip' && this.tip && this.getTitle() !== this.tip.querySelector(SELECTOR_TOOLTIP_INNER).innerHTML) { - this._disposePopper(); - - this.tip.remove(); - this.tip = null; - } - - const tip = this.getTipElement(); - const tipId = getUID(this.constructor.NAME); - tip.setAttribute('id', tipId); - - this._element.setAttribute('aria-describedby', tipId); - - if (this._config.animation) { - tip.classList.add(CLASS_NAME_FADE); } - const placement = typeof this._config.placement === 'function' ? this._config.placement.call(this, tip, this._element) : this._config.placement; - - const attachment = this._getAttachment(placement); + const tip = this._getTipElement(); - this._addAttachmentClass(attachment); + this._element.setAttribute('aria-describedby', tip.getAttribute('id')); const { container } = this._config; - Data__default.default.set(tip, this.constructor.DATA_KEY, this); if (!this._element.ownerDocument.documentElement.contains(this.tip)) { container.append(tip); - EventHandler__default.default.trigger(this._element, this.constructor.Event.INSERTED); + EventHandler__default.default.trigger(this._element, this.constructor.eventName(EVENT_INSERTED)); } if (this._popper) { this._popper.update(); } else { - this._popper = Popper__namespace.createPopper(this._element, tip, this._getPopperConfig(attachment)); + this._createPopper(tip); } - tip.classList.add(CLASS_NAME_SHOW); - - const customClass = this._resolvePossibleFunction(this._config.customClass); - - if (customClass) { - tip.classList.add(...customClass.split(' ')); - } // If this is a touch-enabled device we add extra + tip.classList.add(CLASS_NAME_SHOW); // 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 // https://www.quirksmode.org/blog/archives/2014/02/mouse_event_bub.html - if ('ontouchstart' in document.documentElement) { - [].concat(...document.body.children).forEach(element => { - EventHandler__default.default.on(element, 'mouseover', noop); - }); + for (const element of [].concat(...document.body.children)) { + EventHandler__default.default.on(element, 'mouseover', index.noop); + } } const complete = () => { - const prevHoverState = this._hoverState; - this._hoverState = null; - EventHandler__default.default.trigger(this._element, this.constructor.Event.SHOWN); + const previousHoverState = this._isHovered; + this._isHovered = false; + EventHandler__default.default.trigger(this._element, this.constructor.eventName(EVENT_SHOWN)); - if (prevHoverState === HOVER_STATE_OUT) { - this._leave(null, this); + if (previousHoverState) { + this._leave(); } }; - const isAnimated = this.tip.classList.contains(CLASS_NAME_FADE); - - this._queueCallback(complete, this.tip, isAnimated); + this._queueCallback(complete, this.tip, this._isAnimated()); } hide() { - if (!this._popper) { + if (!this._isShown()) { return; } - const tip = this.getTipElement(); - - const complete = () => { - if (this._isWithActiveTrigger()) { - return; - } - - if (this._hoverState !== HOVER_STATE_SHOW) { - tip.remove(); - } - - this._cleanTipClass(); - - this._element.removeAttribute('aria-describedby'); - - EventHandler__default.default.trigger(this._element, this.constructor.Event.HIDDEN); - - this._disposePopper(); - }; - - const hideEvent = EventHandler__default.default.trigger(this._element, this.constructor.Event.HIDE); + const hideEvent = EventHandler__default.default.trigger(this._element, this.constructor.eventName(EVENT_HIDE)); if (hideEvent.defaultPrevented) { return; } + const tip = this._getTipElement(); + tip.classList.remove(CLASS_NAME_SHOW); // If this is a touch-enabled device we remove the extra // empty mouseover listeners we added for iOS support if ('ontouchstart' in document.documentElement) { - [].concat(...document.body.children).forEach(element => EventHandler__default.default.off(element, 'mouseover', noop)); + for (const element of [].concat(...document.body.children)) { + EventHandler__default.default.off(element, 'mouseover', index.noop); + } } this._activeTrigger[TRIGGER_CLICK] = false; this._activeTrigger[TRIGGER_FOCUS] = false; this._activeTrigger[TRIGGER_HOVER] = false; - const isAnimated = this.tip.classList.contains(CLASS_NAME_FADE); + this._isHovered = false; - this._queueCallback(complete, this.tip, isAnimated); + const complete = () => { + if (this._isWithActiveTrigger()) { + return; + } - this._hoverState = ''; + if (!this._isHovered) { + tip.remove(); + } + + this._element.removeAttribute('aria-describedby'); + + EventHandler__default.default.trigger(this._element, this.constructor.eventName(EVENT_HIDDEN)); + + this._disposePopper(); + }; + + this._queueCallback(complete, this.tip, this._isAnimated()); } update() { - if (this._popper !== null) { + if (this._popper) { this._popper.update(); } } // Protected - isWithContent() { - return Boolean(this.getTitle()); + _isWithContent() { + return Boolean(this._getTitle()); } - getTipElement() { - if (this.tip) { - return this.tip; + _getTipElement() { + if (!this.tip) { + this.tip = this._createTipElement(this._getContentForTemplate()); } - const element = document.createElement('div'); - element.innerHTML = this._config.template; - const tip = element.children[0]; - this.setContent(tip); - tip.classList.remove(CLASS_NAME_FADE, CLASS_NAME_SHOW); - this.tip = tip; return this.tip; } - setContent(tip) { - this._sanitizeAndSetContent(tip, this.getTitle(), SELECTOR_TOOLTIP_INNER); - } + _createTipElement(content) { + const tip = this._getTemplateFactory(content).toHtml(); // todo: remove this check on v6 - _sanitizeAndSetContent(template, content, selector) { - const templateElement = SelectorEngine__default.default.findOne(selector, template); - if (!content && templateElement) { - templateElement.remove(); - return; - } // we use append for html objects to maintain js events + if (!tip) { + return null; + } + tip.classList.remove(CLASS_NAME_FADE, CLASS_NAME_SHOW); // todo: on v6 the following can be achieved with CSS only - this.setElementContent(templateElement, content); - } + tip.classList.add(`bs-${this.constructor.NAME}-auto`); + const tipId = index.getUID(this.constructor.NAME).toString(); + tip.setAttribute('id', tipId); - setElementContent(element, content) { - if (element === null) { - return; + if (this._isAnimated()) { + tip.classList.add(CLASS_NAME_FADE); } - if (isElement(content)) { - content = getElement(content); // content is a DOM node or a jQuery + return tip; + } - if (this._config.html) { - if (content.parentNode !== element) { - element.innerHTML = ''; - element.append(content); - } - } else { - element.textContent = content.textContent; - } + setContent(content) { + let isShown = false; - return; + if (this.tip) { + isShown = this._isShown(); + this.tip.remove(); + this.tip = null; } - if (this._config.html) { - if (this._config.sanitize) { - content = sanitizeHtml(content, this._config.allowList, this._config.sanitizeFn); - } + this._disposePopper(); - element.innerHTML = content; - } else { - element.textContent = content; + this.tip = this._createTipElement(content); + + if (isShown) { + this.show(); } } - getTitle() { - const title = this._element.getAttribute('data-bs-original-title') || this._config.title; + _getTemplateFactory(content) { + if (this._templateFactory) { + this._templateFactory.changeContent(content); + } else { + this._templateFactory = new TemplateFactory__default.default({ ...this._config, + // the `content` var has to be after `this._config` + // to override config.content in case of popover + content, + extraClass: this._resolvePossibleFunction(this._config.customClass) + }); + } + + return this._templateFactory; + } - return this._resolvePossibleFunction(title); + _getContentForTemplate() { + return { + [SELECTOR_TOOLTIP_INNER]: this._getTitle() + }; } - updateAttachment(attachment) { - if (attachment === 'right') { - return 'end'; - } + _getTitle() { + return this._config.title; + } // Private - if (attachment === 'left') { - return 'start'; - } - return attachment; - } // Private + _initializeOnDelegatedTarget(event) { + return this.constructor.getOrCreateInstance(event.delegateTarget, this._getDelegateConfig()); + } + _isAnimated() { + return this._config.animation || this.tip && this.tip.classList.contains(CLASS_NAME_FADE); + } - _initializeOnDelegatedTarget(event, context) { - return context || this.constructor.getOrCreateInstance(event.delegateTarget, this._getDelegateConfig()); + _isShown() { + return this.tip && this.tip.classList.contains(CLASS_NAME_SHOW); + } + + _createPopper(tip) { + const placement = typeof this._config.placement === 'function' ? this._config.placement.call(this, tip, this._element) : this._config.placement; + const attachment = AttachmentMap[placement.toUpperCase()]; + this._popper = Popper__namespace.createPopper(this._element, tip, this._getPopperConfig(attachment)); } _getOffset() { @@ -711,7 +418,7 @@ } = this._config; if (typeof offset === 'string') { - return offset.split(',').map(val => Number.parseInt(val, 10)); + return offset.split(',').map(value => Number.parseInt(value, 10)); } if (typeof offset === 'function') { @@ -721,8 +428,8 @@ return offset; } - _resolvePossibleFunction(content) { - return typeof content === 'function' ? content.call(this._element) : content; + _resolvePossibleFunction(arg) { + return typeof arg === 'function' ? arg.call(this._element) : arg; } _getPopperConfig(attachment) { @@ -749,43 +456,46 @@ element: `.${this.constructor.NAME}-arrow` } }, { - name: 'onChange', + name: 'preSetPlacement', enabled: true, - phase: 'afterWrite', - fn: data => this._handlePopperPlacementChange(data) - }], - onFirstUpdate: data => { - if (data.options.placement !== data.placement) { - this._handlePopperPlacementChange(data); + phase: 'beforeMain', + fn: data => { + // Pre-set Popper's placement attribute in order to read the arrow sizes properly. + // Otherwise, Popper mixes up the width and height dimensions since the initial arrow style is for top placement + this._getTipElement().setAttribute('data-popper-placement', data.state.placement); } - } + }] }; return { ...defaultBsPopperConfig, ...(typeof this._config.popperConfig === 'function' ? this._config.popperConfig(defaultBsPopperConfig) : this._config.popperConfig) }; } - _addAttachmentClass(attachment) { - this.getTipElement().classList.add(`${this._getBasicClassPrefix()}-${this.updateAttachment(attachment)}`); - } - - _getAttachment(placement) { - return AttachmentMap[placement.toUpperCase()]; - } - _setListeners() { const triggers = this._config.trigger.split(' '); - triggers.forEach(trigger => { + for (const trigger of triggers) { if (trigger === 'click') { - EventHandler__default.default.on(this._element, this.constructor.Event.CLICK, this._config.selector, event => this.toggle(event)); + EventHandler__default.default.on(this._element, this.constructor.eventName(EVENT_CLICK), this._config.selector, event => this.toggle(event)); } else if (trigger !== TRIGGER_MANUAL) { - const eventIn = trigger === TRIGGER_HOVER ? this.constructor.Event.MOUSEENTER : this.constructor.Event.FOCUSIN; - const eventOut = trigger === TRIGGER_HOVER ? this.constructor.Event.MOUSELEAVE : this.constructor.Event.FOCUSOUT; - EventHandler__default.default.on(this._element, eventIn, this._config.selector, event => this._enter(event)); - EventHandler__default.default.on(this._element, eventOut, this._config.selector, event => this._leave(event)); + const eventIn = trigger === TRIGGER_HOVER ? this.constructor.eventName(EVENT_MOUSEENTER) : this.constructor.eventName(EVENT_FOCUSIN); + const eventOut = trigger === TRIGGER_HOVER ? this.constructor.eventName(EVENT_MOUSELEAVE) : this.constructor.eventName(EVENT_FOCUSOUT); + EventHandler__default.default.on(this._element, eventIn, this._config.selector, event => { + const context = this._initializeOnDelegatedTarget(event); + + context._activeTrigger[event.type === 'focusin' ? TRIGGER_FOCUS : TRIGGER_HOVER] = true; + + context._enter(); + }); + EventHandler__default.default.on(this._element, eventOut, this._config.selector, event => { + const context = this._initializeOnDelegatedTarget(event); + + context._activeTrigger[event.type === 'focusout' ? TRIGGER_FOCUS : TRIGGER_HOVER] = context._element.contains(event.relatedTarget); + + context._leave(); + }); } - }); + } this._hideModalHandler = () => { if (this._element) { @@ -806,96 +516,79 @@ } _fixTitle() { - const title = this._element.getAttribute('title'); - - const originalTitleType = typeof this._element.getAttribute('data-bs-original-title'); - - if (title || originalTitleType !== 'string') { - this._element.setAttribute('data-bs-original-title', title || ''); - - if (title && !this._element.getAttribute('aria-label') && !this._element.textContent) { - this._element.setAttribute('aria-label', title); - } - - this._element.setAttribute('title', ''); - } - } + const title = this._config.originalTitle; - _enter(event, context) { - context = this._initializeOnDelegatedTarget(event, context); - - if (event) { - context._activeTrigger[event.type === 'focusin' ? TRIGGER_FOCUS : TRIGGER_HOVER] = true; + if (!title) { + return; } - if (context.getTipElement().classList.contains(CLASS_NAME_SHOW) || context._hoverState === HOVER_STATE_SHOW) { - context._hoverState = HOVER_STATE_SHOW; - return; + if (!this._element.getAttribute('aria-label') && !this._element.textContent) { + this._element.setAttribute('aria-label', title); } - clearTimeout(context._timeout); - context._hoverState = HOVER_STATE_SHOW; + this._element.removeAttribute('title'); + } - if (!context._config.delay || !context._config.delay.show) { - context.show(); + _enter() { + if (this._isShown() || this._isHovered) { + this._isHovered = true; return; } - context._timeout = setTimeout(() => { - if (context._hoverState === HOVER_STATE_SHOW) { - context.show(); + this._isHovered = true; + + this._setTimeout(() => { + if (this._isHovered) { + this.show(); } - }, context._config.delay.show); + }, this._config.delay.show); } - _leave(event, context) { - context = this._initializeOnDelegatedTarget(event, context); - - if (event) { - context._activeTrigger[event.type === 'focusout' ? TRIGGER_FOCUS : TRIGGER_HOVER] = context._element.contains(event.relatedTarget); - } - - if (context._isWithActiveTrigger()) { + _leave() { + if (this._isWithActiveTrigger()) { return; } - clearTimeout(context._timeout); - context._hoverState = HOVER_STATE_OUT; + this._isHovered = false; - if (!context._config.delay || !context._config.delay.hide) { - context.hide(); - return; - } - - context._timeout = setTimeout(() => { - if (context._hoverState === HOVER_STATE_OUT) { - context.hide(); + this._setTimeout(() => { + if (!this._isHovered) { + this.hide(); } - }, context._config.delay.hide); + }, this._config.delay.hide); } - _isWithActiveTrigger() { - for (const trigger in this._activeTrigger) { - if (this._activeTrigger[trigger]) { - return true; - } - } + _setTimeout(handler, timeout) { + clearTimeout(this._timeout); + this._timeout = setTimeout(handler, timeout); + } - return false; + _isWithActiveTrigger() { + return Object.values(this._activeTrigger).includes(true); } _getConfig(config) { const dataAttributes = Manipulator__default.default.getDataAttributes(this._element); - Object.keys(dataAttributes).forEach(dataAttr => { - if (DISALLOWED_ATTRIBUTES.has(dataAttr)) { - delete dataAttributes[dataAttr]; + + for (const dataAttribute of Object.keys(dataAttributes)) { + if (DISALLOWED_ATTRIBUTES.has(dataAttribute)) { + delete dataAttributes[dataAttribute]; } - }); - config = { ...this.constructor.Default, - ...dataAttributes, + } + + config = { ...dataAttributes, ...(typeof config === 'object' && config ? config : {}) }; - config.container = config.container === false ? document.body : getElement(config.container); + config = this._mergeConfigObj(config); + config = this._configAfterMerge(config); + + this._typeCheckConfig(config); + + return config; + } + + _configAfterMerge(config) { + config.container = config.container === false ? document.body : index.getElement(config.container); if (typeof config.delay === 'number') { config.delay = { @@ -904,6 +597,9 @@ }; } + config.originalTitle = this._element.getAttribute('title') || ''; + config.title = this._resolvePossibleFunction(config.title) || config.originalTitle; + if (typeof config.title === 'number') { config.title = config.title.toString(); } @@ -912,12 +608,6 @@ config.content = config.content.toString(); } - typeCheckConfig(NAME, config, this.constructor.DefaultType); - - if (config.sanitize) { - config.template = sanitizeHtml(config.template, config.allowList, config.sanitizeFn); - } - return config; } @@ -936,36 +626,6 @@ return config; } - _cleanTipClass() { - const tip = this.getTipElement(); - const basicClassPrefixRegex = new RegExp(`(^|\\s)${this._getBasicClassPrefix()}\\S+`, 'g'); - const tabClass = tip.getAttribute('class').match(basicClassPrefixRegex); - - if (tabClass !== null && tabClass.length > 0) { - tabClass.map(token => token.trim()).forEach(tClass => tip.classList.remove(tClass)); - } - } - - _getBasicClassPrefix() { - return CLASS_PREFIX; - } - - _handlePopperPlacementChange(popperData) { - const { - state - } = popperData; - - if (!state) { - return; - } - - this.tip = state.elements.popper; - - this._cleanTipClass(); - - this._addAttachmentClass(this._getAttachment(state.placement)); - } - _disposePopper() { if (this._popper) { this._popper.destroy(); @@ -979,26 +639,25 @@ return this.each(function () { const data = Tooltip.getOrCreateInstance(this, config); - if (typeof config === 'string') { - if (typeof data[config] === 'undefined') { - throw new TypeError(`No method named "${config}"`); - } + if (typeof config !== 'string') { + return; + } - data[config](); + if (typeof data[config] === 'undefined') { + throw new TypeError(`No method named "${config}"`); } + + data[config](); }); } } /** - * ------------------------------------------------------------------------ * jQuery - * ------------------------------------------------------------------------ - * add .Tooltip to jQuery only if jQuery is present */ - defineJQueryPlugin(Tooltip); + index.defineJQueryPlugin(Tooltip); return Tooltip; -- cgit v1.2.3 From edf9c40956d19e6ab3f9151bfe0dfac6be06fa21 Mon Sep 17 00:00:00 2001 From: XhmikosR Date: Tue, 19 Jul 2022 18:43:58 +0300 Subject: Release v5.2.0 (#36768) * Bump version to 5.2.0 * Dist * Update masthead.html --- js/dist/tooltip.js | 82 ++++++++++++++++++++++++++---------------------------- 1 file changed, 40 insertions(+), 42 deletions(-) (limited to 'js/dist/tooltip.js') diff --git a/js/dist/tooltip.js b/js/dist/tooltip.js index 9af74c8db..56744f188 100644 --- a/js/dist/tooltip.js +++ b/js/dist/tooltip.js @@ -1,5 +1,5 @@ /*! - * Bootstrap tooltip.js v5.2.0-beta1 (https://getbootstrap.com/) + * Bootstrap tooltip.js v5.2.0 (https://getbootstrap.com/) * Copyright 2011-2022 The Bootstrap Authors (https://github.com/twbs/bootstrap/graphs/contributors) * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE) */ @@ -37,7 +37,7 @@ /** * -------------------------------------------------------------------------- - * Bootstrap (v5.2.0-beta1): tooltip.js + * Bootstrap (v5.2.0): tooltip.js * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE) * -------------------------------------------------------------------------- */ @@ -75,42 +75,42 @@ LEFT: index.isRTL() ? 'right' : 'left' }; const Default = { + allowList: sanitizer.DefaultAllowlist, animation: true, - template: '', - trigger: 'hover focus', - title: '', + boundary: 'clippingParents', + container: false, + customClass: '', delay: 0, + fallbackPlacements: ['top', 'right', 'bottom', 'left'], html: false, - selector: false, - placement: 'top', offset: [0, 0], - container: false, - fallbackPlacements: ['top', 'right', 'bottom', 'left'], - boundary: 'clippingParents', - customClass: '', + placement: 'top', + popperConfig: null, sanitize: true, sanitizeFn: null, - allowList: sanitizer.DefaultAllowlist, - popperConfig: null + selector: false, + template: '', + title: '', + trigger: 'hover focus' }; const DefaultType = { + allowList: 'object', animation: 'boolean', - template: 'string', - title: '(string|element|function)', - trigger: 'string', + boundary: '(string|element)', + container: '(string|element|boolean)', + customClass: '(string|function)', delay: '(number|object)', + fallbackPlacements: 'array', html: 'boolean', - selector: '(string|boolean)', - placement: '(string|function)', offset: '(array|string|function)', - container: '(string|element|boolean)', - fallbackPlacements: 'array', - boundary: '(string|element)', - customClass: '(string|function)', + placement: '(string|function)', + popperConfig: '(null|object|function)', sanitize: 'boolean', sanitizeFn: '(null|function)', - allowList: 'object', - popperConfig: '(null|object|function)' + selector: '(string|boolean)', + template: 'string', + title: '(string|element|function)', + trigger: 'string' }; /** * Class definition @@ -129,7 +129,8 @@ this._isHovered = false; this._activeTrigger = {}; this._popper = null; - this._templateFactory = null; // Protected + this._templateFactory = null; + this._newContent = null; // Protected this.tip = null; @@ -219,6 +220,12 @@ if (showEvent.defaultPrevented || !isInTheDom) { return; + } // todo v6 remove this OR make it optional + + + if (this.tip) { + this.tip.remove(); + this.tip = null; } const tip = this._getTipElement(); @@ -237,7 +244,7 @@ if (this._popper) { this._popper.update(); } else { - this._createPopper(tip); + this._popper = this._createPopper(tip); } tip.classList.add(CLASS_NAME_SHOW); // If this is a touch-enabled device we add extra @@ -323,7 +330,7 @@ _getTipElement() { if (!this.tip) { - this.tip = this._createTipElement(this._getContentForTemplate()); + this.tip = this._createTipElement(this._newContent || this._getContentForTemplate()); } return this.tip; @@ -351,19 +358,11 @@ } setContent(content) { - let isShown = false; - - if (this.tip) { - isShown = this._isShown(); - this.tip.remove(); - this.tip = null; - } - - this._disposePopper(); + this._newContent = content; - this.tip = this._createTipElement(content); + if (this._isShown()) { + this._disposePopper(); - if (isShown) { this.show(); } } @@ -390,7 +389,7 @@ } _getTitle() { - return this._config.title; + return this._resolvePossibleFunction(this._config.title) || this._config.originalTitle; } // Private @@ -409,7 +408,7 @@ _createPopper(tip) { const placement = typeof this._config.placement === 'function' ? this._config.placement.call(this, tip, this._element) : this._config.placement; const attachment = AttachmentMap[placement.toUpperCase()]; - this._popper = Popper__namespace.createPopper(this._element, tip, this._getPopperConfig(attachment)); + return Popper__namespace.createPopper(this._element, tip, this._getPopperConfig(attachment)); } _getOffset() { @@ -522,7 +521,7 @@ return; } - if (!this._element.getAttribute('aria-label') && !this._element.textContent) { + if (!this._element.getAttribute('aria-label') && !this._element.textContent.trim()) { this._element.setAttribute('aria-label', title); } @@ -598,7 +597,6 @@ } config.originalTitle = this._element.getAttribute('title') || ''; - config.title = this._resolvePossibleFunction(config.title) || config.originalTitle; if (typeof config.title === 'number') { config.title = config.title.toString(); -- cgit v1.2.3 From 23e50829f958ea1d741d63e2781716be037e4644 Mon Sep 17 00:00:00 2001 From: XhmikosR Date: Wed, 7 Sep 2022 18:31:39 +0300 Subject: Release v5.2.1 (#37098) * Bump version to v5.2.1. * Dist --- js/dist/tooltip.js | 18 +++++++++++------- 1 file changed, 11 insertions(+), 7 deletions(-) (limited to 'js/dist/tooltip.js') diff --git a/js/dist/tooltip.js b/js/dist/tooltip.js index 56744f188..73eeffafc 100644 --- a/js/dist/tooltip.js +++ b/js/dist/tooltip.js @@ -1,5 +1,5 @@ /*! - * Bootstrap tooltip.js v5.2.0 (https://getbootstrap.com/) + * Bootstrap tooltip.js v5.2.1 (https://getbootstrap.com/) * Copyright 2011-2022 The Bootstrap Authors (https://github.com/twbs/bootstrap/graphs/contributors) * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE) */ @@ -37,7 +37,7 @@ /** * -------------------------------------------------------------------------- - * Bootstrap (v5.2.0): tooltip.js + * Bootstrap (v5.2.1): tooltip.js * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE) * -------------------------------------------------------------------------- */ @@ -126,7 +126,7 @@ this._isEnabled = true; this._timeout = 0; - this._isHovered = false; + this._isHovered = null; this._activeTrigger = {}; this._popper = null; this._templateFactory = null; @@ -199,6 +199,10 @@ this.tip.remove(); } + if (this._config.originalTitle) { + this._element.setAttribute('title', this._config.originalTitle); + } + this._disposePopper(); super.dispose(); @@ -259,13 +263,13 @@ } const complete = () => { - const previousHoverState = this._isHovered; - this._isHovered = false; EventHandler__default.default.trigger(this._element, this.constructor.eventName(EVENT_SHOWN)); - if (previousHoverState) { + if (this._isHovered === false) { this._leave(); } + + this._isHovered = false; }; this._queueCallback(complete, this.tip, this._isAnimated()); @@ -296,7 +300,7 @@ this._activeTrigger[TRIGGER_CLICK] = false; this._activeTrigger[TRIGGER_FOCUS] = false; this._activeTrigger[TRIGGER_HOVER] = false; - this._isHovered = false; + this._isHovered = null; // it is a trick to support manual triggering const complete = () => { if (this._isWithActiveTrigger()) { -- cgit v1.2.3 From 961d5ff9844372a4e294980c667bbe7e0651cdeb Mon Sep 17 00:00:00 2001 From: XhmikosR Date: Mon, 3 Oct 2022 10:44:02 +0300 Subject: Release v5.2.2 (#37236) * Bump version to v5.2.2 * Dist --- js/dist/tooltip.js | 58 ++++++++++++++++++++++-------------------------------- 1 file changed, 24 insertions(+), 34 deletions(-) (limited to 'js/dist/tooltip.js') diff --git a/js/dist/tooltip.js b/js/dist/tooltip.js index 73eeffafc..cc46139e4 100644 --- a/js/dist/tooltip.js +++ b/js/dist/tooltip.js @@ -1,5 +1,5 @@ /*! - * Bootstrap tooltip.js v5.2.1 (https://getbootstrap.com/) + * Bootstrap tooltip.js v5.2.2 (https://getbootstrap.com/) * Copyright 2011-2022 The Bootstrap Authors (https://github.com/twbs/bootstrap/graphs/contributors) * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE) */ @@ -37,7 +37,7 @@ /** * -------------------------------------------------------------------------- - * Bootstrap (v5.2.1): tooltip.js + * Bootstrap (v5.2.2): tooltip.js * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE) * -------------------------------------------------------------------------- */ @@ -135,6 +135,10 @@ this.tip = null; this._setListeners(); + + if (!this._config.selector) { + this._fixTitle(); + } } // Getters @@ -163,24 +167,12 @@ this._isEnabled = !this._isEnabled; } - toggle(event) { + toggle() { if (!this._isEnabled) { return; } - if (event) { - const context = this._initializeOnDelegatedTarget(event); - - context._activeTrigger.click = !context._activeTrigger.click; - - if (context._isWithActiveTrigger()) { - context._enter(); - } else { - context._leave(); - } - - return; - } + this._activeTrigger.click = !this._activeTrigger.click; if (this._isShown()) { this._leave(); @@ -199,8 +191,8 @@ this.tip.remove(); } - if (this._config.originalTitle) { - this._element.setAttribute('title', this._config.originalTitle); + if (this._element.getAttribute('data-bs-original-title')) { + this._element.setAttribute('title', this._element.getAttribute('data-bs-original-title')); } this._disposePopper(); @@ -393,7 +385,7 @@ } _getTitle() { - return this._resolvePossibleFunction(this._config.title) || this._config.originalTitle; + return this._resolvePossibleFunction(this._config.title) || this._element.getAttribute('data-bs-original-title'); } // Private @@ -479,7 +471,11 @@ for (const trigger of triggers) { if (trigger === 'click') { - EventHandler__default.default.on(this._element, this.constructor.eventName(EVENT_CLICK), this._config.selector, event => this.toggle(event)); + EventHandler__default.default.on(this._element, this.constructor.eventName(EVENT_CLICK), this._config.selector, event => { + const context = this._initializeOnDelegatedTarget(event); + + context.toggle(); + }); } else if (trigger !== TRIGGER_MANUAL) { const eventIn = trigger === TRIGGER_HOVER ? this.constructor.eventName(EVENT_MOUSEENTER) : this.constructor.eventName(EVENT_FOCUSIN); const eventOut = trigger === TRIGGER_HOVER ? this.constructor.eventName(EVENT_MOUSELEAVE) : this.constructor.eventName(EVENT_FOCUSOUT); @@ -507,19 +503,10 @@ }; EventHandler__default.default.on(this._element.closest(SELECTOR_MODAL), EVENT_MODAL_HIDE, this._hideModalHandler); - - if (this._config.selector) { - this._config = { ...this._config, - trigger: 'manual', - selector: '' - }; - } else { - this._fixTitle(); - } } _fixTitle() { - const title = this._config.originalTitle; + const title = this._element.getAttribute('title'); if (!title) { return; @@ -529,6 +516,9 @@ this._element.setAttribute('aria-label', title); } + this._element.setAttribute('data-bs-original-title', title); // DO NOT USE IT. Is only for backwards compatibility + + this._element.removeAttribute('title'); } @@ -600,8 +590,6 @@ }; } - config.originalTitle = this._element.getAttribute('title') || ''; - if (typeof config.title === 'number') { config.title = config.title.toString(); } @@ -620,11 +608,13 @@ if (this.constructor.Default[key] !== this._config[key]) { config[key] = this._config[key]; } - } // In the future can be replaced with: + } + + config.selector = false; + config.trigger = 'manual'; // In the future can be replaced with: // const keysWithDifferentValues = Object.entries(this._config).filter(entry => this.constructor.Default[entry[0]] !== this._config[entry[0]]) // `Object.fromEntries(keysWithDifferentValues)` - return config; } -- cgit v1.2.3 From cb021439c683d9805e2864c58095b92d405e9b11 Mon Sep 17 00:00:00 2001 From: XhmikosR Date: Mon, 21 Nov 2022 20:19:01 +0200 Subject: Dist --- js/dist/tooltip.js | 29 ++++++++++------------------- 1 file changed, 10 insertions(+), 19 deletions(-) (limited to 'js/dist/tooltip.js') diff --git a/js/dist/tooltip.js b/js/dist/tooltip.js index cc46139e4..5e86b8e7f 100644 --- a/js/dist/tooltip.js +++ b/js/dist/tooltip.js @@ -1,5 +1,5 @@ /*! - * Bootstrap tooltip.js v5.2.2 (https://getbootstrap.com/) + * Bootstrap tooltip.js v5.2.3 (https://getbootstrap.com/) * Copyright 2011-2022 The Bootstrap Authors (https://github.com/twbs/bootstrap/graphs/contributors) * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE) */ @@ -37,7 +37,7 @@ /** * -------------------------------------------------------------------------- - * Bootstrap (v5.2.2): tooltip.js + * Bootstrap (v5.2.3): tooltip.js * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE) * -------------------------------------------------------------------------- */ @@ -187,10 +187,6 @@ clearTimeout(this._timeout); EventHandler__default.default.off(this._element.closest(SELECTOR_MODAL), EVENT_MODAL_HIDE, this._hideModalHandler); - if (this.tip) { - this.tip.remove(); - } - if (this._element.getAttribute('data-bs-original-title')) { this._element.setAttribute('title', this._element.getAttribute('data-bs-original-title')); } @@ -219,10 +215,7 @@ } // todo v6 remove this OR make it optional - if (this.tip) { - this.tip.remove(); - this.tip = null; - } + this._disposePopper(); const tip = this._getTipElement(); @@ -237,12 +230,7 @@ EventHandler__default.default.trigger(this._element, this.constructor.eventName(EVENT_INSERTED)); } - if (this._popper) { - this._popper.update(); - } else { - this._popper = this._createPopper(tip); - } - + this._popper = this._createPopper(tip); tip.classList.add(CLASS_NAME_SHOW); // 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 @@ -300,14 +288,12 @@ } if (!this._isHovered) { - tip.remove(); + this._disposePopper(); } this._element.removeAttribute('aria-describedby'); EventHandler__default.default.trigger(this._element, this.constructor.eventName(EVENT_HIDDEN)); - - this._disposePopper(); }; this._queueCallback(complete, this.tip, this._isAnimated()); @@ -624,6 +610,11 @@ this._popper = null; } + + if (this.tip) { + this.tip.remove(); + this.tip = null; + } } // Static -- cgit v1.2.3 From cf9454caa00872899215603e5e036d9a824b1b11 Mon Sep 17 00:00:00 2001 From: XhmikosR Date: Sat, 24 Dec 2022 18:37:22 +0200 Subject: Release v5.3.0-alpha1 (#37661) * Bump version to 5.3.0-alpha1 * Dist * Add docs versions updates * Update note in homepage hero Co-authored-by: Mark Otto --- js/dist/tooltip.js | 243 +++++++++++++++-------------------------------------- 1 file changed, 70 insertions(+), 173 deletions(-) (limited to 'js/dist/tooltip.js') diff --git a/js/dist/tooltip.js b/js/dist/tooltip.js index 5e86b8e7f..7d4d852f4 100644 --- a/js/dist/tooltip.js +++ b/js/dist/tooltip.js @@ -1,18 +1,15 @@ /*! - * Bootstrap tooltip.js v5.2.3 (https://getbootstrap.com/) + * Bootstrap tooltip.js v5.3.0-alpha1 (https://getbootstrap.com/) * Copyright 2011-2022 The Bootstrap Authors (https://github.com/twbs/bootstrap/graphs/contributors) * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE) */ (function (global, factory) { - typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory(require('@popperjs/core'), require('./util/index'), require('./util/sanitizer'), require('./dom/event-handler'), require('./dom/manipulator'), require('./base-component'), require('./util/template-factory')) : + typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory(require('@popperjs/core'), require('./util/index.js'), require('./util/sanitizer.js'), require('./dom/event-handler.js'), require('./dom/manipulator.js'), require('./base-component.js'), require('./util/template-factory.js')) : typeof define === 'function' && define.amd ? define(['@popperjs/core', './util/index', './util/sanitizer', './dom/event-handler', './dom/manipulator', './base-component', './util/template-factory'], factory) : (global = typeof globalThis !== 'undefined' ? globalThis : global || self, global.Tooltip = factory(global["@popperjs/core"], global.Index, global.Sanitizer, global.EventHandler, global.Manipulator, global.BaseComponent, global.TemplateFactory)); -})(this, (function (Popper, index, sanitizer, EventHandler, Manipulator, BaseComponent, TemplateFactory) { 'use strict'; +})(this, (function (Popper, index_js, sanitizer_js, EventHandler, Manipulator, BaseComponent, TemplateFactory) { 'use strict'; - const _interopDefaultLegacy = e => e && typeof e === 'object' && 'default' in e ? e : { default: e }; - - function _interopNamespace(e) { - if (e && e.__esModule) return e; + function _interopNamespaceDefault(e) { const n = Object.create(null, { [Symbol.toStringTag]: { value: 'Module' } }); if (e) { for (const k in e) { @@ -29,18 +26,15 @@ return Object.freeze(n); } - const Popper__namespace = /*#__PURE__*/_interopNamespace(Popper); - const EventHandler__default = /*#__PURE__*/_interopDefaultLegacy(EventHandler); - const Manipulator__default = /*#__PURE__*/_interopDefaultLegacy(Manipulator); - const BaseComponent__default = /*#__PURE__*/_interopDefaultLegacy(BaseComponent); - const TemplateFactory__default = /*#__PURE__*/_interopDefaultLegacy(TemplateFactory); + const Popper__namespace = /*#__PURE__*/_interopNamespaceDefault(Popper); /** * -------------------------------------------------------------------------- - * Bootstrap (v5.2.3): tooltip.js + * Bootstrap (v5.3.0-alpha1): tooltip.js * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE) * -------------------------------------------------------------------------- */ + /** * Constants */ @@ -70,12 +64,12 @@ const AttachmentMap = { AUTO: 'auto', TOP: 'top', - RIGHT: index.isRTL() ? 'left' : 'right', + RIGHT: index_js.isRTL() ? 'left' : 'right', BOTTOM: 'bottom', - LEFT: index.isRTL() ? 'right' : 'left' + LEFT: index_js.isRTL() ? 'right' : 'left' }; const Default = { - allowList: sanitizer.DefaultAllowlist, + allowList: sanitizer_js.DefaultAllowlist, animation: true, boundary: 'clippingParents', container: false, @@ -112,171 +106,140 @@ title: '(string|element|function)', trigger: 'string' }; + /** * Class definition */ - class Tooltip extends BaseComponent__default.default { + class Tooltip extends BaseComponent { constructor(element, config) { if (typeof Popper__namespace === 'undefined') { throw new TypeError('Bootstrap\'s tooltips require Popper (https://popper.js.org)'); } + super(element, config); - super(element, config); // Private - + // Private this._isEnabled = true; this._timeout = 0; this._isHovered = null; this._activeTrigger = {}; this._popper = null; this._templateFactory = null; - this._newContent = null; // Protected + this._newContent = null; + // Protected this.tip = null; - this._setListeners(); - if (!this._config.selector) { this._fixTitle(); } - } // Getters - + } + // Getters static get Default() { return Default; } - static get DefaultType() { return DefaultType; } - static get NAME() { return NAME; - } // Public - + } + // Public enable() { this._isEnabled = true; } - disable() { this._isEnabled = false; } - toggleEnabled() { this._isEnabled = !this._isEnabled; } - toggle() { if (!this._isEnabled) { return; } - this._activeTrigger.click = !this._activeTrigger.click; - if (this._isShown()) { this._leave(); - return; } - this._enter(); } - dispose() { clearTimeout(this._timeout); - EventHandler__default.default.off(this._element.closest(SELECTOR_MODAL), EVENT_MODAL_HIDE, this._hideModalHandler); - + EventHandler.off(this._element.closest(SELECTOR_MODAL), EVENT_MODAL_HIDE, this._hideModalHandler); if (this._element.getAttribute('data-bs-original-title')) { this._element.setAttribute('title', this._element.getAttribute('data-bs-original-title')); } - this._disposePopper(); - super.dispose(); } - show() { if (this._element.style.display === 'none') { throw new Error('Please use show on visible elements'); } - if (!(this._isWithContent() && this._isEnabled)) { return; } - - const showEvent = EventHandler__default.default.trigger(this._element, this.constructor.eventName(EVENT_SHOW)); - const shadowRoot = index.findShadowRoot(this._element); - + const showEvent = EventHandler.trigger(this._element, this.constructor.eventName(EVENT_SHOW)); + const shadowRoot = index_js.findShadowRoot(this._element); const isInTheDom = (shadowRoot || this._element.ownerDocument.documentElement).contains(this._element); - if (showEvent.defaultPrevented || !isInTheDom) { return; - } // todo v6 remove this OR make it optional - + } + // todo v6 remove this OR make it optional this._disposePopper(); - const tip = this._getTipElement(); - this._element.setAttribute('aria-describedby', tip.getAttribute('id')); - const { container } = this._config; - if (!this._element.ownerDocument.documentElement.contains(this.tip)) { container.append(tip); - EventHandler__default.default.trigger(this._element, this.constructor.eventName(EVENT_INSERTED)); + EventHandler.trigger(this._element, this.constructor.eventName(EVENT_INSERTED)); } - this._popper = this._createPopper(tip); - tip.classList.add(CLASS_NAME_SHOW); // If this is a touch-enabled device we add extra + tip.classList.add(CLASS_NAME_SHOW); + + // 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 // https://www.quirksmode.org/blog/archives/2014/02/mouse_event_bub.html - if ('ontouchstart' in document.documentElement) { for (const element of [].concat(...document.body.children)) { - EventHandler__default.default.on(element, 'mouseover', index.noop); + EventHandler.on(element, 'mouseover', index_js.noop); } } - const complete = () => { - EventHandler__default.default.trigger(this._element, this.constructor.eventName(EVENT_SHOWN)); - + EventHandler.trigger(this._element, this.constructor.eventName(EVENT_SHOWN)); if (this._isHovered === false) { this._leave(); } - this._isHovered = false; }; - this._queueCallback(complete, this.tip, this._isAnimated()); } - hide() { if (!this._isShown()) { return; } - - const hideEvent = EventHandler__default.default.trigger(this._element, this.constructor.eventName(EVENT_HIDE)); - + const hideEvent = EventHandler.trigger(this._element, this.constructor.eventName(EVENT_HIDE)); if (hideEvent.defaultPrevented) { return; } - const tip = this._getTipElement(); + tip.classList.remove(CLASS_NAME_SHOW); - tip.classList.remove(CLASS_NAME_SHOW); // If this is a touch-enabled device we remove the extra + // If this is a touch-enabled device we remove the extra // empty mouseover listeners we added for iOS support - if ('ontouchstart' in document.documentElement) { for (const element of [].concat(...document.body.children)) { - EventHandler__default.default.off(element, 'mouseover', index.noop); + EventHandler.off(element, 'mouseover', index_js.noop); } } - this._activeTrigger[TRIGGER_CLICK] = false; this._activeTrigger[TRIGGER_FOCUS] = false; this._activeTrigger[TRIGGER_HOVER] = false; @@ -286,133 +249,107 @@ if (this._isWithActiveTrigger()) { return; } - if (!this._isHovered) { this._disposePopper(); } - this._element.removeAttribute('aria-describedby'); - - EventHandler__default.default.trigger(this._element, this.constructor.eventName(EVENT_HIDDEN)); + EventHandler.trigger(this._element, this.constructor.eventName(EVENT_HIDDEN)); }; - this._queueCallback(complete, this.tip, this._isAnimated()); } - update() { if (this._popper) { this._popper.update(); } - } // Protected - + } + // Protected _isWithContent() { return Boolean(this._getTitle()); } - _getTipElement() { if (!this.tip) { this.tip = this._createTipElement(this._newContent || this._getContentForTemplate()); } - return this.tip; } - _createTipElement(content) { - const tip = this._getTemplateFactory(content).toHtml(); // todo: remove this check on v6 - + const tip = this._getTemplateFactory(content).toHtml(); + // todo: remove this check on v6 if (!tip) { return null; } - - tip.classList.remove(CLASS_NAME_FADE, CLASS_NAME_SHOW); // todo: on v6 the following can be achieved with CSS only - + tip.classList.remove(CLASS_NAME_FADE, CLASS_NAME_SHOW); + // todo: on v6 the following can be achieved with CSS only tip.classList.add(`bs-${this.constructor.NAME}-auto`); - const tipId = index.getUID(this.constructor.NAME).toString(); + const tipId = index_js.getUID(this.constructor.NAME).toString(); tip.setAttribute('id', tipId); - if (this._isAnimated()) { tip.classList.add(CLASS_NAME_FADE); } - return tip; } - setContent(content) { this._newContent = content; - if (this._isShown()) { this._disposePopper(); - this.show(); } } - _getTemplateFactory(content) { if (this._templateFactory) { this._templateFactory.changeContent(content); } else { - this._templateFactory = new TemplateFactory__default.default({ ...this._config, + this._templateFactory = new TemplateFactory({ + ...this._config, // the `content` var has to be after `this._config` // to override config.content in case of popover content, extraClass: this._resolvePossibleFunction(this._config.customClass) }); } - return this._templateFactory; } - _getContentForTemplate() { return { [SELECTOR_TOOLTIP_INNER]: this._getTitle() }; } - _getTitle() { return this._resolvePossibleFunction(this._config.title) || this._element.getAttribute('data-bs-original-title'); - } // Private - + } + // Private _initializeOnDelegatedTarget(event) { return this.constructor.getOrCreateInstance(event.delegateTarget, this._getDelegateConfig()); } - _isAnimated() { return this._config.animation || this.tip && this.tip.classList.contains(CLASS_NAME_FADE); } - _isShown() { return this.tip && this.tip.classList.contains(CLASS_NAME_SHOW); } - _createPopper(tip) { - const placement = typeof this._config.placement === 'function' ? this._config.placement.call(this, tip, this._element) : this._config.placement; + const placement = index_js.execute(this._config.placement, [this, tip, this._element]); const attachment = AttachmentMap[placement.toUpperCase()]; return Popper__namespace.createPopper(this._element, tip, this._getPopperConfig(attachment)); } - _getOffset() { const { offset } = this._config; - if (typeof offset === 'string') { return offset.split(',').map(value => Number.parseInt(value, 10)); } - if (typeof offset === 'function') { return popperData => offset(popperData, this._element); } - return offset; } - _resolvePossibleFunction(arg) { - return typeof arg === 'function' ? arg.call(this._element) : arg; + return index_js.execute(arg, [this._element]); } - _getPopperConfig(attachment) { const defaultBsPopperConfig = { placement: attachment, @@ -447,200 +384,160 @@ } }] }; - return { ...defaultBsPopperConfig, - ...(typeof this._config.popperConfig === 'function' ? this._config.popperConfig(defaultBsPopperConfig) : this._config.popperConfig) + return { + ...defaultBsPopperConfig, + ...index_js.execute(this._config.popperConfig, [defaultBsPopperConfig]) }; } - _setListeners() { const triggers = this._config.trigger.split(' '); - for (const trigger of triggers) { if (trigger === 'click') { - EventHandler__default.default.on(this._element, this.constructor.eventName(EVENT_CLICK), this._config.selector, event => { + EventHandler.on(this._element, this.constructor.eventName(EVENT_CLICK), this._config.selector, event => { const context = this._initializeOnDelegatedTarget(event); - context.toggle(); }); } else if (trigger !== TRIGGER_MANUAL) { const eventIn = trigger === TRIGGER_HOVER ? this.constructor.eventName(EVENT_MOUSEENTER) : this.constructor.eventName(EVENT_FOCUSIN); const eventOut = trigger === TRIGGER_HOVER ? this.constructor.eventName(EVENT_MOUSELEAVE) : this.constructor.eventName(EVENT_FOCUSOUT); - EventHandler__default.default.on(this._element, eventIn, this._config.selector, event => { + EventHandler.on(this._element, eventIn, this._config.selector, event => { const context = this._initializeOnDelegatedTarget(event); - context._activeTrigger[event.type === 'focusin' ? TRIGGER_FOCUS : TRIGGER_HOVER] = true; - context._enter(); }); - EventHandler__default.default.on(this._element, eventOut, this._config.selector, event => { + EventHandler.on(this._element, eventOut, this._config.selector, event => { const context = this._initializeOnDelegatedTarget(event); - context._activeTrigger[event.type === 'focusout' ? TRIGGER_FOCUS : TRIGGER_HOVER] = context._element.contains(event.relatedTarget); - context._leave(); }); } } - this._hideModalHandler = () => { if (this._element) { this.hide(); } }; - - EventHandler__default.default.on(this._element.closest(SELECTOR_MODAL), EVENT_MODAL_HIDE, this._hideModalHandler); + EventHandler.on(this._element.closest(SELECTOR_MODAL), EVENT_MODAL_HIDE, this._hideModalHandler); } - _fixTitle() { const title = this._element.getAttribute('title'); - if (!title) { return; } - if (!this._element.getAttribute('aria-label') && !this._element.textContent.trim()) { this._element.setAttribute('aria-label', title); } - this._element.setAttribute('data-bs-original-title', title); // DO NOT USE IT. Is only for backwards compatibility - - this._element.removeAttribute('title'); } - _enter() { if (this._isShown() || this._isHovered) { this._isHovered = true; return; } - this._isHovered = true; - this._setTimeout(() => { if (this._isHovered) { this.show(); } }, this._config.delay.show); } - _leave() { if (this._isWithActiveTrigger()) { return; } - this._isHovered = false; - this._setTimeout(() => { if (!this._isHovered) { this.hide(); } }, this._config.delay.hide); } - _setTimeout(handler, timeout) { clearTimeout(this._timeout); this._timeout = setTimeout(handler, timeout); } - _isWithActiveTrigger() { return Object.values(this._activeTrigger).includes(true); } - _getConfig(config) { - const dataAttributes = Manipulator__default.default.getDataAttributes(this._element); - + const dataAttributes = Manipulator.getDataAttributes(this._element); for (const dataAttribute of Object.keys(dataAttributes)) { if (DISALLOWED_ATTRIBUTES.has(dataAttribute)) { delete dataAttributes[dataAttribute]; } } - - config = { ...dataAttributes, + config = { + ...dataAttributes, ...(typeof config === 'object' && config ? config : {}) }; config = this._mergeConfigObj(config); config = this._configAfterMerge(config); - this._typeCheckConfig(config); - return config; } - _configAfterMerge(config) { - config.container = config.container === false ? document.body : index.getElement(config.container); - + config.container = config.container === false ? document.body : index_js.getElement(config.container); if (typeof config.delay === 'number') { config.delay = { show: config.delay, hide: config.delay }; } - if (typeof config.title === 'number') { config.title = config.title.toString(); } - if (typeof config.content === 'number') { config.content = config.content.toString(); } - return config; } - _getDelegateConfig() { const config = {}; - - for (const key in this._config) { - if (this.constructor.Default[key] !== this._config[key]) { - config[key] = this._config[key]; + for (const [key, value] of Object.entries(this._config)) { + if (this.constructor.Default[key] !== value) { + config[key] = value; } } - config.selector = false; - config.trigger = 'manual'; // In the future can be replaced with: + config.trigger = 'manual'; + + // In the future can be replaced with: // const keysWithDifferentValues = Object.entries(this._config).filter(entry => this.constructor.Default[entry[0]] !== this._config[entry[0]]) // `Object.fromEntries(keysWithDifferentValues)` - return config; } - _disposePopper() { if (this._popper) { this._popper.destroy(); - this._popper = null; } - if (this.tip) { this.tip.remove(); this.tip = null; } - } // Static - + } + // Static static jQueryInterface(config) { return this.each(function () { const data = Tooltip.getOrCreateInstance(this, config); - if (typeof config !== 'string') { return; } - if (typeof data[config] === 'undefined') { throw new TypeError(`No method named "${config}"`); } - data[config](); }); } - } + /** * jQuery */ - - index.defineJQueryPlugin(Tooltip); + index_js.defineJQueryPlugin(Tooltip); return Tooltip; -- cgit v1.2.3 From c877cefcef18d6a60c5eaec8df469933e64e212a Mon Sep 17 00:00:00 2001 From: XhmikosR Date: Fri, 24 Mar 2023 16:30:16 +0200 Subject: Release v5.3.0-alpha2 (#38244) * Bump version to 5.3.0-alpha2 * Dist --- js/dist/tooltip.js | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) (limited to 'js/dist/tooltip.js') diff --git a/js/dist/tooltip.js b/js/dist/tooltip.js index 7d4d852f4..87906eaec 100644 --- a/js/dist/tooltip.js +++ b/js/dist/tooltip.js @@ -1,6 +1,6 @@ /*! - * Bootstrap tooltip.js v5.3.0-alpha1 (https://getbootstrap.com/) - * Copyright 2011-2022 The Bootstrap Authors (https://github.com/twbs/bootstrap/graphs/contributors) + * Bootstrap tooltip.js v5.3.0-alpha2 (https://getbootstrap.com/) + * Copyright 2011-2023 The Bootstrap Authors (https://github.com/twbs/bootstrap/graphs/contributors) * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE) */ (function (global, factory) { @@ -30,7 +30,7 @@ /** * -------------------------------------------------------------------------- - * Bootstrap (v5.3.0-alpha1): tooltip.js + * Bootstrap tooltip.js * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE) * -------------------------------------------------------------------------- */ -- cgit v1.2.3 From ac576614a5515e429f27e756fad81d5aa05e95a6 Mon Sep 17 00:00:00 2001 From: XhmikosR Date: Mon, 3 Apr 2023 10:26:50 +0300 Subject: Release v5.3.0-alpha3 (#38357) * Bump version to 5.3.0-alpha3 * Dist --- js/dist/tooltip.js | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) (limited to 'js/dist/tooltip.js') diff --git a/js/dist/tooltip.js b/js/dist/tooltip.js index 87906eaec..642fce014 100644 --- a/js/dist/tooltip.js +++ b/js/dist/tooltip.js @@ -1,13 +1,13 @@ /*! - * Bootstrap tooltip.js v5.3.0-alpha2 (https://getbootstrap.com/) + * Bootstrap tooltip.js v5.3.0-alpha3 (https://getbootstrap.com/) * Copyright 2011-2023 The Bootstrap Authors (https://github.com/twbs/bootstrap/graphs/contributors) * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE) */ (function (global, factory) { - typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory(require('@popperjs/core'), require('./util/index.js'), require('./util/sanitizer.js'), require('./dom/event-handler.js'), require('./dom/manipulator.js'), require('./base-component.js'), require('./util/template-factory.js')) : - typeof define === 'function' && define.amd ? define(['@popperjs/core', './util/index', './util/sanitizer', './dom/event-handler', './dom/manipulator', './base-component', './util/template-factory'], factory) : - (global = typeof globalThis !== 'undefined' ? globalThis : global || self, global.Tooltip = factory(global["@popperjs/core"], global.Index, global.Sanitizer, global.EventHandler, global.Manipulator, global.BaseComponent, global.TemplateFactory)); -})(this, (function (Popper, index_js, sanitizer_js, EventHandler, Manipulator, BaseComponent, TemplateFactory) { 'use strict'; + typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory(require('@popperjs/core'), require('./base-component.js'), require('./dom/event-handler.js'), require('./dom/manipulator.js'), require('./util/index.js'), require('./util/sanitizer.js'), require('./util/template-factory.js')) : + typeof define === 'function' && define.amd ? define(['@popperjs/core', './base-component', './dom/event-handler', './dom/manipulator', './util/index', './util/sanitizer', './util/template-factory'], factory) : + (global = typeof globalThis !== 'undefined' ? globalThis : global || self, global.Tooltip = factory(global["@popperjs/core"], global.BaseComponent, global.EventHandler, global.Manipulator, global.Index, global.Sanitizer, global.TemplateFactory)); +})(this, (function (Popper, BaseComponent, EventHandler, Manipulator, index_js, sanitizer_js, TemplateFactory) { 'use strict'; function _interopNamespaceDefault(e) { const n = Object.create(null, { [Symbol.toStringTag]: { value: 'Module' } }); @@ -77,7 +77,7 @@ delay: 0, fallbackPlacements: ['top', 'right', 'bottom', 'left'], html: false, - offset: [0, 0], + offset: [0, 6], placement: 'top', popperConfig: null, sanitize: true, @@ -190,7 +190,7 @@ return; } - // todo v6 remove this OR make it optional + // TODO: v6 remove this or make it optional this._disposePopper(); const tip = this._getTipElement(); this._element.setAttribute('aria-describedby', tip.getAttribute('id')); @@ -276,12 +276,12 @@ _createTipElement(content) { const tip = this._getTemplateFactory(content).toHtml(); - // todo: remove this check on v6 + // TODO: remove this check in v6 if (!tip) { return null; } tip.classList.remove(CLASS_NAME_FADE, CLASS_NAME_SHOW); - // todo: on v6 the following can be achieved with CSS only + // TODO: v6 the following can be achieved with CSS only tip.classList.add(`bs-${this.constructor.NAME}-auto`); const tipId = index_js.getUID(this.constructor.NAME).toString(); tip.setAttribute('id', tipId); -- cgit v1.2.3 From 60098ac499d30aa50575b0b7137391c06ef25429 Mon Sep 17 00:00:00 2001 From: XhmikosR Date: Tue, 30 May 2023 18:15:55 +0300 Subject: Release v5.3.0 (#38657) * Bump version to 5.3.0 * Dist --- js/dist/tooltip.js | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) (limited to 'js/dist/tooltip.js') diff --git a/js/dist/tooltip.js b/js/dist/tooltip.js index 642fce014..3b718be0f 100644 --- a/js/dist/tooltip.js +++ b/js/dist/tooltip.js @@ -1,5 +1,5 @@ /*! - * Bootstrap tooltip.js v5.3.0-alpha3 (https://getbootstrap.com/) + * Bootstrap tooltip.js v5.3.0 (https://getbootstrap.com/) * Copyright 2011-2023 The Bootstrap Authors (https://github.com/twbs/bootstrap/graphs/contributors) * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE) */ @@ -35,6 +35,7 @@ * -------------------------------------------------------------------------- */ + /** * Constants */ -- cgit v1.2.3 From 2a1bf52b73fc9a97f6fef75aa1b29b3e9f0288b3 Mon Sep 17 00:00:00 2001 From: XhmikosR Date: Wed, 26 Jul 2023 10:46:38 +0300 Subject: Release v5.3.1 (#38956) * Bump version to 5.3.1 * Dist --- js/dist/tooltip.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'js/dist/tooltip.js') diff --git a/js/dist/tooltip.js b/js/dist/tooltip.js index 3b718be0f..a531c2a39 100644 --- a/js/dist/tooltip.js +++ b/js/dist/tooltip.js @@ -1,5 +1,5 @@ /*! - * Bootstrap tooltip.js v5.3.0 (https://getbootstrap.com/) + * Bootstrap tooltip.js v5.3.1 (https://getbootstrap.com/) * Copyright 2011-2023 The Bootstrap Authors (https://github.com/twbs/bootstrap/graphs/contributors) * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE) */ -- cgit v1.2.3 From 344e912d04b5b6a04482113eff20ab416ff01048 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Julien=20D=C3=A9ramond?= Date: Thu, 14 Sep 2023 16:19:27 +0200 Subject: Release v5.3.2 (#39173) * Bump version to 5.3.2 * Dist --- js/dist/tooltip.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'js/dist/tooltip.js') diff --git a/js/dist/tooltip.js b/js/dist/tooltip.js index a531c2a39..0b55bafe5 100644 --- a/js/dist/tooltip.js +++ b/js/dist/tooltip.js @@ -1,5 +1,5 @@ /*! - * Bootstrap tooltip.js v5.3.1 (https://getbootstrap.com/) + * Bootstrap tooltip.js v5.3.2 (https://getbootstrap.com/) * Copyright 2011-2023 The Bootstrap Authors (https://github.com/twbs/bootstrap/graphs/contributors) * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE) */ -- cgit v1.2.3 From 6e1f75f420f68e1d52733b8e407fc7c3766c9dba Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Julien=20D=C3=A9ramond?= Date: Tue, 20 Feb 2024 16:14:29 +0100 Subject: Release v5.3.3 (#39524) * Release v5.3.3 * Dist --------- Co-authored-by: XhmikosR --- js/dist/tooltip.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) (limited to 'js/dist/tooltip.js') diff --git a/js/dist/tooltip.js b/js/dist/tooltip.js index 0b55bafe5..541cd7d01 100644 --- a/js/dist/tooltip.js +++ b/js/dist/tooltip.js @@ -1,6 +1,6 @@ /*! - * Bootstrap tooltip.js v5.3.2 (https://getbootstrap.com/) - * Copyright 2011-2023 The Bootstrap Authors (https://github.com/twbs/bootstrap/graphs/contributors) + * Bootstrap tooltip.js v5.3.3 (https://getbootstrap.com/) + * Copyright 2011-2024 The Bootstrap Authors (https://github.com/twbs/bootstrap/graphs/contributors) * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE) */ (function (global, factory) { -- cgit v1.2.3