@coreui/coreui 4.1.6 → 4.2.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (203) hide show
  1. package/LICENSE +2 -2
  2. package/README.md +62 -10
  3. package/dist/css/coreui-grid.css +22 -4
  4. package/dist/css/coreui-grid.css.map +1 -1
  5. package/dist/css/coreui-grid.min.css +2 -2
  6. package/dist/css/coreui-grid.min.css.map +1 -1
  7. package/dist/css/coreui-grid.rtl.css +23 -5
  8. package/dist/css/coreui-grid.rtl.css.map +1 -1
  9. package/dist/css/coreui-grid.rtl.min.css +3 -3
  10. package/dist/css/coreui-grid.rtl.min.css.map +1 -1
  11. package/dist/css/coreui-reboot.css +34 -41
  12. package/dist/css/coreui-reboot.css.map +1 -1
  13. package/dist/css/coreui-reboot.min.css +2 -2
  14. package/dist/css/coreui-reboot.min.css.map +1 -1
  15. package/dist/css/coreui-reboot.rtl.css +34 -42
  16. package/dist/css/coreui-reboot.rtl.css.map +1 -1
  17. package/dist/css/coreui-reboot.rtl.min.css +3 -3
  18. package/dist/css/coreui-reboot.rtl.min.css.map +1 -1
  19. package/dist/css/coreui-utilities.css +278 -163
  20. package/dist/css/coreui-utilities.css.map +1 -1
  21. package/dist/css/coreui-utilities.min.css +2 -2
  22. package/dist/css/coreui-utilities.min.css.map +1 -1
  23. package/dist/css/coreui-utilities.rtl.css +273 -164
  24. package/dist/css/coreui-utilities.rtl.css.map +1 -1
  25. package/dist/css/coreui-utilities.rtl.min.css +3 -3
  26. package/dist/css/coreui-utilities.rtl.min.css.map +1 -1
  27. package/dist/css/coreui.css +2177 -1240
  28. package/dist/css/coreui.css.map +1 -1
  29. package/dist/css/coreui.min.css +2 -2
  30. package/dist/css/coreui.min.css.map +1 -1
  31. package/dist/css/coreui.rtl.css +2159 -1228
  32. package/dist/css/coreui.rtl.css.map +1 -1
  33. package/dist/css/coreui.rtl.min.css +3 -3
  34. package/dist/css/coreui.rtl.min.css.map +1 -1
  35. package/dist/js/coreui.bundle.js +2095 -1906
  36. package/dist/js/coreui.bundle.js.map +1 -1
  37. package/dist/js/coreui.bundle.min.js +2 -2
  38. package/dist/js/coreui.bundle.min.js.map +1 -1
  39. package/dist/js/coreui.esm.js +2098 -1909
  40. package/dist/js/coreui.esm.js.map +1 -1
  41. package/dist/js/coreui.esm.min.js +2 -2
  42. package/dist/js/coreui.esm.min.js.map +1 -1
  43. package/dist/js/coreui.js +2099 -1910
  44. package/dist/js/coreui.js.map +1 -1
  45. package/dist/js/coreui.min.js +2 -2
  46. package/dist/js/coreui.min.js.map +1 -1
  47. package/js/dist/alert.js +10 -148
  48. package/js/dist/alert.js.map +1 -1
  49. package/js/dist/base-component.js +36 -122
  50. package/js/dist/base-component.js.map +1 -1
  51. package/js/dist/button.js +9 -76
  52. package/js/dist/button.js.map +1 -1
  53. package/js/dist/carousel.js +212 -507
  54. package/js/dist/carousel.js.map +1 -1
  55. package/js/dist/collapse.js +64 -251
  56. package/js/dist/collapse.js.map +1 -1
  57. package/js/dist/dom/data.js +2 -4
  58. package/js/dist/dom/data.js.map +1 -1
  59. package/js/dist/dom/event-handler.js +82 -133
  60. package/js/dist/dom/event-handler.js.map +1 -1
  61. package/js/dist/dom/manipulator.js +22 -26
  62. package/js/dist/dom/manipulator.js.map +1 -1
  63. package/js/dist/dom/selector-engine.js +16 -81
  64. package/js/dist/dom/selector-engine.js.map +1 -1
  65. package/js/dist/dropdown.js +99 -338
  66. package/js/dist/dropdown.js.map +1 -1
  67. package/js/dist/modal.js +106 -774
  68. package/js/dist/modal.js.map +1 -1
  69. package/js/dist/navigation.js +309 -0
  70. package/js/dist/navigation.js.map +1 -0
  71. package/js/dist/offcanvas.js +88 -680
  72. package/js/dist/offcanvas.js.map +1 -1
  73. package/js/dist/popover.js +35 -120
  74. package/js/dist/popover.js.map +1 -1
  75. package/js/dist/scrollspy.js +178 -264
  76. package/js/dist/scrollspy.js.map +1 -1
  77. package/js/dist/sidebar.js +347 -0
  78. package/js/dist/sidebar.js.map +1 -0
  79. package/js/dist/tab.js +226 -216
  80. package/js/dist/tab.js.map +1 -1
  81. package/js/dist/toast.js +27 -216
  82. package/js/dist/toast.js.map +1 -1
  83. package/js/dist/tooltip.js +271 -618
  84. package/js/dist/tooltip.js.map +1 -1
  85. package/js/dist/util/backdrop.js +166 -0
  86. package/js/dist/util/backdrop.js.map +1 -0
  87. package/js/dist/util/component-functions.js +47 -0
  88. package/js/dist/util/component-functions.js.map +1 -0
  89. package/js/dist/util/config.js +80 -0
  90. package/js/dist/util/config.js.map +1 -0
  91. package/js/dist/util/focustrap.js +130 -0
  92. package/js/dist/util/focustrap.js.map +1 -0
  93. package/js/dist/util/index.js +354 -0
  94. package/js/dist/util/index.js.map +1 -0
  95. package/js/dist/util/sanitizer.js +126 -0
  96. package/js/dist/util/sanitizer.js.map +1 -0
  97. package/js/dist/util/scrollbar.js +139 -0
  98. package/js/dist/util/scrollbar.js.map +1 -0
  99. package/js/dist/util/swipe.js +156 -0
  100. package/js/dist/util/swipe.js.map +1 -0
  101. package/js/dist/util/template-factory.js +178 -0
  102. package/js/dist/util/template-factory.js.map +1 -0
  103. package/js/src/alert.js +3 -15
  104. package/js/src/base-component.js +28 -18
  105. package/js/src/button.js +3 -15
  106. package/js/src/carousel.js +203 -320
  107. package/js/src/collapse.js +61 -94
  108. package/js/src/dom/data.js +1 -3
  109. package/js/src/dom/event-handler.js +74 -107
  110. package/js/src/dom/manipulator.js +22 -31
  111. package/js/src/dom/selector-engine.js +10 -19
  112. package/js/src/dropdown.js +84 -138
  113. package/js/src/modal.js +94 -158
  114. package/js/src/navigation.js +12 -13
  115. package/js/src/offcanvas.js +71 -60
  116. package/js/src/popover.js +31 -62
  117. package/js/src/scrollspy.js +166 -171
  118. package/js/src/sidebar.js +5 -8
  119. package/js/src/tab.js +201 -110
  120. package/js/src/toast.js +19 -41
  121. package/js/src/tooltip.js +264 -374
  122. package/js/src/util/backdrop.js +55 -36
  123. package/js/src/util/component-functions.js +1 -1
  124. package/js/src/util/config.js +66 -0
  125. package/js/src/util/focustrap.js +38 -28
  126. package/js/src/util/index.js +41 -57
  127. package/js/src/util/sanitizer.js +9 -17
  128. package/js/src/util/scrollbar.js +47 -30
  129. package/js/src/util/swipe.js +146 -0
  130. package/js/src/util/template-factory.js +160 -0
  131. package/package.json +37 -37
  132. package/scss/_accordion.scss +53 -25
  133. package/scss/_alert.scss +29 -9
  134. package/scss/_badge.scss +15 -6
  135. package/scss/_breadcrumb.scss +23 -11
  136. package/scss/_button-group.scss +3 -0
  137. package/scss/_buttons.scss +77 -50
  138. package/scss/_callout.scss +18 -6
  139. package/scss/_card.scss +55 -37
  140. package/scss/_carousel.scss +6 -6
  141. package/scss/_close.scss +4 -4
  142. package/scss/_containers.scss +1 -1
  143. package/scss/_dropdown.scss +86 -64
  144. package/scss/_footer.scss +15 -5
  145. package/scss/_functions.scss +11 -24
  146. package/scss/_grid.scss +3 -3
  147. package/scss/_header.scss +59 -34
  148. package/scss/_helpers.scss +1 -0
  149. package/scss/_images.scss +3 -3
  150. package/scss/_list-group.scss +47 -29
  151. package/scss/_maps.scss +54 -0
  152. package/scss/_modal.scss +70 -43
  153. package/scss/_nav.scss +53 -20
  154. package/scss/_navbar.scss +84 -94
  155. package/scss/_offcanvas.scss +120 -60
  156. package/scss/_pagination.scss +66 -21
  157. package/scss/_popover.scss +90 -52
  158. package/scss/_progress.scss +20 -9
  159. package/scss/_reboot.scss +31 -58
  160. package/scss/_root.scss +41 -19
  161. package/scss/_spinners.scss +37 -21
  162. package/scss/_subheader.scss +9 -9
  163. package/scss/_tables.scss +34 -36
  164. package/scss/_toasts.scss +35 -19
  165. package/scss/_tooltip.scss +61 -56
  166. package/scss/_utilities.scss +42 -25
  167. package/scss/_variables.scss +169 -148
  168. package/scss/coreui-grid.rtl.scss +1 -1
  169. package/scss/coreui-grid.scss +2 -1
  170. package/scss/coreui-reboot.rtl.scss +1 -1
  171. package/scss/coreui-reboot.scss +1 -1
  172. package/scss/coreui-utilities.rtl.scss +1 -1
  173. package/scss/coreui-utilities.scss +2 -1
  174. package/scss/coreui.rtl.scss +1 -1
  175. package/scss/coreui.scss +2 -1
  176. package/scss/forms/_floating-labels.scss +14 -3
  177. package/scss/forms/_form-check.scss +41 -18
  178. package/scss/forms/_form-control.scss +25 -50
  179. package/scss/forms/_form-range.scss +8 -8
  180. package/scss/forms/_form-select.scss +8 -8
  181. package/scss/forms/_form-text.scss +1 -1
  182. package/scss/forms/_input-group.scss +3 -3
  183. package/scss/forms/_labels.scss +2 -2
  184. package/scss/helpers/_color-bg.scss +10 -0
  185. package/scss/helpers/_colored-links.scss +2 -2
  186. package/scss/helpers/_position.scss +7 -1
  187. package/scss/helpers/_ratio.scss +2 -2
  188. package/scss/helpers/_vr.scss +1 -0
  189. package/scss/mixins/_alert.scss +10 -10
  190. package/scss/mixins/_breakpoints.scss +8 -8
  191. package/scss/mixins/_buttons.scss +45 -47
  192. package/scss/mixins/_container.scss +4 -2
  193. package/scss/mixins/_css-vars.scss +47 -47
  194. package/scss/mixins/_forms.scss +8 -0
  195. package/scss/mixins/_gradients.scss +1 -1
  196. package/scss/mixins/_grid.scss +11 -11
  197. package/scss/mixins/_list-group.scss +7 -9
  198. package/scss/mixins/_pagination.scss +4 -25
  199. package/scss/mixins/_table-variants.scss +20 -12
  200. package/scss/mixins/_utilities.scss +8 -3
  201. package/scss/sidebar/_sidebar-narrow.scss +10 -10
  202. package/scss/sidebar/_sidebar-nav.scss +37 -32
  203. package/scss/sidebar/_sidebar.scss +110 -56
