@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,451 @@
1
+ /**
2
+ * --------------------------------------------------------------------------
3
+ * CoreUI (v4.0.2): modal.js
4
+ * Licensed under MIT (https://coreui.io/license)
5
+ *
6
+ * This component is a modified version of the Bootstrap's modal.js
7
+ * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)
8
+ * --------------------------------------------------------------------------
9
+ */
10
+
11
+ import {
12
+ defineJQueryPlugin,
13
+ getElementFromSelector,
14
+ isRTL,
15
+ isVisible,
16
+ reflow,
17
+ typeCheckConfig
18
+ } from './util/index'
19
+ import EventHandler from './dom/event-handler'
20
+ import Manipulator from './dom/manipulator'
21
+ import SelectorEngine from './dom/selector-engine'
22
+ import ScrollBarHelper from './util/scrollbar'
23
+ import BaseComponent from './base-component'
24
+ import Backdrop from './util/backdrop'
25
+
26
+ /**
27
+ * ------------------------------------------------------------------------
28
+ * Constants
29
+ * ------------------------------------------------------------------------
30
+ */
31
+
32
+ const NAME = 'modal'
33
+ const DATA_KEY = 'coreui.modal'
34
+ const EVENT_KEY = `.${DATA_KEY}`
35
+ const DATA_API_KEY = '.data-api'
36
+ const ESCAPE_KEY = 'Escape'
37
+
38
+ const Default = {
39
+ backdrop: true,
40
+ keyboard: true,
41
+ focus: true
42
+ }
43
+
44
+ const DefaultType = {
45
+ backdrop: '(boolean|string)',
46
+ keyboard: 'boolean',
47
+ focus: 'boolean'
48
+ }
49
+
50
+ const EVENT_HIDE = `hide${EVENT_KEY}`
51
+ const EVENT_HIDE_PREVENTED = `hidePrevented${EVENT_KEY}`
52
+ const EVENT_HIDDEN = `hidden${EVENT_KEY}`
53
+ const EVENT_SHOW = `show${EVENT_KEY}`
54
+ const EVENT_SHOWN = `shown${EVENT_KEY}`
55
+ const EVENT_FOCUSIN = `focusin${EVENT_KEY}`
56
+ const EVENT_RESIZE = `resize${EVENT_KEY}`
57
+ const EVENT_CLICK_DISMISS = `click.dismiss${EVENT_KEY}`
58
+ const EVENT_KEYDOWN_DISMISS = `keydown.dismiss${EVENT_KEY}`
59
+ const EVENT_MOUSEUP_DISMISS = `mouseup.dismiss${EVENT_KEY}`
60
+ const EVENT_MOUSEDOWN_DISMISS = `mousedown.dismiss${EVENT_KEY}`
61
+ const EVENT_CLICK_DATA_API = `click${EVENT_KEY}${DATA_API_KEY}`
62
+
63
+ const CLASS_NAME_OPEN = 'modal-open'
64
+ const CLASS_NAME_FADE = 'fade'
65
+ const CLASS_NAME_SHOW = 'show'
66
+ const CLASS_NAME_STATIC = 'modal-static'
67
+
68
+ const SELECTOR_DIALOG = '.modal-dialog'
69
+ const SELECTOR_MODAL_BODY = '.modal-body'
70
+ const SELECTOR_DATA_TOGGLE = '[data-coreui-toggle="modal"]'
71
+ const SELECTOR_DATA_DISMISS = '[data-coreui-dismiss="modal"]'
72
+
73
+ /**
74
+ * ------------------------------------------------------------------------
75
+ * Class Definition
76
+ * ------------------------------------------------------------------------
77
+ */
78
+
79
+ class Modal extends BaseComponent {
80
+ constructor(element, config) {
81
+ super(element)
82
+
83
+ this._config = this._getConfig(config)
84
+ this._dialog = SelectorEngine.findOne(SELECTOR_DIALOG, this._element)
85
+ this._backdrop = this._initializeBackDrop()
86
+ this._isShown = false
87
+ this._ignoreBackdropClick = false
88
+ this._isTransitioning = false
89
+ this._scrollBar = new ScrollBarHelper()
90
+ }
91
+
92
+ // Getters
93
+
94
+ static get Default() {
95
+ return Default
96
+ }
97
+
98
+ static get NAME() {
99
+ return NAME
100
+ }
101
+
102
+ // Public
103
+
104
+ toggle(relatedTarget) {
105
+ return this._isShown ? this.hide() : this.show(relatedTarget)
106
+ }
107
+
108
+ show(relatedTarget) {
109
+ if (this._isShown || this._isTransitioning) {
110
+ return
111
+ }
112
+
113
+ const showEvent = EventHandler.trigger(this._element, EVENT_SHOW, {
114
+ relatedTarget
115
+ })
116
+
117
+ if (showEvent.defaultPrevented) {
118
+ return
119
+ }
120
+
121
+ this._isShown = true
122
+
123
+ if (this._isAnimated()) {
124
+ this._isTransitioning = true
125
+ }
126
+
127
+ this._scrollBar.hide()
128
+
129
+ document.body.classList.add(CLASS_NAME_OPEN)
130
+
131
+ this._adjustDialog()
132
+
133
+ this._setEscapeEvent()
134
+ this._setResizeEvent()
135
+
136
+ EventHandler.on(this._element, EVENT_CLICK_DISMISS, SELECTOR_DATA_DISMISS, event => this.hide(event))
137
+
138
+ EventHandler.on(this._dialog, EVENT_MOUSEDOWN_DISMISS, () => {
139
+ EventHandler.one(this._element, EVENT_MOUSEUP_DISMISS, event => {
140
+ if (event.target === this._element) {
141
+ this._ignoreBackdropClick = true
142
+ }
143
+ })
144
+ })
145
+
146
+ this._showBackdrop(() => this._showElement(relatedTarget))
147
+ }
148
+
149
+ hide(event) {
150
+ if (event && ['A', 'AREA'].includes(event.target.tagName)) {
151
+ event.preventDefault()
152
+ }
153
+
154
+ if (!this._isShown || this._isTransitioning) {
155
+ return
156
+ }
157
+
158
+ const hideEvent = EventHandler.trigger(this._element, EVENT_HIDE)
159
+
160
+ if (hideEvent.defaultPrevented) {
161
+ return
162
+ }
163
+
164
+ this._isShown = false
165
+ const isAnimated = this._isAnimated()
166
+
167
+ if (isAnimated) {
168
+ this._isTransitioning = true
169
+ }
170
+
171
+ this._setEscapeEvent()
172
+ this._setResizeEvent()
173
+
174
+ EventHandler.off(document, EVENT_FOCUSIN)
175
+
176
+ this._element.classList.remove(CLASS_NAME_SHOW)
177
+
178
+ EventHandler.off(this._element, EVENT_CLICK_DISMISS)
179
+ EventHandler.off(this._dialog, EVENT_MOUSEDOWN_DISMISS)
180
+
181
+ this._queueCallback(() => this._hideModal(), this._element, isAnimated)
182
+ }
183
+
184
+ dispose() {
185
+ [window, this._dialog]
186
+ .forEach(htmlElement => EventHandler.off(htmlElement, EVENT_KEY))
187
+
188
+ this._backdrop.dispose()
189
+ super.dispose()
190
+
191
+ /**
192
+ * `document` has 2 events `EVENT_FOCUSIN` and `EVENT_CLICK_DATA_API`
193
+ * Do not move `document` in `htmlElements` array
194
+ * It will remove `EVENT_CLICK_DATA_API` event that should remain
195
+ */
196
+ EventHandler.off(document, EVENT_FOCUSIN)
197
+ }
198
+
199
+ handleUpdate() {
200
+ this._adjustDialog()
201
+ }
202
+
203
+ // Private
204
+
205
+ _initializeBackDrop() {
206
+ return new Backdrop({
207
+ isVisible: Boolean(this._config.backdrop), // 'static' option will be translated to true, and booleans will keep their value
208
+ isAnimated: this._isAnimated()
209
+ })
210
+ }
211
+
212
+ _getConfig(config) {
213
+ config = {
214
+ ...Default,
215
+ ...Manipulator.getDataAttributes(this._element),
216
+ ...(typeof config === 'object' ? config : {})
217
+ }
218
+ typeCheckConfig(NAME, config, DefaultType)
219
+ return config
220
+ }
221
+
222
+ _showElement(relatedTarget) {
223
+ const isAnimated = this._isAnimated()
224
+ const modalBody = SelectorEngine.findOne(SELECTOR_MODAL_BODY, this._dialog)
225
+
226
+ if (!this._element.parentNode || this._element.parentNode.nodeType !== Node.ELEMENT_NODE) {
227
+ // Don't move modal's DOM position
228
+ document.body.appendChild(this._element)
229
+ }
230
+
231
+ this._element.style.display = 'block'
232
+ this._element.removeAttribute('aria-hidden')
233
+ this._element.setAttribute('aria-modal', true)
234
+ this._element.setAttribute('role', 'dialog')
235
+ this._element.scrollTop = 0
236
+
237
+ if (modalBody) {
238
+ modalBody.scrollTop = 0
239
+ }
240
+
241
+ if (isAnimated) {
242
+ reflow(this._element)
243
+ }
244
+
245
+ this._element.classList.add(CLASS_NAME_SHOW)
246
+
247
+ if (this._config.focus) {
248
+ this._enforceFocus()
249
+ }
250
+
251
+ const transitionComplete = () => {
252
+ if (this._config.focus) {
253
+ this._element.focus()
254
+ }
255
+
256
+ this._isTransitioning = false
257
+ EventHandler.trigger(this._element, EVENT_SHOWN, {
258
+ relatedTarget
259
+ })
260
+ }
261
+
262
+ this._queueCallback(transitionComplete, this._dialog, isAnimated)
263
+ }
264
+
265
+ _enforceFocus() {
266
+ EventHandler.off(document, EVENT_FOCUSIN) // guard against infinite focus loop
267
+ EventHandler.on(document, EVENT_FOCUSIN, event => {
268
+ if (document !== event.target &&
269
+ this._element !== event.target &&
270
+ !this._element.contains(event.target)) {
271
+ this._element.focus()
272
+ }
273
+ })
274
+ }
275
+
276
+ _setEscapeEvent() {
277
+ if (this._isShown) {
278
+ EventHandler.on(this._element, EVENT_KEYDOWN_DISMISS, event => {
279
+ if (this._config.keyboard && event.key === ESCAPE_KEY) {
280
+ event.preventDefault()
281
+ this.hide()
282
+ } else if (!this._config.keyboard && event.key === ESCAPE_KEY) {
283
+ this._triggerBackdropTransition()
284
+ }
285
+ })
286
+ } else {
287
+ EventHandler.off(this._element, EVENT_KEYDOWN_DISMISS)
288
+ }
289
+ }
290
+
291
+ _setResizeEvent() {
292
+ if (this._isShown) {
293
+ EventHandler.on(window, EVENT_RESIZE, () => this._adjustDialog())
294
+ } else {
295
+ EventHandler.off(window, EVENT_RESIZE)
296
+ }
297
+ }
298
+
299
+ _hideModal() {
300
+ this._element.style.display = 'none'
301
+ this._element.setAttribute('aria-hidden', true)
302
+ this._element.removeAttribute('aria-modal')
303
+ this._element.removeAttribute('role')
304
+ this._isTransitioning = false
305
+ this._backdrop.hide(() => {
306
+ document.body.classList.remove(CLASS_NAME_OPEN)
307
+ this._resetAdjustments()
308
+ this._scrollBar.reset()
309
+ EventHandler.trigger(this._element, EVENT_HIDDEN)
310
+ })
311
+ }
312
+
313
+ _showBackdrop(callback) {
314
+ EventHandler.on(this._element, EVENT_CLICK_DISMISS, event => {
315
+ if (this._ignoreBackdropClick) {
316
+ this._ignoreBackdropClick = false
317
+ return
318
+ }
319
+
320
+ if (event.target !== event.currentTarget) {
321
+ return
322
+ }
323
+
324
+ if (this._config.backdrop === true) {
325
+ this.hide()
326
+ } else if (this._config.backdrop === 'static') {
327
+ this._triggerBackdropTransition()
328
+ }
329
+ })
330
+
331
+ this._backdrop.show(callback)
332
+ }
333
+
334
+ _isAnimated() {
335
+ return this._element.classList.contains(CLASS_NAME_FADE)
336
+ }
337
+
338
+ _triggerBackdropTransition() {
339
+ const hideEvent = EventHandler.trigger(this._element, EVENT_HIDE_PREVENTED)
340
+ if (hideEvent.defaultPrevented) {
341
+ return
342
+ }
343
+
344
+ const { classList, scrollHeight, style } = this._element
345
+ const isModalOverflowing = scrollHeight > document.documentElement.clientHeight
346
+
347
+ // return if the following background transition hasn't yet completed
348
+ if ((!isModalOverflowing && style.overflowY === 'hidden') || classList.contains(CLASS_NAME_STATIC)) {
349
+ return
350
+ }
351
+
352
+ if (!isModalOverflowing) {
353
+ style.overflowY = 'hidden'
354
+ }
355
+
356
+ classList.add(CLASS_NAME_STATIC)
357
+ this._queueCallback(() => {
358
+ classList.remove(CLASS_NAME_STATIC)
359
+ if (!isModalOverflowing) {
360
+ this._queueCallback(() => {
361
+ style.overflowY = ''
362
+ }, this._dialog)
363
+ }
364
+ }, this._dialog)
365
+
366
+ this._element.focus()
367
+ }
368
+
369
+ // ----------------------------------------------------------------------
370
+ // the following methods are used to handle overflowing modals
371
+ // ----------------------------------------------------------------------
372
+
373
+ _adjustDialog() {
374
+ const isModalOverflowing = this._element.scrollHeight > document.documentElement.clientHeight
375
+ const scrollbarWidth = this._scrollBar.getWidth()
376
+ const isBodyOverflowing = scrollbarWidth > 0
377
+
378
+ if ((!isBodyOverflowing && isModalOverflowing && !isRTL()) || (isBodyOverflowing && !isModalOverflowing && isRTL())) {
379
+ this._element.style.paddingLeft = `${scrollbarWidth}px`
380
+ }
381
+
382
+ if ((isBodyOverflowing && !isModalOverflowing && !isRTL()) || (!isBodyOverflowing && isModalOverflowing && isRTL())) {
383
+ this._element.style.paddingRight = `${scrollbarWidth}px`
384
+ }
385
+ }
386
+
387
+ _resetAdjustments() {
388
+ this._element.style.paddingLeft = ''
389
+ this._element.style.paddingRight = ''
390
+ }
391
+
392
+ // Static
393
+
394
+ static jQueryInterface(config, relatedTarget) {
395
+ return this.each(function () {
396
+ const data = Modal.getOrCreateInstance(this, config)
397
+
398
+ if (typeof config !== 'string') {
399
+ return
400
+ }
401
+
402
+ if (typeof data[config] === 'undefined') {
403
+ throw new TypeError(`No method named "${config}"`)
404
+ }
405
+
406
+ data[config](relatedTarget)
407
+ })
408
+ }
409
+ }
410
+
411
+ /**
412
+ * ------------------------------------------------------------------------
413
+ * Data Api implementation
414
+ * ------------------------------------------------------------------------
415
+ */
416
+
417
+ EventHandler.on(document, EVENT_CLICK_DATA_API, SELECTOR_DATA_TOGGLE, function (event) {
418
+ const target = getElementFromSelector(this)
419
+
420
+ if (['A', 'AREA'].includes(this.tagName)) {
421
+ event.preventDefault()
422
+ }
423
+
424
+ EventHandler.one(target, EVENT_SHOW, showEvent => {
425
+ if (showEvent.defaultPrevented) {
426
+ // only register focus restorer if modal will actually get shown
427
+ return
428
+ }
429
+
430
+ EventHandler.one(target, EVENT_HIDDEN, () => {
431
+ if (isVisible(this)) {
432
+ this.focus()
433
+ }
434
+ })
435
+ })
436
+
437
+ const data = Modal.getOrCreateInstance(target)
438
+
439
+ data.toggle(this)
440
+ })
441
+
442
+ /**
443
+ * ------------------------------------------------------------------------
444
+ * jQuery
445
+ * ------------------------------------------------------------------------
446
+ * add .Modal to jQuery only if jQuery is present
447
+ */
448
+
449
+ defineJQueryPlugin(Modal)
450
+
451
+ export default Modal
@@ -0,0 +1,298 @@
1
+ /**
2
+ * --------------------------------------------------------------------------
3
+ * CoreUI (v4.0.2): alert.js
4
+ * Licensed under MIT (https://coreui.io/license)
5
+ * --------------------------------------------------------------------------
6
+ */
7
+
8
+ import {
9
+ defineJQueryPlugin,
10
+ // emulateTransitionEnd,
11
+ // getTransitionDurationFromElement,
12
+ typeCheckConfig
13
+ } from './util/index'
14
+ import Data from './dom/data'
15
+ import EventHandler from './dom/event-handler'
16
+ import Manipulator from './dom/manipulator'
17
+ import SelectorEngine from './dom/selector-engine'
18
+ import BaseComponent from './base-component'
19
+
20
+ /**
21
+ * ------------------------------------------------------------------------
22
+ * Constants
23
+ * ------------------------------------------------------------------------
24
+ */
25
+
26
+ const NAME = 'navigation'
27
+ const DATA_KEY = 'coreui.navigation'
28
+ const EVENT_KEY = `.${DATA_KEY}`
29
+ const DATA_API_KEY = '.data-api'
30
+
31
+ const Default = {
32
+ activeLinksExact: true,
33
+ groupsAutoCollapse: true
34
+ }
35
+
36
+ const DefaultType = {
37
+ activeLinksExact: 'boolean',
38
+ groupsAutoCollapse: '(string|boolean)'
39
+ }
40
+
41
+ const CLASS_NAME_ACTIVE = 'active'
42
+ const CLASS_NAME_SHOW = 'show'
43
+
44
+ const CLASS_NAME_NAV_GROUP = 'nav-group'
45
+ const CLASS_NAME_NAV_GROUP_TOGGLE = 'nav-group-toggle'
46
+
47
+ const EVENT_CLICK_DATA_API = `click${EVENT_KEY}${DATA_API_KEY}`
48
+ const EVENT_LOAD_DATA_API = `load${EVENT_KEY}${DATA_API_KEY}`
49
+
50
+ const SELECTOR_NAV_GROUP = '.nav-group'
51
+ const SELECTOR_NAV_GROUP_ITEMS = '.nav-group-items'
52
+ const SELECTOR_NAV_GROUP_TOGGLE = '.nav-group-toggle'
53
+ const SELECTOR_NAV_LINK = '.nav-link'
54
+ const SELECTOR_DATA_NAVIGATION = '[data-coreui="navigation"]'
55
+
56
+ /**
57
+ * ------------------------------------------------------------------------
58
+ * Class Definition
59
+ * ------------------------------------------------------------------------
60
+ */
61
+
62
+ class Navigation extends BaseComponent {
63
+ constructor(element, config) {
64
+ super(element)
65
+ this._config = this._getConfig(config)
66
+ this._setActiveLink()
67
+ this._addEventListeners()
68
+
69
+ Data.set(element, DATA_KEY, this)
70
+ }
71
+ // Getters
72
+
73
+ static get Default() {
74
+ return Default
75
+ }
76
+
77
+ static get DATA_KEY() {
78
+ return DATA_KEY
79
+ }
80
+
81
+ static get DefaultType() {
82
+ return DefaultType
83
+ }
84
+
85
+ // Private
86
+
87
+ _getConfig(config) {
88
+ config = {
89
+ ...Default,
90
+ ...Manipulator.getDataAttributes(this._element),
91
+ ...(typeof config === 'object' ? config : {})
92
+ }
93
+ typeCheckConfig(NAME, config, DefaultType)
94
+ return config
95
+ }
96
+
97
+ _setActiveLink() {
98
+ Array.from(this._element.querySelectorAll(SELECTOR_NAV_LINK)).forEach(element => {
99
+ if (element.classList.contains(CLASS_NAME_NAV_GROUP_TOGGLE)) {
100
+ return
101
+ }
102
+
103
+ let currentUrl = String(window.location)
104
+
105
+ const urlHasParams = /\?.*=/
106
+ const urlHasQueryString = /\?./
107
+ const urlHasHash = /#./
108
+
109
+ if (urlHasParams.test(currentUrl) || urlHasQueryString.test(currentUrl)) {
110
+ currentUrl = currentUrl.split('?')[0]
111
+ }
112
+
113
+ if (urlHasHash.test(currentUrl)) {
114
+ currentUrl = currentUrl.split('#')[0]
115
+ }
116
+
117
+ if (this._config.activeLinksExact && element.href === currentUrl) {
118
+ element.classList.add(CLASS_NAME_ACTIVE)
119
+ Array.from(this._getParents(element, SELECTOR_NAV_GROUP)).forEach(element => {
120
+ element.classList.add(CLASS_NAME_SHOW)
121
+ element.setAttribute('aria-expanded', true)
122
+ })
123
+ }
124
+
125
+ if (!this._config.activeLinksExact && element.href.startsWith(currentUrl)) {
126
+ element.classList.add(CLASS_NAME_ACTIVE)
127
+ Array.from(this._getParents(element, SELECTOR_NAV_GROUP)).forEach(element => {
128
+ element.classList.add(CLASS_NAME_SHOW)
129
+ element.setAttribute('aria-expanded', true)
130
+ })
131
+ }
132
+ })
133
+ }
134
+
135
+ _getParents(element, selector) {
136
+ // Setup parents array
137
+ const parents = []
138
+
139
+ // Get matching parent elements
140
+ for (; element && element !== document; element = element.parentNode) {
141
+ // Add matching parents to array
142
+ if (selector) {
143
+ if (element.matches(selector)) {
144
+ parents.push(element)
145
+ }
146
+ } else {
147
+ parents.push(element)
148
+ }
149
+ }
150
+
151
+ return parents
152
+ }
153
+
154
+ _getAllSiblings(element, filter) {
155
+ const siblings = []
156
+ element = element.parentNode.firstChild
157
+ do {
158
+ if (element.nodeType === 3) {
159
+ continue // text node
160
+ }
161
+
162
+ if (element.nodeType === 8) {
163
+ continue // comment node
164
+ }
165
+
166
+ if (!filter || filter(element)) {
167
+ siblings.push(element)
168
+ }
169
+
170
+ // eslint-disable-next-line no-cond-assign
171
+ } while (element = element.nextSibling)
172
+
173
+ return siblings
174
+ }
175
+
176
+ _getChildren(n, skipMe) {
177
+ const children = []
178
+ for (; n; n = n.nextSibling) {
179
+ if (n.nodeType === 1 && n !== skipMe) {
180
+ children.push(n)
181
+ }
182
+ }
183
+
184
+ return children
185
+ }
186
+
187
+ _getSiblings(element, filter) {
188
+ const siblings = this._getChildren(element.parentNode.firstChild, element).filter(filter)
189
+ return siblings
190
+ }
191
+
192
+ _slideDown(element) {
193
+ element.style.height = 'auto'
194
+ const height = element.clientHeight
195
+ element.style.height = '0px'
196
+ setTimeout(() => {
197
+ element.style.height = `${height}px`
198
+ }, 0)
199
+
200
+ this._queueCallback(() => {
201
+ element.style.height = 'auto'
202
+ }, element, true)
203
+ }
204
+
205
+ _slideUp(element, callback) {
206
+ const height = element.clientHeight
207
+ element.style.height = `${height}px`
208
+ setTimeout(() => {
209
+ element.style.height = '0px'
210
+ }, 0)
211
+
212
+ this._queueCallback(() => {
213
+ if (typeof callback === 'function') {
214
+ callback()
215
+ }
216
+ }, element, true)
217
+ }
218
+
219
+ _toggleGroupItems(event) {
220
+ let toggler = event.target
221
+ if (!toggler.classList.contains(CLASS_NAME_NAV_GROUP_TOGGLE)) {
222
+ toggler = toggler.closest(SELECTOR_NAV_GROUP_TOGGLE)
223
+ }
224
+
225
+ const filter = element => Boolean(element.classList.contains(CLASS_NAME_NAV_GROUP) && element.classList.contains(CLASS_NAME_SHOW))
226
+
227
+ // Close other groups
228
+ if (this._config.groupsAutoCollapse === true) {
229
+ this._getSiblings(toggler.parentNode, filter).forEach(element => {
230
+ this._slideUp(SelectorEngine.findOne(SELECTOR_NAV_GROUP_ITEMS, element), () => {
231
+ element.classList.remove(CLASS_NAME_SHOW)
232
+ element.setAttribute('aria-expanded', false)
233
+ })
234
+ })
235
+ }
236
+
237
+ if (toggler.parentNode.classList.contains(CLASS_NAME_SHOW)) {
238
+ this._slideUp(SelectorEngine.findOne(SELECTOR_NAV_GROUP_ITEMS, toggler.parentNode), () => {
239
+ toggler.parentNode.classList.remove(CLASS_NAME_SHOW)
240
+ toggler.parentNode.setAttribute('aria-expanded', false)
241
+ })
242
+ return
243
+ }
244
+
245
+ toggler.parentNode.classList.add(CLASS_NAME_SHOW)
246
+ toggler.parentNode.setAttribute('aria-expanded', true)
247
+ this._slideDown(SelectorEngine.findOne(SELECTOR_NAV_GROUP_ITEMS, toggler.parentNode))
248
+ }
249
+
250
+ _addEventListeners() {
251
+ EventHandler.on(this._element, EVENT_CLICK_DATA_API, SELECTOR_NAV_GROUP_TOGGLE, event => {
252
+ event.preventDefault()
253
+ this._toggleGroupItems(event, this)
254
+ })
255
+ }
256
+
257
+ // Static
258
+
259
+ static navigationInterface(element, config) {
260
+ const data = Navigation.getOrCreateInstance(element, config)
261
+
262
+ if (typeof config === 'string') {
263
+ if (typeof data[config] === 'undefined') {
264
+ throw new TypeError(`No method named "${config}"`)
265
+ }
266
+
267
+ data[config]()
268
+ }
269
+ }
270
+
271
+ static jQueryInterface(config) {
272
+ return this.each(function () {
273
+ Navigation.navigationInterface(this, config)
274
+ })
275
+ }
276
+ }
277
+
278
+ /**
279
+ * ------------------------------------------------------------------------
280
+ * Data Api implementation
281
+ * ------------------------------------------------------------------------
282
+ */
283
+ EventHandler.on(window, EVENT_LOAD_DATA_API, () => {
284
+ Array.from(document.querySelectorAll(SELECTOR_DATA_NAVIGATION)).forEach(element => {
285
+ Navigation.navigationInterface(element)
286
+ })
287
+ })
288
+
289
+ /**
290
+ * ------------------------------------------------------------------------
291
+ * jQuery
292
+ * ------------------------------------------------------------------------
293
+ * add .Navigation to jQuery only if jQuery is present
294
+ */
295
+
296
+ defineJQueryPlugin(NAME, Navigation)
297
+
298
+ export default Navigation