@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
package/js/src/tab.js CHANGED
@@ -1,6 +1,6 @@
1
1
  /**
2
2
  * --------------------------------------------------------------------------
3
- * CoreUI (v4.1.6): tab.js
3
+ * CoreUI (v4.2.2): tab.js
4
4
  * Licensed under MIT (https://coreui.io/license)
5
5
  *
6
6
  * This component is a modified version of the Bootstrap's tab.js
@@ -8,198 +8,285 @@
8
8
  * --------------------------------------------------------------------------
9
9
  */
10
10
 
11
- import {
12
- defineJQueryPlugin,
13
- getElementFromSelector,
14
- isDisabled,
15
- reflow
16
- } from './util/index'
11
+ import { defineJQueryPlugin, getElementFromSelector, getNextActiveElement, isDisabled } from './util/index'
17
12
  import EventHandler from './dom/event-handler'
18
13
  import SelectorEngine from './dom/selector-engine'
19
14
  import BaseComponent from './base-component'
20
15
 
21
16
  /**
22
- * ------------------------------------------------------------------------
23
17
  * Constants
24
- * ------------------------------------------------------------------------
25
18
  */
26
19
 
27
20
  const NAME = 'tab'
28
21
  const DATA_KEY = 'coreui.tab'
29
22
  const EVENT_KEY = `.${DATA_KEY}`
30
- const DATA_API_KEY = '.data-api'
31
23
 
32
24
  const EVENT_HIDE = `hide${EVENT_KEY}`
33
25
  const EVENT_HIDDEN = `hidden${EVENT_KEY}`
34
26
  const EVENT_SHOW = `show${EVENT_KEY}`
35
27
  const EVENT_SHOWN = `shown${EVENT_KEY}`
36
- const EVENT_CLICK_DATA_API = `click${EVENT_KEY}${DATA_API_KEY}`
28
+ const EVENT_CLICK_DATA_API = `click${EVENT_KEY}`
29
+ const EVENT_KEYDOWN = `keydown${EVENT_KEY}`
30
+ const EVENT_LOAD_DATA_API = `load${EVENT_KEY}`
31
+
32
+ const ARROW_LEFT_KEY = 'ArrowLeft'
33
+ const ARROW_RIGHT_KEY = 'ArrowRight'
34
+ const ARROW_UP_KEY = 'ArrowUp'
35
+ const ARROW_DOWN_KEY = 'ArrowDown'
37
36
 
38
- const CLASS_NAME_DROPDOWN_MENU = 'dropdown-menu'
39
37
  const CLASS_NAME_ACTIVE = 'active'
40
38
  const CLASS_NAME_FADE = 'fade'
41
39
  const CLASS_NAME_SHOW = 'show'
40
+ const CLASS_DROPDOWN = 'dropdown'
42
41
 
43
- const SELECTOR_DROPDOWN = '.dropdown'
44
- const SELECTOR_NAV_LIST_GROUP = '.nav, .list-group'
45
- const SELECTOR_ACTIVE = '.active'
46
- const SELECTOR_ACTIVE_UL = ':scope > li > .active'
47
- const SELECTOR_DATA_TOGGLE = '[data-coreui-toggle="tab"], [data-coreui-toggle="pill"], [data-coreui-toggle="list"]'
48
42
  const SELECTOR_DROPDOWN_TOGGLE = '.dropdown-toggle'
49
- const SELECTOR_DROPDOWN_ACTIVE_CHILD = ':scope > .dropdown-menu .active'
43
+ const SELECTOR_DROPDOWN_MENU = '.dropdown-menu'
44
+ const SELECTOR_DROPDOWN_ITEM = '.dropdown-item'
45
+ const NOT_SELECTOR_DROPDOWN_TOGGLE = ':not(.dropdown-toggle)'
46
+
47
+ const SELECTOR_TAB_PANEL = '.list-group, .nav, [role="tablist"]'
48
+ const SELECTOR_OUTER = '.nav-item, .list-group-item'
49
+ const SELECTOR_INNER = `.nav-link${NOT_SELECTOR_DROPDOWN_TOGGLE}, .list-group-item${NOT_SELECTOR_DROPDOWN_TOGGLE}, [role="tab"]${NOT_SELECTOR_DROPDOWN_TOGGLE}`
50
+ const SELECTOR_DATA_TOGGLE = '[data-coreui-toggle="tab"], [data-coreui-toggle="pill"], [data-coreui-toggle="list"]' // todo:v6: could be only `tab`
51
+ const SELECTOR_INNER_ELEM = `${SELECTOR_INNER}, ${SELECTOR_DATA_TOGGLE}`
52
+
53
+ const SELECTOR_DATA_TOGGLE_ACTIVE = `.${CLASS_NAME_ACTIVE}[data-coreui-toggle="tab"], .${CLASS_NAME_ACTIVE}[data-coreui-toggle="pill"], .${CLASS_NAME_ACTIVE}[data-coreui-toggle="list"]`
50
54
 