@@ -1,6 +1,6 @@
1
1
  /**
2
2
  * --------------------------------------------------------------------------
3
- * CoreUI (v4.1.6): collapse.js
3
+ * CoreUI (v4.2.2): collapse.js
4
4
  * Licensed under MIT (https://coreui.io/license)
5
5
  *
6
6
  * This component is a modified version of the Bootstrap's collapse.js
@@ -11,21 +11,16 @@
11
11
  import {
12
12
  defineJQueryPlugin,
13
13
  getElement,
14
- getSelectorFromElement,
15
14
  getElementFromSelector,
16
- reflow,
17
- typeCheckConfig
15
+ getSelectorFromElement,
16
+ reflow
18
17
  } from './util/index'
19
- import Data from './dom/data'
20
18
  import EventHandler from './dom/event-handler'
21
- import Manipulator from './dom/manipulator'
22
19
  import SelectorEngine from './dom/selector-engine'
23
20
  import BaseComponent from './base-component'
24
21
 
25
22
  /**
26
- * ------------------------------------------------------------------------
27
23
  * Constants
28
- * ------------------------------------------------------------------------
29
24
  */
30
25
 
31
26
  const NAME = 'collapse'
@@ -33,16 +28,6 @@ const DATA_KEY = 'coreui.collapse'
33
28
  const EVENT_KEY = `.${DATA_KEY}`
