@coreui/coreui 4.0.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 +22 -0
  2. package/README.md +183 -0
  3. package/dist/css/coreui-grid.css +5004 -0
  4. package/dist/css/coreui-grid.css.map +1 -0
  5. package/dist/css/coreui-grid.min.css +8 -0
  6. package/dist/css/coreui-grid.min.css.map +1 -0
  7. package/dist/css/coreui-grid.rtl.css +5011 -0
  8. package/dist/css/coreui-grid.rtl.css.map +1 -0
  9. package/dist/css/coreui-grid.rtl.min.css +14 -0
  10. package/dist/css/coreui-grid.rtl.min.css.map +1 -0
  11. package/dist/css/coreui-reboot.css +440 -0
  12. package/dist/css/coreui-reboot.css.map +1 -0
  13. package/dist/css/coreui-reboot.min.css +8 -0
  14. package/dist/css/coreui-reboot.min.css.map +1 -0
  15. package/dist/css/coreui-reboot.rtl.css +441 -0
  16. package/dist/css/coreui-reboot.rtl.css.map +1 -0
  17. package/dist/css/coreui-reboot.rtl.min.css +14 -0
  18. package/dist/css/coreui-reboot.rtl.min.css.map +1 -0
  19. package/dist/css/coreui-utilities.css +5030 -0
  20. package/dist/css/coreui-utilities.css.map +1 -0
  21. package/dist/css/coreui-utilities.min.css +8 -0
  22. package/dist/css/coreui-utilities.min.css.map +1 -0
  23. package/dist/css/coreui-utilities.rtl.css +5024 -0
  24. package/dist/css/coreui-utilities.rtl.css.map +1 -0
  25. package/dist/css/coreui-utilities.rtl.min.css +14 -0
  26. package/dist/css/coreui-utilities.rtl.min.css.map +1 -0
  27. package/dist/css/coreui.css +12152 -0
  28. package/dist/css/coreui.css.map +1 -0
  29. package/dist/css/coreui.min.css +8 -0
  30. package/dist/css/coreui.min.css.map +1 -0
  31. package/dist/css/coreui.rtl.css +12041 -0
  32. package/dist/css/coreui.rtl.css.map +1 -0
  33. package/dist/css/coreui.rtl.min.css +14 -0
  34. package/dist/css/coreui.rtl.min.css.map +1 -0
  35. package/dist/js/coreui.bundle.js +7437 -0
  36. package/dist/js/coreui.bundle.js.map +1 -0
  37. package/dist/js/coreui.bundle.min.js +7 -0
  38. package/dist/js/coreui.bundle.min.js.map +1 -0
  39. package/dist/js/coreui.esm.js +5622 -0
  40. package/dist/js/coreui.esm.js.map +1 -0
  41. package/dist/js/coreui.esm.min.js +7 -0
  42. package/dist/js/coreui.esm.min.js.map +1 -0
  43. package/dist/js/coreui.js +5673 -0
  44. package/dist/js/coreui.js.map +1 -0
  45. package/dist/js/coreui.min.js +7 -0
  46. package/dist/js/coreui.min.js.map +1 -0
  47. package/js/dist/alert.js +208 -0
  48. package/js/dist/alert.js.map +1 -0
  49. package/js/dist/base-component.js +181 -0
  50. package/js/dist/base-component.js.map +1 -0
  51. package/js/dist/button.js +142 -0
  52. package/js/dist/button.js.map +1 -0
  53. package/js/dist/carousel.js +724 -0
  54. package/js/dist/carousel.js.map +1 -0
  55. package/js/dist/collapse.js +515 -0
  56. package/js/dist/collapse.js.map +1 -0
  57. package/js/dist/dom/data.js +72 -0
  58. package/js/dist/dom/data.js.map +1 -0
  59. package/js/dist/dom/event-handler.js +319 -0
  60. package/js/dist/dom/event-handler.js.map +1 -0
  61. package/js/dist/dom/manipulator.js +92 -0
  62. package/js/dist/dom/manipulator.js.map +1 -0
  63. package/js/dist/dom/selector-engine.js +89 -0
  64. package/js/dist/dom/selector-engine.js.map +1 -0
  65. package/js/dist/dropdown.js +700 -0
  66. package/js/dist/dropdown.js.map +1 -0
  67. package/js/dist/modal.js +891 -0
  68. package/js/dist/modal.js.map +1 -0
  69. package/js/dist/offcanvas.js +724 -0
  70. package/js/dist/offcanvas.js.map +1 -0
  71. package/js/dist/popover.js +220 -0
  72. package/js/dist/popover.js.map +1 -0
  73. package/js/dist/scrollspy.js +387 -0
  74. package/js/dist/scrollspy.js.map +1 -0
  75. package/js/dist/tab.js +317 -0
  76. package/js/dist/tab.js.map +1 -0
  77. package/js/dist/toast.js +331 -0
  78. package/js/dist/toast.js.map +1 -0
  79. package/js/dist/tooltip.js +997 -0
  80. package/js/dist/tooltip.js.map +1 -0
  81. package/js/src/alert.js +128 -0
  82. package/js/src/base-component.js +78 -0
  83. package/js/src/button.js +89 -0
  84. package/js/src/carousel.js +589 -0
  85. package/js/src/collapse.js +391 -0
  86. package/js/src/dom/data.js +60 -0
  87. package/js/src/dom/event-handler.js +352 -0
  88. package/js/src/dom/manipulator.js +83 -0
  89. package/js/src/dom/selector-engine.js +78 -0
  90. package/js/src/dropdown.js +517 -0
  91. package/js/src/modal.js +451 -0
  92. package/js/src/navigation.js +298 -0
  93. package/js/src/offcanvas.js +277 -0
  94. package/js/src/popover.js +173 -0
  95. package/js/src/scrollspy.js +298 -0
  96. package/js/src/sidebar.js +347 -0
  97. package/js/src/tab.js +227 -0
  98. package/js/src/toast.js +245 -0
  99. package/js/src/tooltip.js +750 -0
  100. package/js/src/util/backdrop.js +129 -0
  101. package/js/src/util/index.js +327 -0
  102. package/js/src/util/sanitizer.js +130 -0
  103. package/js/src/util/scrollbar.js +97 -0
  104. package/package.json +166 -0
  105. package/scss/_accordion.scss +118 -0
  106. package/scss/_alert.scss +52 -0
  107. package/scss/_avatar.scss +49 -0
  108. package/scss/_badge.scss +38 -0
  109. package/scss/_breadcrumb.scss +33 -0
  110. package/scss/_button-group.scss +139 -0
  111. package/scss/_buttons.scss +143 -0
  112. package/scss/_callout.scss +16 -0
  113. package/scss/_card.scss +215 -0
  114. package/scss/_carousel.scss +231 -0
  115. package/scss/_close.scss +40 -0
  116. package/scss/_containers.scss +41 -0
  117. package/scss/_dropdown.scss +227 -0
  118. package/scss/_footer.scss +25 -0
  119. package/scss/_forms.scss +9 -0
  120. package/scss/_functions.scss +356 -0
  121. package/scss/_grid.scss +56 -0
  122. package/scss/_header.scss +170 -0
  123. package/scss/_helpers.scss +7 -0
  124. package/scss/_icon.scss +32 -0
  125. package/scss/_images.scss +42 -0
  126. package/scss/_list-group.scss +169 -0
  127. package/scss/_mixins.scss +50 -0
  128. package/scss/_modal.scss +219 -0
  129. package/scss/_nav.scss +140 -0
  130. package/scss/_navbar.scss +254 -0
  131. package/scss/_offcanvas.scss +79 -0
  132. package/scss/_pagination.scss +64 -0
  133. package/scss/_popover.scss +158 -0
  134. package/scss/_progress.scss +91 -0
  135. package/scss/_reboot.scss +632 -0
  136. package/scss/_root.scss +25 -0
  137. package/scss/_sidebar.scss +3 -0
  138. package/scss/_spinners.scss +69 -0
  139. package/scss/_subheader.scss +72 -0
  140. package/scss/_tables.scss +166 -0
  141. package/scss/_toasts.scss +52 -0
  142. package/scss/_tooltip.scss +115 -0
  143. package/scss/_transitions.scss +21 -0
  144. package/scss/_type.scss +104 -0
  145. package/scss/_utilities.scss +678 -0
  146. package/scss/_variables.scss +1801 -0
  147. package/scss/coreui-grid.rtl.scss +12 -0
  148. package/scss/coreui-grid.scss +67 -0
  149. package/scss/coreui-reboot.rtl.scss +12 -0
  150. package/scss/coreui-reboot.scss +15 -0
  151. package/scss/coreui-utilities.rtl.scss +12 -0
  152. package/scss/coreui-utilities.scss +19 -0
  153. package/scss/coreui.rtl.scss +12 -0
  154. package/scss/coreui.scss +61 -0
  155. package/scss/forms/_floating-labels.scss +63 -0
  156. package/scss/forms/_form-check.scss +188 -0
  157. package/scss/forms/_form-control.scss +219 -0
  158. package/scss/forms/_form-range.scss +91 -0
  159. package/scss/forms/_form-select.scss +70 -0
  160. package/scss/forms/_form-text.scss +11 -0
  161. package/scss/forms/_input-group.scss +121 -0
  162. package/scss/forms/_labels.scss +36 -0
  163. package/scss/forms/_validation.scss +12 -0
  164. package/scss/helpers/_clearfix.scss +3 -0
  165. package/scss/helpers/_colored-links.scss +12 -0
  166. package/scss/helpers/_position.scss +30 -0
  167. package/scss/helpers/_ratio.scss +26 -0
  168. package/scss/helpers/_stretched-link.scss +15 -0
  169. package/scss/helpers/_text-truncation.scss +7 -0
  170. package/scss/helpers/_visually-hidden.scss +8 -0
  171. package/scss/mixins/_alert.scss +15 -0
  172. package/scss/mixins/_avatar.scss +10 -0
  173. package/scss/mixins/_border-radius.scss +78 -0
  174. package/scss/mixins/_box-shadow.scss +18 -0
  175. package/scss/mixins/_breakpoints.scss +140 -0
  176. package/scss/mixins/_buttons.scss +101 -0
  177. package/scss/mixins/_caret.scss +64 -0
  178. package/scss/mixins/_clearfix.scss +9 -0
  179. package/scss/mixins/_color-scheme.scss +7 -0
  180. package/scss/mixins/_container.scss +9 -0
  181. package/scss/mixins/_css-vars.scss +87 -0
  182. package/scss/mixins/_deprecate.scss +10 -0
  183. package/scss/mixins/_forms.scss +144 -0
  184. package/scss/mixins/_gradients.scss +47 -0
  185. package/scss/mixins/_grid.scss +132 -0
  186. package/scss/mixins/_icon.scss +6 -0
  187. package/scss/mixins/_image.scss +16 -0
  188. package/scss/mixins/_list-group.scss +18 -0
  189. package/scss/mixins/_lists.scss +7 -0
  190. package/scss/mixins/_ltr-rtl.scss +60 -0
  191. package/scss/mixins/_pagination.scss +31 -0
  192. package/scss/mixins/_reset-text.scss +17 -0
  193. package/scss/mixins/_resize.scss +6 -0
  194. package/scss/mixins/_table-variants.scss +16 -0
  195. package/scss/mixins/_text-truncate.scss +8 -0
  196. package/scss/mixins/_transition.scss +26 -0
  197. package/scss/mixins/_utilities.scss +104 -0
  198. package/scss/mixins/_visually-hidden.scss +29 -0
  199. package/scss/sidebar/_sidebar-narrow.scss +106 -0
  200. package/scss/sidebar/_sidebar-nav.scss +165 -0
  201. package/scss/sidebar/_sidebar.scss +261 -0
  202. package/scss/utilities/_api.scss +47 -0
  203. package/scss/vendor/_rfs.scss +354 -0
