@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,391 @@
1
+ /**
2
+ * --------------------------------------------------------------------------
3
+ * CoreUI (v4.0.2): collapse.js
4
+ * Licensed under MIT (https://coreui.io/license)
5
+ *
6
+ * This component is a modified version of the Bootstrap's collapse.js
7
+ * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)
8
+ * --------------------------------------------------------------------------
9
+ */
10
+
11
+ import {
12
+ defineJQueryPlugin,
13
+ getElement,
14
+ getSelectorFromElement,
15
+ getElementFromSelector,
16
+ reflow,
17
+ typeCheckConfig
18
+ } from './util/index'
19
+ import Data from './dom/data'
20
+ import EventHandler from './dom/event-handler'
21
+ import Manipulator from './dom/manipulator'
22
+ import SelectorEngine from './dom/selector-engine'
23
+ import BaseComponent from './base-component'
24
+
25
+ /**
26
+ * ------------------------------------------------------------------------
27
+ * Constants
28
+ * ------------------------------------------------------------------------
29
+ */
30
+
31
+ const NAME = 'collapse'
32
+ const DATA_KEY = 'coreui.collapse'
33
+ const EVENT_KEY = `.${DATA_KEY}`
34
+ const DATA_API_KEY = '.data-api'
35
+
36
+ const Default = {
37
+ toggle: true,
38
+ parent: ''
39
+ }
40
+
41
+ const DefaultType = {
42
+ toggle: 'boolean',
43
+ parent: '(string|element)'
44
+ }
45
+
46
+ const EVENT_SHOW = `show${EVENT_KEY}`
47
+ const EVENT_SHOWN = `shown${EVENT_KEY}`
48
+ const EVENT_HIDE = `hide${EVENT_KEY}`
49
+ const EVENT_HIDDEN = `hidden${EVENT_KEY}`
50
+ const EVENT_CLICK_DATA_API = `click${EVENT_KEY}${DATA_API_KEY}`
51
+
52
+ const CLASS_NAME_SHOW = 'show'
53
+ const CLASS_NAME_COLLAPSE = 'collapse'
54
+ const CLASS_NAME_COLLAPSING = 'collapsing'
55
+ const CLASS_NAME_COLLAPSED = 'collapsed'
56
+
57
+ const WIDTH = 'width'
58
+ const HEIGHT = 'height'
59
+
60
+ const SELECTOR_ACTIVES = '.show, .collapsing'
61
+ const SELECTOR_DATA_TOGGLE = '[data-coreui-toggle="collapse"]'
62
+
63
+ /**
64
+ * ------------------------------------------------------------------------
65
+ * Class Definition
66
+ * ------------------------------------------------------------------------
67
+ */
68
+
69
+ class Collapse extends BaseComponent {
70
+ constructor(element, config) {
71
+ super(element)
72
+
73
+ this._isTransitioning = false
74
+ this._config = this._getConfig(config)
75
+ this._triggerArray = SelectorEngine.find(
76
+ `${SELECTOR_DATA_TOGGLE}[href="#${this._element.id}"],` +
77
+ `${SELECTOR_DATA_TOGGLE}[data-coreui-target="#${this._element.id}"]`
78
+ )
79
+
80
+ const toggleList = SelectorEngine.find(SELECTOR_DATA_TOGGLE)
81
+
82
+ for (let i = 0, len = toggleList.length; i < len; i++) {
83
+ const elem = toggleList[i]
84
+ const selector = getSelectorFromElement(elem)
85
+ const filterElement = SelectorEngine.find(selector)
86
+ .filter(foundElem => foundElem === this._element)
87
+
88
+ if (selector !== null && filterElement.length) {
89
+ this._selector = selector
90
+ this._triggerArray.push(elem)
91
+ }
92
+ }
93
+
94
+ this._parent = this._config.parent ? this._getParent() : null
95
+
96
+ if (!this._config.parent) {
97
+ this._addAriaAndCollapsedClass(this._element, this._triggerArray)
98
+ }
99
+
100
+ if (this._config.toggle) {
101
+ this.toggle()
102
+ }
103
+ }
104
+
105
+ // Getters
106
+
107
+ static get Default() {
108
+ return Default
109
+ }
110
+
111
+ static get NAME() {
112
+ return NAME
113
+ }
114
+
115
+ // Public
116
+
117
+ toggle() {
118
+ if (this._element.classList.contains(CLASS_NAME_SHOW)) {
119
+ this.hide()
120
+ } else {
121
+ this.show()
122
+ }
123
+ }
124
+
125
+ show() {
126
+ if (this._isTransitioning || this._element.classList.contains(CLASS_NAME_SHOW)) {
127
+ return
128
+ }
129
+
130
+ let actives
131
+ let activesData
132
+
133
+ if (this._parent) {
134
+ actives = SelectorEngine.find(SELECTOR_ACTIVES, this._parent)
135
+ .filter(elem => {
136
+ if (typeof this._config.parent === 'string') {
137
+ return elem.getAttribute('data-coreui-parent') === this._config.parent
138
+ }
139
+
140
+ return elem.classList.contains(CLASS_NAME_COLLAPSE)
141
+ })
142
+
143
+ if (actives.length === 0) {
144
+ actives = null
145
+ }
146
+ }
147
+
148
+ const container = SelectorEngine.findOne(this._selector)
149
+ if (actives) {
150
+ const tempActiveData = actives.find(elem => container !== elem)
151
+ activesData = tempActiveData ? Collapse.getInstance(tempActiveData) : null
152
+
153
+ if (activesData && activesData._isTransitioning) {
154
+ return
155
+ }
156
+ }
157
+
158
+ const startEvent = EventHandler.trigger(this._element, EVENT_SHOW)
159
+ if (startEvent.defaultPrevented) {
160
+ return
161
+ }
162
+
163
+ if (actives) {
164
+ actives.forEach(elemActive => {
165
+ if (container !== elemActive) {
166
+ Collapse.collapseInterface(elemActive, 'hide')
167
+ }
168
+
169
+ if (!activesData) {
170
+ Data.set(elemActive, DATA_KEY, null)
171
+ }
172
+ })
173
+ }
174
+
175
+ const dimension = this._getDimension()
176
+
177
+ this._element.classList.remove(CLASS_NAME_COLLAPSE)
178
+ this._element.classList.add(CLASS_NAME_COLLAPSING)
179
+
180
+ this._element.style[dimension] = 0
181
+
182
+ if (this._triggerArray.length) {
183
+ this._triggerArray.forEach(element => {
184
+ element.classList.remove(CLASS_NAME_COLLAPSED)
185
+ element.setAttribute('aria-expanded', true)
186
+ })
187
+ }
188
+
189
+ this.setTransitioning(true)
190
+
191
+ const complete = () => {
192
+ this._element.classList.remove(CLASS_NAME_COLLAPSING)
193
+ this._element.classList.add(CLASS_NAME_COLLAPSE, CLASS_NAME_SHOW)
194
+
195
+ this._element.style[dimension] = ''
196
+
197
+ this.setTransitioning(false)
198
+
199
+ EventHandler.trigger(this._element, EVENT_SHOWN)
200
+ }
201
+
202
+ const capitalizedDimension = dimension[0].toUpperCase() + dimension.slice(1)
203
+ const scrollSize = `scroll${capitalizedDimension}`
204
+
205
+ this._queueCallback(complete, this._element, true)
206
+ this._element.style[dimension] = `${this._element[scrollSize]}px`
207
+ }
208
+
209
+ hide() {
210
+ if (this._isTransitioning || !this._element.classList.contains(CLASS_NAME_SHOW)) {
211
+ return
212
+ }
213
+
214
+ const startEvent = EventHandler.trigger(this._element, EVENT_HIDE)
215
+ if (startEvent.defaultPrevented) {
216
+ return
217
+ }
218
+
219
+ const dimension = this._getDimension()
220
+
221
+ this._element.style[dimension] = `${this._element.getBoundingClientRect()[dimension]}px`
222
+
223
+ reflow(this._element)
224
+
225
+ this._element.classList.add(CLASS_NAME_COLLAPSING)
226
+ this._element.classList.remove(CLASS_NAME_COLLAPSE, CLASS_NAME_SHOW)
227
+
228
+ const triggerArrayLength = this._triggerArray.length
229
+ if (triggerArrayLength > 0) {
230
+ for (let i = 0; i < triggerArrayLength; i++) {
231
+ const trigger = this._triggerArray[i]
232
+ const elem = getElementFromSelector(trigger)
233
+
234
+ if (elem && !elem.classList.contains(CLASS_NAME_SHOW)) {
235
+ trigger.classList.add(CLASS_NAME_COLLAPSED)
236
+ trigger.setAttribute('aria-expanded', false)
237
+ }
238
+ }
239
+ }
240
+
241
+ this.setTransitioning(true)
242
+
243
+ const complete = () => {
244
+ this.setTransitioning(false)
245
+ this._element.classList.remove(CLASS_NAME_COLLAPSING)
246
+ this._element.classList.add(CLASS_NAME_COLLAPSE)
247
+ EventHandler.trigger(this._element, EVENT_HIDDEN)
248
+ }
249
+
250
+ this._element.style[dimension] = ''
251
+
252
+ this._queueCallback(complete, this._element, true)
253
+ }
254
+
255
+ setTransitioning(isTransitioning) {
256
+ this._isTransitioning = isTransitioning
257
+ }
258
+
259
+ // Private
260
+
261
+ _getConfig(config) {
262
+ config = {
263
+ ...Default,
264
+ ...config
265
+ }
266
+ config.toggle = Boolean(config.toggle) // Coerce string values
267
+ typeCheckConfig(NAME, config, DefaultType)
268
+ return config
269
+ }
270
+
271
+ _getDimension() {
272
+ return this._element.classList.contains(WIDTH) ? WIDTH : HEIGHT
273
+ }
274
+
275
+ _getParent() {
276
+ let { parent } = this._config
277
+
278
+ parent = getElement(parent)
279
+
280
+ const selector = `${SELECTOR_DATA_TOGGLE}[data-coreui-parent="${parent}"]`
281
+
282
+ SelectorEngine.find(selector, parent)
283
+ .forEach(element => {
284
+ const selected = getElementFromSelector(element)
285
+
286
+ this._addAriaAndCollapsedClass(
287
+ selected,
288
+ [element]
289
+ )
290
+ })
291
+
292
+ return parent
293
+ }
294
+
295
+ _addAriaAndCollapsedClass(element, triggerArray) {
296
+ if (!element || !triggerArray.length) {
297
+ return
298
+ }
299
+
300
+ const isOpen = element.classList.contains(CLASS_NAME_SHOW)
301
+
302
+ triggerArray.forEach(elem => {
303
+ if (isOpen) {
304
+ elem.classList.remove(CLASS_NAME_COLLAPSED)
305
+ } else {
306
+ elem.classList.add(CLASS_NAME_COLLAPSED)
307
+ }
308
+
309
+ elem.setAttribute('aria-expanded', isOpen)
310
+ })
311
+ }
312
+
313
+ // Static
314
+
315
+ static collapseInterface(element, config) {
316
+ let data = Collapse.getInstance(element)
317
+ const _config = {
318
+ ...Default,
319
+ ...Manipulator.getDataAttributes(element),
320
+ ...(typeof config === 'object' && config ? config : {})
321
+ }
322
+
323
+ if (!data && _config.toggle && typeof config === 'string' && /show|hide/.test(config)) {
324
+ _config.toggle = false
325
+ }
326
+
327
+ if (!data) {
328
+ data = new Collapse(element, _config)
329
+ }
330
+
331
+ if (typeof config === 'string') {
332
+ if (typeof data[config] === 'undefined') {
333
+ throw new TypeError(`No method named "${config}"`)
334
+ }
335
+
336
+ data[config]()
337
+ }
338
+ }
339
+
340
+ static jQueryInterface(config) {
341
+ return this.each(function () {
342
+ Collapse.collapseInterface(this, config)
343
+ })
344
+ }
345
+ }
346
+
347
+ /**
348
+ * ------------------------------------------------------------------------
349
+ * Data Api implementation
350
+ * ------------------------------------------------------------------------
351
+ */
352
+
353
+ EventHandler.on(document, EVENT_CLICK_DATA_API, SELECTOR_DATA_TOGGLE, function (event) {
354
+ // preventDefault only for <a> elements (which change the URL) not inside the collapsible element
355
+ if (event.target.tagName === 'A' || (event.delegateTarget && event.delegateTarget.tagName === 'A')) {
356
+ event.preventDefault()
357
+ }
358
+
359
+ const triggerData = Manipulator.getDataAttributes(this)
360
+ const selector = getSelectorFromElement(this)
361
+ const selectorElements = SelectorEngine.find(selector)
362
+
363
+ selectorElements.forEach(element => {
364
+ const data = Collapse.getInstance(element)
365
+ let config
366
+ if (data) {
367
+ // update parent attribute
368
+ if (data._parent === null && typeof triggerData.parent === 'string') {
369
+ data._config.parent = triggerData.parent
370
+ data._parent = data._getParent()
371
+ }
372
+
373
+ config = 'toggle'
374
+ } else {
375
+ config = triggerData
376
+ }
377
+
378
+ Collapse.collapseInterface(element, config)
379
+ })
380
+ })
381
+
382
+ /**
383
+ * ------------------------------------------------------------------------
384
+ * jQuery
385
+ * ------------------------------------------------------------------------
386
+ * add .Collapse to jQuery only if jQuery is present
387
+ */
388
+
389
+ defineJQueryPlugin(Collapse)
390
+
391
+ export default Collapse
@@ -0,0 +1,60 @@
1
+ /**
2
+ * --------------------------------------------------------------------------
3
+ * CoreUI (v4.0.2): dom/data.js
4
+ * Licensed under MIT (https://coreui.io/license)
5
+ *
6
+ * This component is a modified version of the Bootstrap's dom/data.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 elementMap = new Map()
18
+
19
+ export default {
20
+ set(element, key, instance) {
21
+ if (!elementMap.has(element)) {
22
+ elementMap.set(element, new Map())
23
+ }
24
+
25
+ const instanceMap = elementMap.get(element)
26
+
27
+ // make it clear we only want one instance per element
28
+ // can be removed later when multiple key/instances are fine to be used
29
+ if (!instanceMap.has(key) && instanceMap.size !== 0) {
30
+ // eslint-disable-next-line no-console
31
+ console.error(`Bootstrap doesn't allow more than one instance per element. Bound instance: ${Array.from(instanceMap.keys())[0]}.`)
32
+ return
33
+ }
34
+
35
+ instanceMap.set(key, instance)
36
+ },
37
+
38
+ get(element, key) {
39
+ if (elementMap.has(element)) {
40
+ return elementMap.get(element).get(key) || null
41
+ }
42
+
43
+ return null
44
+ },
45
+
46
+ remove(element, key) {
47
+ if (!elementMap.has(element)) {
48
+ return
49
+ }
50
+
51
+ const instanceMap = elementMap.get(element)
52
+
53
+ instanceMap.delete(key)
54
+
55
+ // free up element references if there are no instances left for an element
56
+ if (instanceMap.size === 0) {
57
+ elementMap.delete(element)
58
+ }
59
+ }
60
+ }