aboutsummaryrefslogtreecommitdiffstats
path: root/vendor/twbs/bootstrap/js/src/dom
diff options
context:
space:
mode:
authorMario <mario@mariovavti.com>2022-08-19 13:15:48 +0000
committerMario <mario@mariovavti.com>2022-08-19 13:15:48 +0000
commit185ddf1eaf82e08586be6c7689507ee924d9dd47 (patch)
tree218ff6da6fb1511a1b2823729607c7c4b13e30e9 /vendor/twbs/bootstrap/js/src/dom
parent7dee47183d05b6e1f7d5c5588e2df9993fb294dd (diff)
downloadvolse-hubzilla-185ddf1eaf82e08586be6c7689507ee924d9dd47.tar.gz
volse-hubzilla-185ddf1eaf82e08586be6c7689507ee924d9dd47.tar.bz2
volse-hubzilla-185ddf1eaf82e08586be6c7689507ee924d9dd47.zip
update to bootstrap 5.2 and fixes
Diffstat (limited to 'vendor/twbs/bootstrap/js/src/dom')
-rw-r--r--vendor/twbs/bootstrap/js/src/dom/data.js4
-rw-r--r--vendor/twbs/bootstrap/js/src/dom/event-handler.js188
-rw-r--r--vendor/twbs/bootstrap/js/src/dom/manipulator.js53
-rw-r--r--vendor/twbs/bootstrap/js/src/dom/selector-engine.js29
4 files changed, 113 insertions, 161 deletions
diff --git a/vendor/twbs/bootstrap/js/src/dom/data.js b/vendor/twbs/bootstrap/js/src/dom/data.js
index c702fc82c..9d75291f7 100644
--- a/vendor/twbs/bootstrap/js/src/dom/data.js
+++ b/vendor/twbs/bootstrap/js/src/dom/data.js
@@ -1,14 +1,12 @@
/**
* --------------------------------------------------------------------------
- * Bootstrap (v5.1.3): dom/data.js
+ * Bootstrap (v5.2.0): dom/data.js
* Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)
* --------------------------------------------------------------------------
*/
/**
- * ------------------------------------------------------------------------
* Constants
- * ------------------------------------------------------------------------
*/
const elementMap = new Map()
diff --git a/vendor/twbs/bootstrap/js/src/dom/event-handler.js b/vendor/twbs/bootstrap/js/src/dom/event-handler.js
index e085ea138..d141258bd 100644
--- a/vendor/twbs/bootstrap/js/src/dom/event-handler.js
+++ b/vendor/twbs/bootstrap/js/src/dom/event-handler.js
@@ -1,6 +1,6 @@
/**
* --------------------------------------------------------------------------
- * Bootstrap (v5.1.3): dom/event-handler.js
+ * Bootstrap (v5.2.0): dom/event-handler.js
* Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)
* --------------------------------------------------------------------------
*/
@@ -8,9 +8,7 @@
import { getjQuery } from '../util/index'
/**
- * ------------------------------------------------------------------------
* Constants
- * ------------------------------------------------------------------------
*/
const namespaceRegex = /[^.]*(?=\..*)\.|.*/
@@ -22,7 +20,7 @@ const customEvents = {
mouseenter: 'mouseover',
mouseleave: 'mouseout'
}
-const customEventsRegex = /^(mouseenter|mouseleave)/i
+
const nativeEvents = new Set([
'click',
'dblclick',
@@ -73,17 +71,15 @@ const nativeEvents = new Set([
])
/**
- * ------------------------------------------------------------------------
* Private methods
- * ------------------------------------------------------------------------
*/
-function getUidEvent(element, uid) {
+function makeEventUid(element, uid) {
return (uid && `${uid}::${uidEvent++}`) || element.uidEvent || uidEvent++
}
-function getEvent(element) {
- const uid = getUidEvent(element)
+function getElementEvents(element) {
+ const uid = makeEventUid(element)
element.uidEvent = uid
eventRegistry[uid] = eventRegistry[uid] || {}
@@ -93,7 +89,7 @@ function getEvent(element) {
function bootstrapHandler(element, fn) {
return function handler(event) {
- event.delegateTarget = element
+ hydrateObj(event, { delegateTarget: element })
if (handler.oneOff) {
EventHandler.off(element, event.type, fn)
@@ -108,66 +104,52 @@ function bootstrapDelegationHandler(element, selector, fn) {
const domElements = element.querySelectorAll(selector)
for (let { target } = event; target && target !== this; target = target.parentNode) {
- for (let i = domElements.length; i--;) {
- if (domElements[i] === target) {
- event.delegateTarget = target
+ for (const domElement of domElements) {
+ if (domElement !== target) {
+ continue
+ }
- if (handler.oneOff) {
- EventHandler.off(element, event.type, selector, fn)
- }
+ hydrateObj(event, { delegateTarget: target })
- return fn.apply(target, [event])
+ if (handler.oneOff) {
+ EventHandler.off(element, event.type, selector, fn)
}
+
+ return fn.apply(target, [event])
}
}
-
- // To please ESLint
- return null
}
}
-function findHandler(events, handler, delegationSelector = null) {
- const uidEventList = Object.keys(events)
-
- for (let i = 0, len = uidEventList.length; i < len; i++) {
- const event = events[uidEventList[i]]
-
- if (event.originalHandler === handler && event.delegationSelector === delegationSelector) {
- return event
- }
- }
-
- return null
+function findHandler(events, callable, delegationSelector = null) {
+ return Object.values(events)
+ .find(event => event.callable === callable && event.delegationSelector === delegationSelector)
}
-function normalizeParams(originalTypeEvent, handler, delegationFn) {
- const delegation = typeof handler === 'string'
- const originalHandler = delegation ? delegationFn : handler
-
+function normalizeParameters(originalTypeEvent, handler, delegationFunction) {
+ const isDelegated = typeof handler === 'string'
+ // todo: tooltip passes `false` instead of selector, so we need to check
+ const callable = isDelegated ? delegationFunction : (handler || delegationFunction)
let typeEvent = getTypeEvent(originalTypeEvent)
- const isNative = nativeEvents.has(typeEvent)
- if (!isNative) {
+ if (!nativeEvents.has(typeEvent)) {
typeEvent = originalTypeEvent
}
- return [delegation, originalHandler, typeEvent]
+ return [isDelegated, callable, typeEvent]
}
-function addHandler(element, originalTypeEvent, handler, delegationFn, oneOff) {
+function addHandler(element, originalTypeEvent, handler, delegationFunction, oneOff) {
if (typeof originalTypeEvent !== 'string' || !element) {
return
}
- if (!handler) {
- handler = delegationFn
- delegationFn = null
- }
+ let [isDelegated, callable, typeEvent] = normalizeParameters(originalTypeEvent, handler, delegationFunction)
// in case of mouseenter or mouseleave wrap the handler within a function that checks for its DOM position
// this prevents the handler from being dispatched the same way as mouseover or mouseout does
- if (customEventsRegex.test(originalTypeEvent)) {
- const wrapFn = fn => {
+ if (originalTypeEvent in customEvents) {
+ const wrapFunction = fn => {
return function (event) {
if (!event.relatedTarget || (event.relatedTarget !== event.delegateTarget && !event.delegateTarget.contains(event.relatedTarget))) {
return fn.call(this, event)
@@ -175,36 +157,31 @@ function addHandler(element, originalTypeEvent, handler, delegationFn, oneOff) {
}
}
- if (delegationFn) {
- delegationFn = wrapFn(delegationFn)
- } else {
- handler = wrapFn(handler)
- }
+ callable = wrapFunction(callable)
}
- const [delegation, originalHandler, typeEvent] = normalizeParams(originalTypeEvent, handler, delegationFn)
- const events = getEvent(element)
+ const events = getElementEvents(element)
const handlers = events[typeEvent] || (events[typeEvent] = {})
- const previousFn = findHandler(handlers, originalHandler, delegation ? handler : null)
+ const previousFunction = findHandler(handlers, callable, isDelegated ? handler : null)
- if (previousFn) {
- previousFn.oneOff = previousFn.oneOff && oneOff
+ if (previousFunction) {
+ previousFunction.oneOff = previousFunction.oneOff && oneOff
return
}
- const uid = getUidEvent(originalHandler, originalTypeEvent.replace(namespaceRegex, ''))
- const fn = delegation ?
- bootstrapDelegationHandler(element, handler, delegationFn) :
- bootstrapHandler(element, handler)
+ const uid = makeEventUid(callable, originalTypeEvent.replace(namespaceRegex, ''))
+ const fn = isDelegated ?
+ bootstrapDelegationHandler(element, handler, callable) :
+ bootstrapHandler(element, callable)
- fn.delegationSelector = delegation ? handler : null
- fn.originalHandler = originalHandler
+ fn.delegationSelector = isDelegated ? handler : null
+ fn.callable = callable
fn.oneOff = oneOff
fn.uidEvent = uid
handlers[uid] = fn
- element.addEventListener(typeEvent, fn, delegation)
+ element.addEventListener(typeEvent, fn, isDelegated)
}
function removeHandler(element, events, typeEvent, handler, delegationSelector) {
@@ -221,13 +198,12 @@ function removeHandler(element, events, typeEvent, handler, delegationSelector)
function removeNamespacedHandlers(element, events, typeEvent, namespace) {
const storeElementEvent = events[typeEvent] || {}
- Object.keys(storeElementEvent).forEach(handlerKey => {
+ for (const handlerKey of Object.keys(storeElementEvent)) {
if (handlerKey.includes(namespace)) {
const event = storeElementEvent[handlerKey]
-
- removeHandler(element, events, typeEvent, event.originalHandler, event.delegationSelector)
+ removeHandler(element, events, typeEvent, event.callable, event.delegationSelector)
}
- })
+ }
}
function getTypeEvent(event) {
@@ -237,50 +213,49 @@ function getTypeEvent(event) {
}
const EventHandler = {
- on(element, event, handler, delegationFn) {
- addHandler(element, event, handler, delegationFn, false)
+ on(element, event, handler, delegationFunction) {
+ addHandler(element, event, handler, delegationFunction, false)
},
- one(element, event, handler, delegationFn) {
- addHandler(element, event, handler, delegationFn, true)
+ one(element, event, handler, delegationFunction) {
+ addHandler(element, event, handler, delegationFunction, true)
},
- off(element, originalTypeEvent, handler, delegationFn) {
+ off(element, originalTypeEvent, handler, delegationFunction) {
if (typeof originalTypeEvent !== 'string' || !element) {
return
}
- const [delegation, originalHandler, typeEvent] = normalizeParams(originalTypeEvent, handler, delegationFn)
+ const [isDelegated, callable, typeEvent] = normalizeParameters(originalTypeEvent, handler, delegationFunction)
const inNamespace = typeEvent !== originalTypeEvent
- const events = getEvent(element)
+ const events = getElementEvents(element)
+ const storeElementEvent = events[typeEvent] || {}
const isNamespace = originalTypeEvent.startsWith('.')
- if (typeof originalHandler !== 'undefined') {
+ if (typeof callable !== 'undefined') {
// Simplest case: handler is passed, remove that listener ONLY.
- if (!events || !events[typeEvent]) {
+ if (!Object.keys(storeElementEvent).length) {
return
}
- removeHandler(element, events, typeEvent, originalHandler, delegation ? handler : null)
+ removeHandler(element, events, typeEvent, callable, isDelegated ? handler : null)
return
}
if (isNamespace) {
- Object.keys(events).forEach(elementEvent => {
+ for (const elementEvent of Object.keys(events)) {
removeNamespacedHandlers(element, events, elementEvent, originalTypeEvent.slice(1))
- })
+ }
}
- const storeElementEvent = events[typeEvent] || {}
- Object.keys(storeElementEvent).forEach(keyHandlers => {
+ for (const keyHandlers of Object.keys(storeElementEvent)) {
const handlerKey = keyHandlers.replace(stripUidRegex, '')
if (!inNamespace || originalTypeEvent.includes(handlerKey)) {
const event = storeElementEvent[keyHandlers]
-
- removeHandler(element, events, typeEvent, event.originalHandler, event.delegationSelector)
+ removeHandler(element, events, typeEvent, event.callable, event.delegationSelector)
}
- })
+ }
},
trigger(element, event, args) {
@@ -291,13 +266,11 @@ const EventHandler = {
const $ = getjQuery()
const typeEvent = getTypeEvent(event)
const inNamespace = event !== typeEvent
- const isNative = nativeEvents.has(typeEvent)
- let jQueryEvent
+ let jQueryEvent = null
let bubbles = true
let nativeDispatch = true
let defaultPrevented = false
- let evt = null
if (inNamespace && $) {
jQueryEvent = $.Event(event, args)
@@ -308,26 +281,8 @@ const EventHandler = {
defaultPrevented = jQueryEvent.isDefaultPrevented()
}
- if (isNative) {
- evt = document.createEvent('HTMLEvents')
- evt.initEvent(typeEvent, bubbles, true)
- } else {
- evt = new CustomEvent(event, {
- bubbles,
- cancelable: true
- })
- }
-
- // merge custom information in our event
- if (typeof args !== 'undefined') {
- Object.keys(args).forEach(key => {
- Object.defineProperty(evt, key, {
- get() {
- return args[key]
- }
- })
- })
- }
+ let evt = new Event(event, { bubbles, cancelable: true })
+ evt = hydrateObj(evt, args)
if (defaultPrevented) {
evt.preventDefault()
@@ -337,7 +292,7 @@ const EventHandler = {
element.dispatchEvent(evt)
}
- if (evt.defaultPrevented && typeof jQueryEvent !== 'undefined') {
+ if (evt.defaultPrevented && jQueryEvent) {
jQueryEvent.preventDefault()
}
@@ -345,4 +300,21 @@ const EventHandler = {
}
}
+function hydrateObj(obj, meta) {
+ for (const [key, value] of Object.entries(meta || {})) {
+ try {
+ obj[key] = value
+ } catch {
+ Object.defineProperty(obj, key, {
+ configurable: true,
+ get() {
+ return value
+ }
+ })
+ }
+ }
+
+ return obj
+}
+
export default EventHandler
diff --git a/vendor/twbs/bootstrap/js/src/dom/manipulator.js b/vendor/twbs/bootstrap/js/src/dom/manipulator.js
index 04982d63e..c65aaadc7 100644
--- a/vendor/twbs/bootstrap/js/src/dom/manipulator.js
+++ b/vendor/twbs/bootstrap/js/src/dom/manipulator.js
@@ -1,28 +1,36 @@
/**
* --------------------------------------------------------------------------
- * Bootstrap (v5.1.3): dom/manipulator.js
+ * Bootstrap (v5.2.0): dom/manipulator.js
* Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)
* --------------------------------------------------------------------------
*/
-function normalizeData(val) {
- if (val === 'true') {
+function normalizeData(value) {
+ if (value === 'true') {
return true
}
- if (val === 'false') {
+ if (value === 'false') {
return false
}
- if (val === Number(val).toString()) {
- return Number(val)
+ if (value === Number(value).toString()) {
+ return Number(value)
}
- if (val === '' || val === 'null') {
+ if (value === '' || value === 'null') {
return null
}
- return val
+ if (typeof value !== 'string') {
+ return value
+ }
+
+ try {
+ return JSON.parse(decodeURIComponent(value))
+ } catch {
+ return value
+ }
}
function normalizeDataKey(key) {
@@ -44,36 +52,19 @@ const Manipulator = {
}
const attributes = {}
+ const bsKeys = Object.keys(element.dataset).filter(key => key.startsWith('bs') && !key.startsWith('bsConfig'))
- Object.keys(element.dataset)
- .filter(key => key.startsWith('bs'))
- .forEach(key => {
- let pureKey = key.replace(/^bs/, '')
- pureKey = pureKey.charAt(0).toLowerCase() + pureKey.slice(1, pureKey.length)
- attributes[pureKey] = normalizeData(element.dataset[key])
- })
+ for (const key of bsKeys) {
+ let pureKey = key.replace(/^bs/, '')
+ pureKey = pureKey.charAt(0).toLowerCase() + pureKey.slice(1, pureKey.length)
+ attributes[pureKey] = normalizeData(element.dataset[key])
+ }
return attributes
},
getDataAttribute(element, key) {
return normalizeData(element.getAttribute(`data-bs-${normalizeDataKey(key)}`))
- },
-
- offset(element) {
- const rect = element.getBoundingClientRect()
-
- return {
- top: rect.top + window.pageYOffset,
- left: rect.left + window.pageXOffset
- }
- },
-
- position(element) {
- return {
- top: element.offsetTop,
- left: element.offsetLeft
- }
}
}
diff --git a/vendor/twbs/bootstrap/js/src/dom/selector-engine.js b/vendor/twbs/bootstrap/js/src/dom/selector-engine.js
index 54f270f4c..d2af46ff6 100644
--- a/vendor/twbs/bootstrap/js/src/dom/selector-engine.js
+++ b/vendor/twbs/bootstrap/js/src/dom/selector-engine.js
@@ -1,20 +1,16 @@
/**
* --------------------------------------------------------------------------
- * Bootstrap (v5.1.3): dom/selector-engine.js
+ * Bootstrap (v5.2.0): dom/selector-engine.js
* Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)
* --------------------------------------------------------------------------
*/
+import { isDisabled, isVisible } from '../util/index'
+
/**
- * ------------------------------------------------------------------------
* Constants
- * ------------------------------------------------------------------------
*/
-import { isDisabled, isVisible } from '../util/index'
-
-const NODE_TEXT = 3
-
const SelectorEngine = {
find(selector, element = document.documentElement) {
return [].concat(...Element.prototype.querySelectorAll.call(element, selector))
@@ -25,21 +21,16 @@ const SelectorEngine = {
},
children(element, selector) {
- return [].concat(...element.children)
- .filter(child => child.matches(selector))
+ return [].concat(...element.children).filter(child => child.matches(selector))
},
parents(element, selector) {
const parents = []
+ let ancestor = element.parentNode.closest(selector)
- let ancestor = element.parentNode
-
- while (ancestor && ancestor.nodeType === Node.ELEMENT_NODE && ancestor.nodeType !== NODE_TEXT) {
- if (ancestor.matches(selector)) {
- parents.push(ancestor)
- }
-
- ancestor = ancestor.parentNode
+ while (ancestor) {
+ parents.push(ancestor)
+ ancestor = ancestor.parentNode.closest(selector)
}
return parents
@@ -58,7 +49,7 @@ const SelectorEngine = {
return []
},
-
+ // TODO: this is now unused; remove later along with prev()
next(element, selector) {
let next = element.nextElementSibling
@@ -83,7 +74,7 @@ const SelectorEngine = {
'details',
'[tabindex]',
'[contenteditable="true"]'
- ].map(selector => `${selector}:not([tabindex^="-"])`).join(', ')
+ ].map(selector => `${selector}:not([tabindex^="-"])`).join(',')
return this.find(focusables, element).filter(el => !isDisabled(el) && isVisible(el))
}