@@ -0,0 +1,352 @@
1
+ /**
2
+ * --------------------------------------------------------------------------
3
+ * CoreUI (v4.0.2): dom/event-handler.js
4
+ * Licensed under MIT (https://coreui.io/license)
5
+ *
6
+ * This component is a modified version of the Bootstrap's dom/event-handler.js
7
+ * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)
8
+ * --------------------------------------------------------------------------
9
+ */
10
+
11
+ import { getjQuery } from '../util/index'
12
+
13
+ /**
14
+ * ------------------------------------------------------------------------
15
+ * Constants
16
+ * ------------------------------------------------------------------------
17
+ */
18
+
19
+ const namespaceRegex = /[^.]*(?=\..*)\.|.*/
20
+ const stripNameRegex = /\..*/
21
+ const stripUidRegex = /::\d+$/
22
+ const eventRegistry = {} // Events storage
23
+ let uidEvent = 1
24
+ const customEvents = {
25
+ mouseenter: 'mouseover',
26
+ mouseleave: 'mouseout'
27
+ }
28
+ const customEventsRegex = /^(mouseenter|mouseleave)/i
29
+ const nativeEvents = new Set([
30
+ 'click',
31
+ 'dblclick',
32
+ 'mouseup',
33
+ 'mousedown',
34
+ 'contextmenu',
35
+ 'mousewheel',
36
+ 'DOMMouseScroll',
37
+ 'mouseover',
38
+ 'mouseout',
39
+ 'mousemove',
40
+ 'selectstart',
41
+ 'selectend',
42
+ 'keydown',
43
+ 'keypress',
44
+ 'keyup',
45
+ 'orientationchange',
46
+ 'touchstart',
47
+ 'touchmove',
48
+ 'touchend',
49
+ 'touchcancel',
50
+ 'pointerdown',
51
+ 'pointermove',
52
+ 'pointerup',
53
+ 'pointerleave',
54
+ 'pointercancel',
55
+ 'gesturestart',
56
+ 'gesturechange',
57
+ 'gestureend',
58
+ 'focus',
59
+ 'blur',
60
+ 'change',
61
+ 'reset',
62
+ 'select',
63
+ 'submit',
64
+ 'focusin',
65
+ 'focusout',
66
+ 'load',
67
+ 'unload',
68
+ 'beforeunload',
69
+ 'resize',
70
+ 'move',
71
+ 'DOMContentLoaded',
72
+ 'readystatechange',
73
+ 'error',
74
+ 'abort',
75
+ 'scroll'
76
+ ])
77
+
78
+ /**
79
+ * ------------------------------------------------------------------------
80
+ * Private methods
81
+ * ------------------------------------------------------------------------
82
+ */
83
+
84
+ function getUidEvent(element, uid) {
85
+ return (uid && `${uid}::${uidEvent++}`) || element.uidEvent || uidEvent++
86
+ }
87
+
88
+ function getEvent(element) {
89
+ const uid = getUidEvent(element)
90
+
91
+ element.uidEvent = uid
92
+ eventRegistry[uid] = eventRegistry[uid] || {}
93
+
94
+ return eventRegistry[uid]
95
+ }
96
+
97
+ function bootstrapHandler(element, fn) {
98
+ return function handler(event) {
99
+ event.delegateTarget = element
100
+
101
+ if (handler.oneOff) {
102
+ EventHandler.off(element, event.type, fn)
103
+ }
104
+
105
+ return fn.apply(element, [event])
106
+ }
107
+ }
108
+
109
+ function bootstrapDelegationHandler(element, selector, fn) {
110
+ return function handler(event) {
111
+ const domElements = element.querySelectorAll(selector)
112
+
113
+ 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
117
+
118
+ if (handler.oneOff) {
119
+ // eslint-disable-next-line unicorn/consistent-destructuring
120
+ EventHandler.off(element, event.type, selector, fn)
121
+ }
122
+
123
+ return fn.apply(target, [event])
124
+ }
125
+ }
126
+ }
127
+
128
+ // To please ESLint
129
+ return null
130
+ }
131
+ }
132
+
133
+ function findHandler(events, handler, delegationSelector = null) {
134
+ const uidEventList = Object.keys(events)
135
+
136
+ for (let i = 0, len = uidEventList.length; i < len; i++) {
137
+ const event = events[uidEventList[i]]
138
+
139
+ if (event.originalHandler === handler && event.delegationSelector === delegationSelector) {
140
+ return event
141
+ }
142
+ }
143
+
144
+ return null
145
+ }
146
+
147
+ function normalizeParams(originalTypeEvent, handler, delegationFn) {
148
+ const delegation = typeof handler === 'string'
149
+ const originalHandler = delegation ? delegationFn : handler
150
+
151
+ let typeEvent = getTypeEvent(originalTypeEvent)
152
+ const isNative = nativeEvents.has(typeEvent)
153
+
154
+ if (!isNative) {
155
+ typeEvent = originalTypeEvent
156
+ }
157
+
158
+ return [delegation, originalHandler, typeEvent]
159
+ }
160
+
161
+ function addHandler(element, originalTypeEvent, handler, delegationFn, oneOff) {
162
+ if (typeof originalTypeEvent !== 'string' || !element) {
163
+ return
164
+ }
165
+
166
+ if (!handler) {
167
+ handler = delegationFn
168
+ delegationFn = null
169
+ }
170
+
171
+ // in case of mouseenter or mouseleave wrap the handler within a function that checks for its DOM position
172
+ // this prevents the handler from being dispatched the same way as mouseover or mouseout does
173
+ if (customEventsRegex.test(originalTypeEvent)) {
174
+ const wrapFn = fn => {
175
+ return function (event) {
176
+ if (!event.relatedTarget || (event.relatedTarget !== event.delegateTarget && !event.delegateTarget.contains(event.relatedTarget))) {
177
+ return fn.call(this, event)
178
+ }
179
+ }
180
+ }
181
+
182
+ if (delegationFn) {
183
+ delegationFn = wrapFn(delegationFn)
184
+ } else {
185
+ handler = wrapFn(handler)
186
+ }
187
+ }
188
+
189
+ const [delegation, originalHandler, typeEvent] = normalizeParams(originalTypeEvent, handler, delegationFn)
190
+ const events = getEvent(element)
191
+ const handlers = events[typeEvent] || (events[typeEvent] = {})
192
+ const previousFn = findHandler(handlers, originalHandler, delegation ? handler : null)
193
+
194
+ if (previousFn) {
195
+ previousFn.oneOff = previousFn.oneOff && oneOff
196
+
197
+ return
198
+ }
199
+
200
+ const uid = getUidEvent(originalHandler, originalTypeEvent.replace(namespaceRegex, ''))
201
+ const fn = delegation ?
202
+ bootstrapDelegationHandler(element, handler, delegationFn) :
203
+ bootstrapHandler(element, handler)
204
+
205
+ fn.delegationSelector = delegation ? handler : null
206
+ fn.originalHandler = originalHandler
207
+ fn.oneOff = oneOff
208
+ fn.uidEvent = uid
209
+ handlers[uid] = fn
210
+
211
+ element.addEventListener(typeEvent, fn, delegation)
212
+ }
213
+
214
+ function removeHandler(element, events, typeEvent, handler, delegationSelector) {
215
+ const fn = findHandler(events[typeEvent], handler, delegationSelector)
216
+
217
+ if (!fn) {
218
+ return
219
+ }
220
+
221
+ element.removeEventListener(typeEvent, fn, Boolean(delegationSelector))
222
+ delete events[typeEvent][fn.uidEvent]
223
+ }
224
+
225
+ function removeNamespacedHandlers(element, events, typeEvent, namespace) {
226
+ const storeElementEvent = events[typeEvent] || {}
227
+
228
+ Object.keys(storeElementEvent).forEach(handlerKey => {
229
+ if (handlerKey.includes(namespace)) {
230
+ const event = storeElementEvent[handlerKey]
231
+
232
+ removeHandler(element, events, typeEvent, event.originalHandler, event.delegationSelector)
233
+ }
234
+ })
235
+ }
236
+
237
+ function getTypeEvent(event) {
238
+ // allow to get the native events from namespaced events ('click.coreui.button' --> 'click')
239
+ event = event.replace(stripNameRegex, '')
240
+ return customEvents[event] || event
241
+ }
242
+
243
+ const EventHandler = {
244
+ on(element, event, handler, delegationFn) {
245
+ addHandler(element, event, handler, delegationFn, false)
246
+ },
247
+
248
+ one(element, event, handler, delegationFn) {
249
+ addHandler(element, event, handler, delegationFn, true)
250
+ },
251
+
252
+ off(element, originalTypeEvent, handler, delegationFn) {
253
+ if (typeof originalTypeEvent !== 'string' || !element) {
254
+ return
255
+ }
256
+
257
+ const [delegation, originalHandler, typeEvent] = normalizeParams(originalTypeEvent, handler, delegationFn)
258
+ const inNamespace = typeEvent !== originalTypeEvent
259
+ const events = getEvent(element)
260
+ const isNamespace = originalTypeEvent.startsWith('.')
261
+
262
+ if (typeof originalHandler !== 'undefined') {
263
+ // Simplest case: handler is passed, remove that listener ONLY.
264
+ if (!events || !events[typeEvent]) {
265
+ return
266
+ }
267
+
268
+ removeHandler(element, events, typeEvent, originalHandler, delegation ? handler : null)
269
+ return
270
+ }
271
+
272
+ if (isNamespace) {
273
+ Object.keys(events).forEach(elementEvent => {
274
+ removeNamespacedHandlers(element, events, elementEvent, originalTypeEvent.slice(1))
275
+ })
276
+ }
277
+
278
+ const storeElementEvent = events[typeEvent] || {}
279
+ Object.keys(storeElementEvent).forEach(keyHandlers => {
280
+ const handlerKey = keyHandlers.replace(stripUidRegex, '')
281
+
282
+ if (!inNamespace || originalTypeEvent.includes(handlerKey)) {
283
+ const event = storeElementEvent[keyHandlers]
284
+
285
+ removeHandler(element, events, typeEvent, event.originalHandler, event.delegationSelector)
286
+ }
287
+ })
288
+ },
289
+
290
+ trigger(element, event, args) {
291
+ if (typeof event !== 'string' || !element) {
292
+ return null
293
+ }
294
+
295
+ const $ = getjQuery()
296
+ const typeEvent = getTypeEvent(event)
297
+ const inNamespace = event !== typeEvent
298
+ const isNative = nativeEvents.has(typeEvent)
299
+
300
+ let jQueryEvent
301
+ let bubbles = true
302
+ let nativeDispatch = true
303
+ let defaultPrevented = false
304
+ let evt = null
305
+
306
+ if (inNamespace && $) {
307
+ jQueryEvent = $.Event(event, args)
308
+
309
+ $(element).trigger(jQueryEvent)
310
+ bubbles = !jQueryEvent.isPropagationStopped()
311
+ nativeDispatch = !jQueryEvent.isImmediatePropagationStopped()
312
+ defaultPrevented = jQueryEvent.isDefaultPrevented()
313
+ }
314
+
315
+ if (isNative) {
316
+ evt = document.createEvent('HTMLEvents')
317
+ evt.initEvent(typeEvent, bubbles, true)
318
+ } else {
319
+ evt = new CustomEvent(event, {
320
+ bubbles,
321
+ cancelable: true
322
+ })
323
+ }
324
+
325
+ // merge custom information in our event
326
+ if (typeof args !== 'undefined') {
327
+ Object.keys(args).forEach(key => {
328
+ Object.defineProperty(evt, key, {
329
+ get() {
330
+ return args[key]
331
+ }
332
+ })
333
+ })
334
+ }
335
+
336
+ if (defaultPrevented) {
337
+ evt.preventDefault()
338
+ }
339
+
340
+ if (nativeDispatch) {
341
+ element.dispatchEvent(evt)
342
+ }
343
+
344
+ if (evt.defaultPrevented && typeof jQueryEvent !== 'undefined') {
345
+ jQueryEvent.preventDefault()
346
+ }
347
+
348
+ return evt
349
+ }
350
+ }
351
+
352
+ export default EventHandler
@@ -0,0 +1,83 @@
1
+ /**
2
+ * --------------------------------------------------------------------------
3
+ * CoreUI (v4.0.2): dom/manipulator.js
4
+ * Licensed under MIT (https://coreui.io/license)
5
+ *
6
+ * This component is a modified version of the Bootstrap's dom/manipulator.js
7
+ * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)
8
+ * --------------------------------------------------------------------------
9
+ */
10
+
11
+ function normalizeData(val) {
12
+ if (val === 'true') {
13
+ return true
14
+ }
15
+
16
+ if (val === 'false') {
17
+ return false
18
+ }
19
+
20
+ if (val === Number(val).toString()) {
21
+ return Number(val)
22
+ }
23
+
24
+ if (val === '' || val === 'null') {
25
+ return null
26
+ }
27
+
28
+ return val
29
+ }
30
+
31
+ function normalizeDataKey(key) {
32
+ return key.replace(/[A-Z]/g, chr => `-${chr.toLowerCase()}`)
33
+ }
34
+
35
+ const Manipulator = {
36
+ setDataAttribute(element, key, value) {
37
+ element.setAttribute(`data-coreui-${normalizeDataKey(key)}`, value)
38
+ },
39
+
40
+ removeDataAttribute(element, key) {
41
+ element.removeAttribute(`data-coreui-${normalizeDataKey(key)}`)
42
+ },
43
+
44
+ getDataAttributes(element) {
45
+ if (!element) {
46
+ return {}
47
+ }
48
+
49
+ const attributes = {}
50
+
51
+ Object.keys(element.dataset)
52
+ .filter(key => key.startsWith('coreui'))
53
+ .forEach(key => {
54
+ let pureKey = key.replace(/^coreui/, '')
55
+ pureKey = pureKey.charAt(0).toLowerCase() + pureKey.slice(1, pureKey.length)
56
+ attributes[pureKey] = normalizeData(element.dataset[key])
57
+ })
58
+
59
+ return attributes
60
+ },
61
+
62
+ getDataAttribute(element, key) {
63
+ return normalizeData(element.getAttribute(`data-coreui-${normalizeDataKey(key)}`))
64
+ },
65
+
66
+ offset(element) {
67
+ const rect = element.getBoundingClientRect()
68
+
69
+ return {
70
+ top: rect.top + document.body.scrollTop,
71
+ left: rect.left + document.body.scrollLeft
72
+ }
73
+ },
74
+
75
+ position(element) {
76
+ return {
77
+ top: element.offsetTop,
78
+ left: element.offsetLeft
79
+ }
80
+ }
81
+ }
82
+
83
+ export default Manipulator
@@ -0,0 +1,78 @@
1
+ /**
2
+ * --------------------------------------------------------------------------
3
+ * CoreUI (v4.0.2): dom/selector-engine.js
4
+ * Licensed under MIT (https://coreui.io/license)
5
+ *
6
+ * This component is a modified version of the Bootstrap's dom/selector-engine.js
7
+ * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)
8
+ * --------------------------------------------------------------------------
9
+ */
10
+
11
+ /**
12
+ * ------------------------------------------------------------------------
13
+ * Constants
14
+ * ------------------------------------------------------------------------
15
+ */
16
+
17
+ const NODE_TEXT = 3
18
+
19
+ const SelectorEngine = {
20
+ find(selector, element = document.documentElement) {
21
+ return [].concat(...Element.prototype.querySelectorAll.call(element, selector))
22
+ },
23
+
24
+ findOne(selector, element = document.documentElement) {
25
+ return Element.prototype.querySelector.call(element, selector)
26
+ },
27
+
28
+ children(element, selector) {
29
+ return [].concat(...element.children)
30
+ .filter(child => child.matches(selector))
31
+ },
32
+
33
+ parents(element, selector) {
34
+ const parents = []
35
+
36
+ let ancestor = element.parentNode
37
+
38
+ while (ancestor && ancestor.nodeType === Node.ELEMENT_NODE && ancestor.nodeType !== NODE_TEXT) {
39
+ if (ancestor.matches(selector)) {
40
+ parents.push(ancestor)
41
+ }
42
+
43
+ ancestor = ancestor.parentNode
44
+ }
45
+
46
+ return parents
47
+ },
48
+
49
+ prev(element, selector) {
50
+ let previous = element.previousElementSibling
51
+
52
+ while (previous) {
53
+ if (previous.matches(selector)) {
54
+ return [previous]
55
+ }
56
+
57
+ previous = previous.previousElementSibling
58
+ }
59
+
60
+ return []
61
+ },
62
+
63
+ next(element, selector) {
64
+ let next = element.nextElementSibling
65
+
66
+ while (next) {
67
+ if (next.matches(selector)) {
68
+ return [next]
69
+ }
70
+
71
+ next = next.nextElementSibling
72
+ }
73
+
74
+ return []
75
+ }
76
+ }
77
+
78
+ export default SelectorEngine