51
55
  /**
52
- * ------------------------------------------------------------------------
53
- * Class Definition
54
- * ------------------------------------------------------------------------
56
+ * Class definition
55
57
  */
56
58
 
57
59
  class Tab extends BaseComponent {
58
- // Getters
60
+ constructor(element) {
61
+ super(element)
62
+ this._parent = this._element.closest(SELECTOR_TAB_PANEL)
63
+
64
+ if (!this._parent) {
65
+ return
66
+ // todo: should Throw exception on v6
67
+ // throw new TypeError(`${element.outerHTML} has not a valid parent ${SELECTOR_INNER_ELEM}`)
68
+ }
69
+
70
+ // Set up initial aria attributes
71
+ this._setInitialAttributes(this._parent, this._getChildren())
72
+
73
+ EventHandler.on(this._element, EVENT_KEYDOWN, event => this._keydown(event))
74
+ }
59
75
 
76
+ // Getters
60
77
  static get NAME() {
61
78
  return NAME
62
79
  }
63
80
 
64
81
  // Public
65
-
66
- show() {
67
- if ((this._element.parentNode &&
68
- this._element.parentNode.nodeType === Node.ELEMENT_NODE &&
69
- this._element.classList.contains(CLASS_NAME_ACTIVE))) {
82
+ show() { // Shows this elem and deactivate the active sibling if exists
83
+ const innerElem = this._element
84
+ if (this._elemIsActive(innerElem)) {
70
85
  return
71
86
  }
72
87
 
73
- let previous
74
- const target = getElementFromSelector(this._element)
75
- const listElement = this._element.closest(SELECTOR_NAV_LIST_GROUP)
88
+ // Search for active tab on same parent to deactivate it
89
+ const active = this._getActiveElem()
76
90
 
77
- if (listElement) {
78
- const itemSelector = listElement.nodeName === 'UL' || listElement.nodeName === 'OL' ? SELECTOR_ACTIVE_UL : SELECTOR_ACTIVE
79
- previous = SelectorEngine.find(itemSelector, listElement)
80
- previous = previous[previous.length - 1]
81
- }
82
-
83
- const hideEvent = previous ?
84
- EventHandler.trigger(previous, EVENT_HIDE, {
85
- relatedTarget: this._element
86
- }) :
91
+ const hideEvent = active ?
92
+ EventHandler.trigger(active, EVENT_HIDE, { relatedTarget: innerElem }) :
87
93
  null
88
94
 
89
- const showEvent = EventHandler.trigger(this._element, EVENT_SHOW, {
90
- relatedTarget: previous
91
- })
95
+ const showEvent = EventHandler.trigger(innerElem, EVENT_SHOW, { relatedTarget: active })
96
+
97
+ if (showEvent.defaultPrevented || (hideEvent && hideEvent.defaultPrevented)) {
98
+ return
99
+ }
100
+
101
+ this._deactivate(active, innerElem)
102
+ this._activate(innerElem, active)
103
+ }
92
104
 
93
- if (showEvent.defaultPrevented || (hideEvent !== null && hideEvent.defaultPrevented)) {
105
+ // Private
106
+ _activate(element, relatedElem) {
107
+ if (!element) {
94
108
  return
95
109
  }
96
110
 
97
- this._activate(this._element, listElement)
111
+ element.classList.add(CLASS_NAME_ACTIVE)
112
+
113
+ this._activate(getElementFromSelector(element)) // Search and activate/show the proper section
98
114
 
115
+ const isAnimated = element.classList.contains(CLASS_NAME_FADE)
99
116
  const complete = () => {
100
- EventHandler.trigger(previous, EVENT_HIDDEN, {
101
- relatedTarget: this._element
102
- })
103
- EventHandler.trigger(this._element, EVENT_SHOWN, {
104
- relatedTarget: previous
117
+ if (isAnimated) { // todo: maybe is redundant
118
+ element.classList.add(CLASS_NAME_SHOW)
119
+ }
120
+
121
+ if (element.getAttribute('role') !== 'tab') {
122
+ return
123
+ }
124
+
125
+ element.focus()
126
+ element.removeAttribute('tabindex')
127
+ element.setAttribute('aria-selected', true)
128
+ this._toggleDropDown(element, true)
129
+ EventHandler.trigger(element, EVENT_SHOWN, {
130
+ relatedTarget: relatedElem
105
131
  })
106
132
  }
107
133
 
108
- if (target) {
109
- this._activate(target, target.parentNode, complete)
110
- } else {
111
- complete()
112
- }
134
+ this._queueCallback(complete, element, isAnimated)
113
135
  }
114
136
 
115
- // Private
137
+ _deactivate(element, relatedElem) {
138
+ if (!element) {
139
+ return
140
+ }
141
+
142
+ element.classList.remove(CLASS_NAME_ACTIVE)
143
+ element.blur()
144
+
145
+ this._deactivate(getElementFromSelector(element)) // Search and deactivate the shown section too
146
+
147
+ const isAnimated = element.classList.contains(CLASS_NAME_FADE)
148
+ const complete = () => {
149
+ if (isAnimated) { // todo maybe is redundant
150
+ element.classList.remove(CLASS_NAME_SHOW)
151
+ }
152
+
153
+ if (element.getAttribute('role') !== 'tab') {
154
+ return
155
+ }
116
156
 
117
- _activate(element, container, callback) {
118
- const activeElements = container && (container.nodeName === 'UL' || container.nodeName === 'OL') ?
119
- SelectorEngine.find(SELECTOR_ACTIVE_UL, container) :
120
- SelectorEngine.children(container, SELECTOR_ACTIVE)
157
+ element.setAttribute('aria-selected', false)
158
+ element.setAttribute('tabindex', '-1')
159
+ this._toggleDropDown(element, false)
160
+ EventHandler.trigger(element, EVENT_HIDDEN, { relatedTarget: relatedElem })
161
+ }
162
+
163
+ this._queueCallback(complete, element, isAnimated)
164
+ }
121
165
 
122
- const active = activeElements[0]
123
- const isTransitioning = callback && (active && active.classList.contains(CLASS_NAME_FADE))
166
+ _keydown(event) {
167
+ if (!([ARROW_LEFT_KEY, ARROW_RIGHT_KEY, ARROW_UP_KEY, ARROW_DOWN_KEY].includes(event.key))) {
168
+ return
169
+ }
124
170
 
125
- const complete = () => this._transitionComplete(element, active, callback)
171
+ event.stopPropagation()// stopPropagation/preventDefault both added to support up/down keys without scrolling the page
172
+ event.preventDefault()
173
+ const isNext = [ARROW_RIGHT_KEY, ARROW_DOWN_KEY].includes(event.key)
174
+ const nextActiveElement = getNextActiveElement(this._getChildren().filter(element => !isDisabled(element)), event.target, isNext, true)
126
175
 
127
- if (active && isTransitioning) {
128
- active.classList.remove(CLASS_NAME_SHOW)
129
- this._queueCallback(complete, element, true)
130
- } else {
131
- complete()
176
+ if (nextActiveElement) {
177
+ Tab.getOrCreateInstance(nextActiveElement).show()
132
178
  }
133
179
  }
134
180
 
135
- _transitionComplete(element, active, callback) {
136
- if (active) {
137
- active.classList.remove(CLASS_NAME_ACTIVE)
181
+ _getChildren() { // collection of inner elements
182
+ return SelectorEngine.find(SELECTOR_INNER_ELEM, this._parent)
183
+ }
138
184
 
139
- const dropdownChild = SelectorEngine.findOne(SELECTOR_DROPDOWN_ACTIVE_CHILD, active.parentNode)
185
+ _getActiveElem() {
186
+ return this._getChildren().find(child => this._elemIsActive(child)) || null
187
+ }
140
188
 
141
- if (dropdownChild) {
142
- dropdownChild.classList.remove(CLASS_NAME_ACTIVE)
143
- }
189
+ _setInitialAttributes(parent, children) {
190
+ this._setAttributeIfNotExists(parent, 'role', 'tablist')
144
191
 
145
- if (active.getAttribute('role') === 'tab') {
146
- active.setAttribute('aria-selected', false)
147
- }
192
+ for (const child of children) {
193
+ this._setInitialAttributesOnChild(child)
148
194
  }
195
+ }
149
196
 
150
- element.classList.add(CLASS_NAME_ACTIVE)
151
- if (element.getAttribute('role') === 'tab') {
152
- element.setAttribute('aria-selected', true)
197
+ _setInitialAttributesOnChild(child) {
198
+ child = this._getInnerElement(child)
199
+ const isActive = this._elemIsActive(child)
200
+ const outerElem = this._getOuterElement(child)
201
+ child.setAttribute('aria-selected', isActive)
202
+
203
+ if (outerElem !== child) {
204
+ this._setAttributeIfNotExists(outerElem, 'role', 'presentation')
205
+ }
206
+
207
+ if (!isActive) {
208
+ child.setAttribute('tabindex', '-1')
153
209
  }
154
210
 
155
- reflow(element)
211
+ this._setAttributeIfNotExists(child, 'role', 'tab')
212
+
213
+ // set attributes to the related panel too
214
+ this._setInitialAttributesOnTargetPanel(child)
215
+ }
156
216
 
157
- if (element.classList.contains(CLASS_NAME_FADE)) {
158
- element.classList.add(CLASS_NAME_SHOW)
217
+ _setInitialAttributesOnTargetPanel(child) {
218
+ const target = getElementFromSelector(child)
219
+
220
+ if (!target) {
221
+ return
159
222
  }
160
223
 
161
- let parent = element.parentNode
162
- if (parent && parent.nodeName === 'LI') {
163
- parent = parent.parentNode
224
+ this._setAttributeIfNotExists(target, 'role', 'tabpanel')
225
+
226
+ if (child.id) {
227
+ this._setAttributeIfNotExists(target, 'aria-labelledby', `#${child.id}`)
164
228
  }
229
+ }
165
230
 
166
- if (parent && parent.classList.contains(CLASS_NAME_DROPDOWN_MENU)) {
167
- const dropdownElement = element.closest(SELECTOR_DROPDOWN)
231
+ _toggleDropDown(element, open) {
232
+ const outerElem = this._getOuterElement(element)
233
+ if (!outerElem.classList.contains(CLASS_DROPDOWN)) {
234
+ return
235
+ }
168
236
 
169
- if (dropdownElement) {
170
- SelectorEngine.find(SELECTOR_DROPDOWN_TOGGLE, dropdownElement)
171
- .forEach(dropdown => dropdown.classList.add(CLASS_NAME_ACTIVE))
237
+ const toggle = (selector, className) => {
238
+ const element = SelectorEngine.findOne(selector, outerElem)
239
+ if (element) {
240
+ element.classList.toggle(className, open)
172
241
  }
173
-
174
- element.setAttribute('aria-expanded', true)
175
242
  }
176
243
 
177
- if (callback) {
178
- callback()
244
+ toggle(SELECTOR_DROPDOWN_TOGGLE, CLASS_NAME_ACTIVE)
245
+ toggle(SELECTOR_DROPDOWN_MENU, CLASS_NAME_SHOW)
246
+ toggle(SELECTOR_DROPDOWN_ITEM, CLASS_NAME_ACTIVE)
247
+ outerElem.setAttribute('aria-expanded', open)
248
+ }
249
+
250
+ _setAttributeIfNotExists(element, attribute, value) {
251
+ if (!element.hasAttribute(attribute)) {
252
+ element.setAttribute(attribute, value)
179
253
  }
180
254
  }
181
255
 
182
- // Static
256
+ _elemIsActive(elem) {
257
+ return elem.classList.contains(CLASS_NAME_ACTIVE)
258
+ }
259
+
260
+ // Try to get the inner element (usually the .nav-link)
261
+ _getInnerElement(elem) {
262
+ return elem.matches(SELECTOR_INNER_ELEM) ? elem : SelectorEngine.findOne(SELECTOR_INNER_ELEM, elem)
263
+ }
264
+
265
+ // Try to get the outer element (usually the .nav-item)
266
+ _getOuterElement(elem) {
267
+ return elem.closest(SELECTOR_OUTER) || elem
268
+ }
183
269
 
270
+ // Static
184
271
  static jQueryInterface(config) {
185
272
  return this.each(function () {
186
273
  const data = Tab.getOrCreateInstance(this)
187
274
 
188
- if (typeof config === 'string') {
189
- if (typeof data[config] === 'undefined') {
190
- throw new TypeError(`No method named "${config}"`)
191
- }
275
+ if (typeof config !== 'string') {
276
+ return
277
+ }
192
278
 
193
- data[config]()
279
+ if (data[config] === undefined || config.startsWith('_') || config === 'constructor') {
280
+ throw new TypeError(`No method named "${config}"`)
194
281
  }
282
+
283
+ data[config]()
195
284
  })
196
285
  }
197
286
  }
198
287
 
199
288
  /**
200
- * ------------------------------------------------------------------------
201
- * Data Api implementation
202
- * ------------------------------------------------------------------------
289
+ * Data API implementation
203
290
  */
204
291
 
205
292
  EventHandler.on(document, EVENT_CLICK_DATA_API, SELECTOR_DATA_TOGGLE, function (event) {
@@ -211,15 +298,19 @@ EventHandler.on(document, EVENT_CLICK_DATA_API, SELECTOR_DATA_TOGGLE, function (
211
298
  return
212
299
  }
213
300
 
214
- const data = Tab.getOrCreateInstance(this)
215
- data.show()
301
+ Tab.getOrCreateInstance(this).show()
216
302
  })
217
303
 
218
304
  /**
219
- * ------------------------------------------------------------------------
305
+ * Initialize on focus
306
+ */
307
+ EventHandler.on(window, EVENT_LOAD_DATA_API, () => {
308
+ for (const element of SelectorEngine.find(SELECTOR_DATA_TOGGLE_ACTIVE)) {
309
+ Tab.getOrCreateInstance(element)
310
+ }
311
+ })
312
+ /**
220
313
  * jQuery
221
- * ------------------------------------------------------------------------
222
- * add .Tab to jQuery only if jQuery is present
223
314
  */
224
315
 
225
316
  defineJQueryPlugin(Tab)
package/js/src/toast.js CHANGED
@@ -1,6 +1,6 @@
1
1
  /**
2
2
  * --------------------------------------------------------------------------
3
- * CoreUI (v4.1.6): toast.js
3
+ * CoreUI (v4.2.2): toast.js
4
4
  * Licensed under MIT (https://coreui.io/license)
5
5
  *
6
6
  * This component is a modified version of the Bootstrap's toast.js
@@ -8,20 +8,13 @@
8
8
  * --------------------------------------------------------------------------
9
9
  */
10
10
 
11
- import {
12
- defineJQueryPlugin,
13
- reflow,
14
- typeCheckConfig
15
- } from './util/index'
11
+ import { defineJQueryPlugin, reflow } from './util/index'
16
12
  import EventHandler from './dom/event-handler'
17
- import Manipulator from './dom/manipulator'
18
13
  import BaseComponent from './base-component'
19
14
  import { enableDismissTrigger } from './util/component-functions'
20
15
 
21
16
  /**
22
- * ------------------------------------------------------------------------
23
17
  * Constants
24
- * ------------------------------------------------------------------------
25
18
  */
26
19
 
27
20
  const NAME = 'toast'
@@ -55,16 +48,13 @@ const Default = {
55
48
  }
56
49
 
57
50
  /**
58
- * ------------------------------------------------------------------------
59
- * Class Definition
60
- * ------------------------------------------------------------------------
51
+ * Class definition
61
52
  */
62
53
 
63
54
  class Toast extends BaseComponent {
64
55
  constructor(element, config) {
65
- super(element)
56
+ super(element, config)
66
57
 
67
- this._config = this._getConfig(config)
68
58
  this._timeout = null
69
59
  this._hasMouseInteraction = false
70
60
  this._hasKeyboardInteraction = false
@@ -72,21 +62,19 @@ class Toast extends BaseComponent {
72
62
  }
73
63
 
74
64
  // Getters
65
+ static get Default() {
66
+ return Default
67
+ }
75
68
 
76
69
  static get DefaultType() {
77
70
  return DefaultType
78
71
  }
79
72
 
80
- static get Default() {
81
- return Default
82
- }
83
-
84
73
  static get NAME() {
85
74
  return NAME
86
75
  }
87
76
 
88
77
  // Public
89
-
90
78
  show() {
91
79
  const showEvent = EventHandler.trigger(this._element, EVENT_SHOW)
92
80
 
@@ -109,14 +97,13 @@ class Toast extends BaseComponent {
109
97
 
110
98
  this._element.classList.remove(CLASS_NAME_HIDE) // @deprecated
111
99
  reflow(this._element)
112
- this._element.classList.add(CLASS_NAME_SHOW)
113
- this._element.classList.add(CLASS_NAME_SHOWING)
100
+ this._element.classList.add(CLASS_NAME_SHOW, CLASS_NAME_SHOWING)
114
101
 
115
102
  this._queueCallback(complete, this._element, this._config.animation)
116
103
  }
117
104
 
118
105
  hide() {
119
- if (!this._element.classList.contains(CLASS_NAME_SHOW)) {
106
+ if (!this.isShown()) {
120
107
  return
121
108
  }
122
109
 
@@ -128,8 +115,7 @@ class Toast extends BaseComponent {
128
115
 
129
116
  const complete = () => {
130
117
  this._element.classList.add(CLASS_NAME_HIDE) // @deprecated
131
- this._element.classList.remove(CLASS_NAME_SHOWING)
132
- this._element.classList.remove(CLASS_NAME_SHOW)
118
+ this._element.classList.remove(CLASS_NAME_SHOWING, CLASS_NAME_SHOW)
133
119
  EventHandler.trigger(this._element, EVENT_HIDDEN)
134
120
  }
135
121
 
@@ -140,27 +126,19 @@ class Toast extends BaseComponent {
140
126
  dispose() {
141
127
  this._clearTimeout()
142
128
 
143
- if (this._element.classList.contains(CLASS_NAME_SHOW)) {
129
+ if (this.isShown()) {
144
130
  this._element.classList.remove(CLASS_NAME_SHOW)
145
131
  }
146
132
 
147
133
  super.dispose()
148
134
  }
149
135
 
150
- // Private
151
-
152
- _getConfig(config) {
153
- config = {
154
- ...Default,
155
- ...Manipulator.getDataAttributes(this._element),
156
- ...(typeof config === 'object' && config ? config : {})
157
- }
158
-
159
- typeCheckConfig(NAME, config, this.constructor.DefaultType)
160
-
161
- return config
136
+ isShown() {
137
+ return this._element.classList.contains(CLASS_NAME_SHOW)
162
138
  }
163
139
 
140
+ // Private
141
+
164
142
  _maybeScheduleHide() {
165
143
  if (!this._config.autohide) {
166
144
  return
@@ -215,7 +193,6 @@ class Toast extends BaseComponent {
215
193
  }
216
194
 
217
195
  // Static
218
-
219
196
  static jQueryInterface(config) {
220
197
  return this.each(function () {
221
198
  const data = Toast.getOrCreateInstance(this, config)
@@ -231,13 +208,14 @@ class Toast extends BaseComponent {
231
208
  }
232
209
  }
233
210
 
211
+ /**
212
+ * Data API implementation
213
+ */
214
+
234
215
  enableDismissTrigger(Toast)
235
216
 
236
217
  /**
237
- * ------------------------------------------------------------------------
238
218
  * jQuery
239
- * ------------------------------------------------------------------------
240
- * add .Toast to jQuery only if jQuery is present
241
219
  */
242
220
 
243
221
  defineJQueryPlugin(Toast)