34
29
  const DATA_API_KEY = '.data-api'
35
30
 
36
- const Default = {
37
- toggle: true,
38
- parent: null
39
- }
40
-
41
- const DefaultType = {
42
- toggle: 'boolean',
43
- parent: '(null|element)'
44
- }
45
-
46
31
  const EVENT_SHOW = `show${EVENT_KEY}`
47
32
  const EVENT_SHOWN = `shown${EVENT_KEY}`
48
33
  const EVENT_HIDE = `hide${EVENT_KEY}`
@@ -62,30 +47,35 @@ const HEIGHT = 'height'
62
47
  const SELECTOR_ACTIVES = '.collapse.show, .collapse.collapsing'
63
48
  const SELECTOR_DATA_TOGGLE = '[data-coreui-toggle="collapse"]'
64
49
 
50
+ const Default = {
51
+ parent: null,
52
+ toggle: true
53
+ }
54
+
55
+ const DefaultType = {
56
+ parent: '(null|element)',
57
+ toggle: 'boolean'
58
+ }
59
+
65
60
  /**
66
- * ------------------------------------------------------------------------
67
- * Class Definition
68
- * ------------------------------------------------------------------------
61
+ * Class definition
69
62
  */
70
63
 
71
64
  class Collapse extends BaseComponent {
72
65
  constructor(element, config) {
73
- super(element)
66
+ super(element, config)
74
67
 
75
68
  this._isTransitioning = false
76
- this._config = this._getConfig(config)
77
69
  this._triggerArray = []
78
70
 
79
71
  const toggleList = SelectorEngine.find(SELECTOR_DATA_TOGGLE)
80
72
 
81
- for (let i = 0, len = toggleList.length; i < len; i++) {
82
- const elem = toggleList[i]
73
+ for (const elem of toggleList) {
83
74
  const selector = getSelectorFromElement(elem)
84
75
  const filterElement = SelectorEngine.find(selector)
85
- .filter(foundElem => foundElem === this._element)
76
+ .filter(foundElement => foundElement === this._element)
86
77
 
87
78
  if (selector !== null && filterElement.length) {
88
- this._selector = selector
89
79
  this._triggerArray.push(elem)
90
80
  }
91
81
  }
@@ -102,17 +92,19 @@ class Collapse extends BaseComponent {
102
92
  }
103
93
 
104
94
  // Getters
105
-
106
95
  static get Default() {
107
96
  return Default
108
97
  }
109
98
 
99
+ static get DefaultType() {
100
+ return DefaultType
101
+ }
102
+
110
103
  static get NAME() {
111
104
  return NAME
112
105
  }
113
106
 
114
107
  // Public
115
-
116
108
  toggle() {
117
109
  if (this._isShown()) {
118
110
  this.hide()
@@ -126,22 +118,17 @@ class Collapse extends BaseComponent {
126
118
  return
127
119
  }
128
120
 
129
- let actives = []
130
- let activesData
121
+ let activeChildren = []
131
122
 
123
+ // find active children
132
124
  if (this._config.parent) {
133
- const children = SelectorEngine.find(CLASS_NAME_DEEPER_CHILDREN, this._config.parent)
134
- actives = SelectorEngine.find(SELECTOR_ACTIVES, this._config.parent).filter(elem => !children.includes(elem)) // remove children if greater depth
125
+ activeChildren = this._getFirstLevelChildren(SELECTOR_ACTIVES)
126
+ .filter(element => element !== this._element)
127
+ .map(element => Collapse.getOrCreateInstance(element, { toggle: false }))
135
128
  }
136
129
 
137
- const container = SelectorEngine.findOne(this._selector)
138
- if (actives.length) {
139
- const tempActiveData = actives.find(elem => container !== elem)
140
- activesData = tempActiveData ? Collapse.getInstance(tempActiveData) : null
141
-
142
- if (activesData && activesData._isTransitioning) {
143
- return
144
- }
130
+ if (activeChildren.length && activeChildren[0]._isTransitioning) {
131
+ return
145
132
  }
146
133
 
147
134
  const startEvent = EventHandler.trigger(this._element, EVENT_SHOW)
@@ -149,15 +136,9 @@ class Collapse extends BaseComponent {
149
136
  return
150
137
  }
151
138
 
152
- actives.forEach(elemActive => {
153
- if (container !== elemActive) {
154
- Collapse.getOrCreateInstance(elemActive, { toggle: false }).hide()
155
- }
156
-
157
- if (!activesData) {
158
- Data.set(elemActive, DATA_KEY, null)
159
- }
160
- })
139
+ for (const activeInstance of activeChildren) {
140
+ activeInstance.hide()
141
+ }
161
142
 
162
143
  const dimension = this._getDimension()
163
144
 
@@ -206,12 +187,10 @@ class Collapse extends BaseComponent {
206
187
  this._element.classList.add(CLASS_NAME_COLLAPSING)
207
188
  this._element.classList.remove(CLASS_NAME_COLLAPSE, CLASS_NAME_SHOW)
208
189
 
209
- const triggerArrayLength = this._triggerArray.length
210
- for (let i = 0; i < triggerArrayLength; i++) {
211
- const trigger = this._triggerArray[i]
212
- const elem = getElementFromSelector(trigger)
190
+ for (const trigger of this._triggerArray) {
191
+ const element = getElementFromSelector(trigger)
213
192
 
214
- if (elem && !this._isShown(elem)) {
193
+ if (element && !this._isShown(element)) {
215
194
  this._addAriaAndCollapsedClass([trigger], false)
216
195
  }
217
196
  }
@@ -235,16 +214,9 @@ class Collapse extends BaseComponent {
235
214
  }
236
215
 
237
216
  // Private
238
-
239
- _getConfig(config) {
240
- config = {
241
- ...Default,
242
- ...Manipulator.getDataAttributes(this._element),
243
- ...config
244
- }
217
+ _configAfterMerge(config) {
245
218
  config.toggle = Boolean(config.toggle) // Coerce string values
246
219
  config.parent = getElement(config.parent)
247
- typeCheckConfig(NAME, config, DefaultType)
248
220
  return config
249
221
  }
250
222
 
@@ -257,15 +229,21 @@ class Collapse extends BaseComponent {
257
229
  return
258
230
  }
259
231
 
260
- const children = SelectorEngine.find(CLASS_NAME_DEEPER_CHILDREN, this._config.parent)
261
- SelectorEngine.find(SELECTOR_DATA_TOGGLE, this._config.parent).filter(elem => !children.includes(elem))
262
- .forEach(element => {
263
- const selected = getElementFromSelector(element)
232
+ const children = this._getFirstLevelChildren(SELECTOR_DATA_TOGGLE)
264
233
 
265
- if (selected) {
266
- this._addAriaAndCollapsedClass([element], this._isShown(selected))
267
- }
268
- })
234
+ for (const element of children) {
235
+ const selected = getElementFromSelector(element)
236
+
237
+ if (selected) {
238
+ this._addAriaAndCollapsedClass([element], this._isShown(selected))
239
+ }
240
+ }
241
+ }
242
+
243
+ _getFirstLevelChildren(selector) {
244
+ const children = SelectorEngine.find(CLASS_NAME_DEEPER_CHILDREN, this._config.parent)
245
+ // remove children if greater depth
246
+ return SelectorEngine.find(selector, this._config.parent).filter(element => !children.includes(element))
269
247
  }
270
248
 
271
249
  _addAriaAndCollapsedClass(triggerArray, isOpen) {
@@ -273,26 +251,20 @@ class Collapse extends BaseComponent {
273
251
  return
274
252
  }
275
253
 
276
- triggerArray.forEach(elem => {
277
- if (isOpen) {
278
- elem.classList.remove(CLASS_NAME_COLLAPSED)
279
- } else {
280
- elem.classList.add(CLASS_NAME_COLLAPSED)
281
- }
282
-
283
- elem.setAttribute('aria-expanded', isOpen)
284
- })
254
+ for (const element of triggerArray) {
255
+ element.classList.toggle(CLASS_NAME_COLLAPSED, !isOpen)
256
+ element.setAttribute('aria-expanded', isOpen)
257
+ }
285
258
  }
286
259
 
287
260
  // Static
288
-
289
261
  static jQueryInterface(config) {
290
- return this.each(function () {
291
- const _config = {}
292
- if (typeof config === 'string' && /show|hide/.test(config)) {
293
- _config.toggle = false
294
- }
262
+ const _config = {}
263
+ if (typeof config === 'string' && /show|hide/.test(config)) {
264
+ _config.toggle = false
265
+ }
295
266
 
267
+ return this.each(function () {
296
268
  const data = Collapse.getOrCreateInstance(this, _config)
297
269
 
298
270
  if (typeof config === 'string') {
@@ -307,9 +279,7 @@ class Collapse extends BaseComponent {
307
279
  }
308
280
 
309
281
  /**
310
- * ------------------------------------------------------------------------
311
- * Data Api implementation
312
- * ------------------------------------------------------------------------
282
+ * Data API implementation
313
283
  */
314
284
 
315
285
  EventHandler.on(document, EVENT_CLICK_DATA_API, SELECTOR_DATA_TOGGLE, function (event) {
@@ -321,16 +291,13 @@ EventHandler.on(document, EVENT_CLICK_DATA_API, SELECTOR_DATA_TOGGLE, function (
321
291
  const selector = getSelectorFromElement(this)
322
292
  const selectorElements = SelectorEngine.find(selector)
323
293
 
324
- selectorElements.forEach(element => {
294
+ for (const element of selectorElements) {
325
295
  Collapse.getOrCreateInstance(element, { toggle: false }).toggle()
326
- })
296
+ }
327
297
  })
328
298
 
329
299
  /**
330
- * ------------------------------------------------------------------------
331
300
  * jQuery
332
- * ------------------------------------------------------------------------
333
- * add .Collapse to jQuery only if jQuery is present
334
301
  */
335
302
 
336
303
  defineJQueryPlugin(Collapse)
@@ -1,6 +1,6 @@
1
1
  /**
2
2
  * --------------------------------------------------------------------------
3
- * CoreUI (v4.1.6): dom/data.js
3
+ * CoreUI (v4.2.2): dom/data.js
4
4
  * Licensed under MIT (https://coreui.io/license)
5
5
  *
6
6
  * This component is a modified version of the Bootstrap's dom/data.js
@@ -9,9 +9,7 @@
9
9
  */
10
10
 
11
11
  /**
12
- * ------------------------------------------------------------------------
13
12
  * Constants
14
- * ------------------------------------------------------------------------
15
13
  */
16
14
 
17
15
  const elementMap = new Map()
@@ -1,6 +1,6 @@
1
1
  /**
2
2
  * --------------------------------------------------------------------------
3
- * CoreUI (v4.1.6): dom/event-handler.js
3
+ * CoreUI (v4.2.2): dom/event-handler.js
4
4
  * Licensed under MIT (https://coreui.io/license)
5
5
  *
6
6
  * This component is a modified version of the Bootstrap's dom/event-handler.js
@@ -11,9 +11,7 @@
11
11
  import { getjQuery } from '../util/index'
12
12
 
13
13
  /**
14
- * ------------------------------------------------------------------------
15
14
  * Constants
16
- * ------------------------------------------------------------------------
17
15
  */
18
16
 
19
17
  const namespaceRegex = /[^.]*(?=\..*)\.|.*/
@@ -25,7 +23,7 @@ const customEvents = {
25
23
  mouseenter: 'mouseover',
26
24
  mouseleave: 'mouseout'
27
25
  }
28
- const customEventsRegex = /^(mouseenter|mouseleave)/i
26
+
29
27
  const nativeEvents = new Set([
30
28
  'click',
31
29
  'dblclick',
@@ -76,17 +74,15 @@ const nativeEvents = new Set([
76
74
  ])
77
75
 
78
76
  /**
79
- * ------------------------------------------------------------------------
80
77
  * Private methods
81
- * ------------------------------------------------------------------------
82
78
  */
83
79
 
84
- function getUidEvent(element, uid) {
80
+ function makeEventUid(element, uid) {
85
81
  return (uid && `${uid}::${uidEvent++}`) || element.uidEvent || uidEvent++
86
82
  }
87
83
 
88
- function getEvent(element) {
89
- const uid = getUidEvent(element)
84
+ function getElementEvents(element) {
85
+ const uid = makeEventUid(element)
90
86
 
91
87
  element.uidEvent = uid
92
88
  eventRegistry[uid] = eventRegistry[uid] || {}
@@ -111,66 +107,52 @@ function bootstrapDelegationHandler(element, selector, fn) {
111
107
  const domElements = element.querySelectorAll(selector)
112
108
 
113
109
  for (let { target } = event; target && target !== this; target = target.parentNode) {
114
- for (let i = domElements.length; i--;) {
115
- if (domElements[i] === target) {
116
- event.delegateTarget = target
110
+ for (const domElement of domElements) {
111
+ if (domElement !== target) {
112
+ continue
113
+ }
117
114
 
118
- if (handler.oneOff) {
119
- EventHandler.off(element, event.type, selector, fn)
120
- }
115
+ event.delegateTarget = target
121
116
 
122
- return fn.apply(target, [event])
117
+ if (handler.oneOff) {
118
+ EventHandler.off(element, event.type, selector, fn)
123
119
  }
120
+
121
+ return fn.apply(target, [event])
124
122
  }
125
123
  }
126
-
127
- // To please ESLint
128
- return null
129
124
  }
130
125
  }
131
126
 
132
- function findHandler(events, handler, delegationSelector = null) {
133
- const uidEventList = Object.keys(events)
134
-
135
- for (let i = 0, len = uidEventList.length; i < len; i++) {
136
- const event = events[uidEventList[i]]
137
-
138
- if (event.originalHandler === handler && event.delegationSelector === delegationSelector) {
139
- return event
140
- }
141
- }
142
-
143
- return null
127
+ function findHandler(events, callable, delegationSelector = null) {
128
+ return Object.values(events)
129
+ .find(event => event.callable === callable && event.delegationSelector === delegationSelector)
144
130
  }
145
131
 
146
- function normalizeParams(originalTypeEvent, handler, delegationFn) {
147
- const delegation = typeof handler === 'string'
148
- const originalHandler = delegation ? delegationFn : handler
149
-
132
+ function normalizeParameters(originalTypeEvent, handler, delegationFunction) {
133
+ const isDelegated = typeof handler === 'string'
134
+ // todo: tooltip passes `false` instead of selector, so we need to check
135
+ const callable = isDelegated ? delegationFunction : (handler || delegationFunction)
150
136
  let typeEvent = getTypeEvent(originalTypeEvent)
151
- const isNative = nativeEvents.has(typeEvent)
152
137
 
153
- if (!isNative) {
138
+ if (!nativeEvents.has(typeEvent)) {
154
139
  typeEvent = originalTypeEvent
155
140
  }
156
141
 
157
- return [delegation, originalHandler, typeEvent]
142
+ return [isDelegated, callable, typeEvent]
158
143
  }
159
144
 
160
- function addHandler(element, originalTypeEvent, handler, delegationFn, oneOff) {
145
+ function addHandler(element, originalTypeEvent, handler, delegationFunction, oneOff) {
161
146
  if (typeof originalTypeEvent !== 'string' || !element) {
162
147
  return
163
148
  }
164
149
 
165
- if (!handler) {
166
- handler = delegationFn
167
- delegationFn = null
168
- }
150
+ let [isDelegated, callable, typeEvent] = normalizeParameters(originalTypeEvent, handler, delegationFunction)
169
151
 
170
152
  // in case of mouseenter or mouseleave wrap the handler within a function that checks for its DOM position
171
153
  // this prevents the handler from being dispatched the same way as mouseover or mouseout does
172
- if (customEventsRegex.test(originalTypeEvent)) {
173
- const wrapFn = fn => {
154
+ if (originalTypeEvent in customEvents) {
155
+ const wrapFunction = fn => {
174
156
  return function (event) {
175
157
  if (!event.relatedTarget || (event.relatedTarget !== event.delegateTarget && !event.delegateTarget.contains(event.relatedTarget))) {
176
158
  return fn.call(this, event)
@@ -178,36 +160,31 @@ function addHandler(element, originalTypeEvent, handler, delegationFn, oneOff) {
178
160
  }
179
161
  }
180
162
 
181
- if (delegationFn) {
182
- delegationFn = wrapFn(delegationFn)
183
- } else {
184
- handler = wrapFn(handler)
185
- }
163
+ callable = wrapFunction(callable)
186
164
  }
187
165
 
188
- const [delegation, originalHandler, typeEvent] = normalizeParams(originalTypeEvent, handler, delegationFn)
189
- const events = getEvent(element)
166
+ const events = getElementEvents(element)
190
167
  const handlers = events[typeEvent] || (events[typeEvent] = {})
191
- const previousFn = findHandler(handlers, originalHandler, delegation ? handler : null)
168
+ const previousFunction = findHandler(handlers, callable, isDelegated ? handler : null)
192
169
 
193
- if (previousFn) {
194
- previousFn.oneOff = previousFn.oneOff && oneOff
170
+ if (previousFunction) {
171
+ previousFunction.oneOff = previousFunction.oneOff && oneOff
195
172
 
196
173
  return
197
174
  }
198
175
 
199
- const uid = getUidEvent(originalHandler, originalTypeEvent.replace(namespaceRegex, ''))
200
- const fn = delegation ?
201
- bootstrapDelegationHandler(element, handler, delegationFn) :
202
- bootstrapHandler(element, handler)
176
+ const uid = makeEventUid(callable, originalTypeEvent.replace(namespaceRegex, ''))
177
+ const fn = isDelegated ?
178
+ bootstrapDelegationHandler(element, handler, callable) :
179
+ bootstrapHandler(element, callable)
203
180
 
204
- fn.delegationSelector = delegation ? handler : null
205
- fn.originalHandler = originalHandler
181
+ fn.delegationSelector = isDelegated ? handler : null
182
+ fn.callable = callable
206
183
  fn.oneOff = oneOff
207
184
  fn.uidEvent = uid
208
185
  handlers[uid] = fn
209
186
 
210
- element.addEventListener(typeEvent, fn, delegation)
187
+ element.addEventListener(typeEvent, fn, isDelegated)
211
188
  }
212
189
 
213
190
  function removeHandler(element, events, typeEvent, handler, delegationSelector) {
@@ -224,13 +201,12 @@ function removeHandler(element, events, typeEvent, handler, delegationSelector)
224
201
  function removeNamespacedHandlers(element, events, typeEvent, namespace) {
225
202
  const storeElementEvent = events[typeEvent] || {}
226
203
 
227
- Object.keys(storeElementEvent).forEach(handlerKey => {
204
+ for (const handlerKey of Object.keys(storeElementEvent)) {
228
205
  if (handlerKey.includes(namespace)) {
229
206
  const event = storeElementEvent[handlerKey]
230
-
231
- removeHandler(element, events, typeEvent, event.originalHandler, event.delegationSelector)
207
+ removeHandler(element, events, typeEvent, event.callable, event.delegationSelector)
232
208
  }
233
- })
209
+ }
234
210
  }
235
211
 
236
212
  function getTypeEvent(event) {
@@ -240,50 +216,49 @@ function getTypeEvent(event) {
240
216
  }
241
217
 
242
218
  const EventHandler = {
243
- on(element, event, handler, delegationFn) {
244
- addHandler(element, event, handler, delegationFn, false)
219
+ on(element, event, handler, delegationFunction) {
220
+ addHandler(element, event, handler, delegationFunction, false)
245
221
  },
246
222
 
247
- one(element, event, handler, delegationFn) {
248
- addHandler(element, event, handler, delegationFn, true)
223
+ one(element, event, handler, delegationFunction) {
224
+ addHandler(element, event, handler, delegationFunction, true)
249
225
  },
250
226
 
251
- off(element, originalTypeEvent, handler, delegationFn) {
227
+ off(element, originalTypeEvent, handler, delegationFunction) {
252
228
  if (typeof originalTypeEvent !== 'string' || !element) {
253
229
  return
254
230
  }
255
231
 
256
- const [delegation, originalHandler, typeEvent] = normalizeParams(originalTypeEvent, handler, delegationFn)
232
+ const [isDelegated, callable, typeEvent] = normalizeParameters(originalTypeEvent, handler, delegationFunction)
257
233
  const inNamespace = typeEvent !== originalTypeEvent
258
- const events = getEvent(element)
234
+ const events = getElementEvents(element)
235
+ const storeElementEvent = events[typeEvent] || {}
259
236
  const isNamespace = originalTypeEvent.startsWith('.')
260
237
 
261
- if (typeof originalHandler !== 'undefined') {
238
+ if (typeof callable !== 'undefined') {
262
239
  // Simplest case: handler is passed, remove that listener ONLY.
263
- if (!events || !events[typeEvent]) {
240
+ if (!Object.keys(storeElementEvent).length) {
264
241
  return
265
242
  }
266
243
 
267
- removeHandler(element, events, typeEvent, originalHandler, delegation ? handler : null)
244
+ removeHandler(element, events, typeEvent, callable, isDelegated ? handler : null)
268
245
  return
269
246
  }
270
247
 
271
248
  if (isNamespace) {
272
- Object.keys(events).forEach(elementEvent => {
249
+ for (const elementEvent of Object.keys(events)) {
273
250
  removeNamespacedHandlers(element, events, elementEvent, originalTypeEvent.slice(1))
274
- })
251
+ }
275
252
  }
276
253
 
277
- const storeElementEvent = events[typeEvent] || {}
278
- Object.keys(storeElementEvent).forEach(keyHandlers => {
254
+ for (const keyHandlers of Object.keys(storeElementEvent)) {
279
255
  const handlerKey = keyHandlers.replace(stripUidRegex, '')
280
256
 
281
257
  if (!inNamespace || originalTypeEvent.includes(handlerKey)) {
282
258
  const event = storeElementEvent[keyHandlers]
283
-
284
- removeHandler(element, events, typeEvent, event.originalHandler, event.delegationSelector)
259
+ removeHandler(element, events, typeEvent, event.callable, event.delegationSelector)
285
260
  }
286
- })
261
+ }
287
262
  },
288
263
 
289
264
  trigger(element, event, args) {
@@ -294,13 +269,11 @@ const EventHandler = {
294
269
  const $ = getjQuery()
295
270
  const typeEvent = getTypeEvent(event)
296
271
  const inNamespace = event !== typeEvent
297
- const isNative = nativeEvents.has(typeEvent)
298
272
 
299
- let jQueryEvent
273
+ let jQueryEvent = null
300
274
  let bubbles = true
301
275
  let nativeDispatch = true
302
276
  let defaultPrevented = false
303
- let evt = null
304
277
 
305
278
  if (inNamespace && $) {
306
279
  jQueryEvent = $.Event(event, args)
@@ -311,26 +284,8 @@ const EventHandler = {
311
284
  defaultPrevented = jQueryEvent.isDefaultPrevented()
312
285
  }
313
286
 
314
- if (isNative) {
315
- evt = document.createEvent('HTMLEvents')
316
- evt.initEvent(typeEvent, bubbles, true)
317
- } else {
318
- evt = new CustomEvent(event, {
319
- bubbles,
320
- cancelable: true
321
- })
322
- }
323
-
324
- // merge custom information in our event
325
- if (typeof args !== 'undefined') {
326
- Object.keys(args).forEach(key => {
327
- Object.defineProperty(evt, key, {
328
- get() {
329
- return args[key]
330
- }
331
- })
332
- })
333
- }
287
+ let evt = new Event(event, { bubbles, cancelable: true })
288
+ evt = hydrateObj(evt, args)
334
289
 
335
290
  if (defaultPrevented) {
336
291
  evt.preventDefault()
@@ -340,7 +295,7 @@ const EventHandler = {
340
295
  element.dispatchEvent(evt)
341
296
  }
342
297
 
343
- if (evt.defaultPrevented && typeof jQueryEvent !== 'undefined') {
298
+ if (evt.defaultPrevented && jQueryEvent) {
344
299
  jQueryEvent.preventDefault()
345
300
  }
346
301
 
@@ -348,4 +303,16 @@ const EventHandler = {
348
303
  }
349
304
  }
350
305
 
306
+ function hydrateObj(obj, meta) {
307
+ for (const [key, value] of Object.entries(meta || {})) {
308
+ Object.defineProperty(obj, key, {
309
+ get() {
310
+ return value
311
+ }
312
+ })
313
+ }
314
+
315
+ return obj
316
+ }
317
+
351
318
  export default EventHandler