@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,298 @@
1
+ /**
2
+ * --------------------------------------------------------------------------
3
+ * CoreUI (v4.0.2): scrollspy.js
4
+ * Licensed under MIT (https://coreui.io/license)
5
+ *
6
+ * This component is a modified version of the Bootstrap's scrollspy.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
+ typeCheckConfig
16
+ } from './util/index'
17
+ import EventHandler from './dom/event-handler'
18
+ import Manipulator from './dom/manipulator'
19
+ import SelectorEngine from './dom/selector-engine'
20
+ import BaseComponent from './base-component'
21
+
22
+ /**
23
+ * ------------------------------------------------------------------------
24
+ * Constants
25
+ * ------------------------------------------------------------------------
26
+ */
27
+
28
+ const NAME = 'scrollspy'
29
+ const DATA_KEY = 'coreui.scrollspy'
30
+ const EVENT_KEY = `.${DATA_KEY}`
31
+ const DATA_API_KEY = '.data-api'
32
+
33
+ const Default = {
34
+ offset: 10,
35
+ method: 'auto',
36
+ target: ''
37
+ }
38
+
39
+ const DefaultType = {
40
+ offset: 'number',
41
+ method: 'string',
42
+ target: '(string|element)'
43
+ }
44
+
45
+ const EVENT_ACTIVATE = `activate${EVENT_KEY}`
46
+ const EVENT_SCROLL = `scroll${EVENT_KEY}`
47
+ const EVENT_LOAD_DATA_API = `load${EVENT_KEY}${DATA_API_KEY}`
48
+
49
+ const CLASS_NAME_DROPDOWN_ITEM = 'dropdown-item'
50
+ const CLASS_NAME_ACTIVE = 'active'
51
+
52
+ const SELECTOR_DATA_SPY = '[data-coreui-spy="scroll"]'
53
+ const SELECTOR_NAV_LIST_GROUP = '.nav, .list-group'
54
+ const SELECTOR_NAV_LINKS = '.nav-link'
55
+ const SELECTOR_NAV_ITEMS = '.nav-item'
56
+ const SELECTOR_LIST_ITEMS = '.list-group-item'
57
+ const SELECTOR_LINK_ITEMS = `${SELECTOR_NAV_LINKS}, ${SELECTOR_LIST_ITEMS}, .${CLASS_NAME_DROPDOWN_ITEM}`
58
+ const SELECTOR_DROPDOWN = '.dropdown'
59
+ const SELECTOR_DROPDOWN_TOGGLE = '.dropdown-toggle'
60
+
61
+ const METHOD_OFFSET = 'offset'
62
+ const METHOD_POSITION = 'position'
63
+
64
+ /**
65
+ * ------------------------------------------------------------------------
66
+ * Class Definition
67
+ * ------------------------------------------------------------------------
68
+ */
69
+
70
+ class ScrollSpy extends BaseComponent {
71
+ constructor(element, config) {
72
+ super(element)
73
+ this._scrollElement = this._element.tagName === 'BODY' ? window : this._element
74
+ this._config = this._getConfig(config)
75
+ this._offsets = []
76
+ this._targets = []
77
+ this._activeTarget = null
78
+ this._scrollHeight = 0
79
+
80
+ EventHandler.on(this._scrollElement, EVENT_SCROLL, () => this._process())
81
+
82
+ this.refresh()
83
+ this._process()
84
+ }
85
+
86
+ // Getters
87
+
88
+ static get Default() {
89
+ return Default
90
+ }
91
+
92
+ static get NAME() {
93
+ return NAME
94
+ }
95
+
96
+ // Public
97
+
98
+ refresh() {
99
+ const autoMethod = this._scrollElement === this._scrollElement.window ?
100
+ METHOD_OFFSET :
101
+ METHOD_POSITION
102
+
103
+ const offsetMethod = this._config.method === 'auto' ?
104
+ autoMethod :
105
+ this._config.method
106
+
107
+ const offsetBase = offsetMethod === METHOD_POSITION ?
108
+ this._getScrollTop() :
109
+ 0
110
+
111
+ this._offsets = []
112
+ this._targets = []
113
+ this._scrollHeight = this._getScrollHeight()
114
+
115
+ const targets = SelectorEngine.find(SELECTOR_LINK_ITEMS, this._config.target)
116
+
117
+ targets.map(element => {
118
+ const targetSelector = getSelectorFromElement(element)
119
+ const target = targetSelector ? SelectorEngine.findOne(targetSelector) : null
120
+
121
+ if (target) {
122
+ const targetBCR = target.getBoundingClientRect()
123
+ if (targetBCR.width || targetBCR.height) {
124
+ return [
125
+ Manipulator[offsetMethod](target).top + offsetBase,
126
+ targetSelector
127
+ ]
128
+ }
129
+ }
130
+
131
+ return null
132
+ })
133
+ .filter(item => item)
134
+ .sort((a, b) => a[0] - b[0])
135
+ .forEach(item => {
136
+ this._offsets.push(item[0])
137
+ this._targets.push(item[1])
138
+ })
139
+ }
140
+
141
+ dispose() {
142
+ EventHandler.off(this._scrollElement, EVENT_KEY)
143
+ super.dispose()
144
+ }
145
+
146
+ // Private
147
+
148
+ _getConfig(config) {
149
+ config = {
150
+ ...Default,
151
+ ...Manipulator.getDataAttributes(this._element),
152
+ ...(typeof config === 'object' && config ? config : {})
153
+ }
154
+
155
+ config.target = getElement(config.target) || document.documentElement
156
+
157
+ typeCheckConfig(NAME, config, DefaultType)
158
+
159
+ return config
160
+ }
161
+
162
+ _getScrollTop() {
163
+ return this._scrollElement === window ?
164
+ this._scrollElement.pageYOffset :
165
+ this._scrollElement.scrollTop
166
+ }
167
+
168
+ _getScrollHeight() {
169
+ return this._scrollElement.scrollHeight || Math.max(
170
+ document.body.scrollHeight,
171
+ document.documentElement.scrollHeight
172
+ )
173
+ }
174
+
175
+ _getOffsetHeight() {
176
+ return this._scrollElement === window ?
177
+ window.innerHeight :
178
+ this._scrollElement.getBoundingClientRect().height
179
+ }
180
+
181
+ _process() {
182
+ const scrollTop = this._getScrollTop() + this._config.offset
183
+ const scrollHeight = this._getScrollHeight()
184
+ const maxScroll = this._config.offset + scrollHeight - this._getOffsetHeight()
185
+
186
+ if (this._scrollHeight !== scrollHeight) {
187
+ this.refresh()
188
+ }
189
+
190
+ if (scrollTop >= maxScroll) {
191
+ const target = this._targets[this._targets.length - 1]
192
+
193
+ if (this._activeTarget !== target) {
194
+ this._activate(target)
195
+ }
196
+
197
+ return
198
+ }
199
+
200
+ if (this._activeTarget && scrollTop < this._offsets[0] && this._offsets[0] > 0) {
201
+ this._activeTarget = null
202
+ this._clear()
203
+ return
204
+ }
205
+
206
+ for (let i = this._offsets.length; i--;) {
207
+ const isActiveTarget = this._activeTarget !== this._targets[i] &&
208
+ scrollTop >= this._offsets[i] &&
209
+ (typeof this._offsets[i + 1] === 'undefined' || scrollTop < this._offsets[i + 1])
210
+
211
+ if (isActiveTarget) {
212
+ this._activate(this._targets[i])
213
+ }
214
+ }
215
+ }
216
+
217
+ _activate(target) {
218
+ this._activeTarget = target
219
+
220
+ this._clear()
221
+
222
+ const queries = SELECTOR_LINK_ITEMS.split(',')
223
+ .map(selector => `${selector}[data-coreui-target="${target}"],${selector}[href="${target}"]`)
224
+
225
+ const link = SelectorEngine.findOne(queries.join(','), this._config.target)
226
+
227
+ link.classList.add(CLASS_NAME_ACTIVE)
228
+ if (link.classList.contains(CLASS_NAME_DROPDOWN_ITEM)) {
229
+ SelectorEngine.findOne(SELECTOR_DROPDOWN_TOGGLE, link.closest(SELECTOR_DROPDOWN))
230
+ .classList.add(CLASS_NAME_ACTIVE)
231
+ } else {
232
+ SelectorEngine.parents(link, SELECTOR_NAV_LIST_GROUP)
233
+ .forEach(listGroup => {
234
+ // Set triggered links parents as active
235
+ // With both <ul> and <nav> markup a parent is the previous sibling of any nav ancestor
236
+ SelectorEngine.prev(listGroup, `${SELECTOR_NAV_LINKS}, ${SELECTOR_LIST_ITEMS}`)
237
+ .forEach(item => item.classList.add(CLASS_NAME_ACTIVE))
238
+
239
+ // Handle special case when .nav-link is inside .nav-item
240
+ SelectorEngine.prev(listGroup, SELECTOR_NAV_ITEMS)
241
+ .forEach(navItem => {
242
+ SelectorEngine.children(navItem, SELECTOR_NAV_LINKS)
243
+ .forEach(item => item.classList.add(CLASS_NAME_ACTIVE))
244
+ })
245
+ })
246
+ }
247
+
248
+ EventHandler.trigger(this._scrollElement, EVENT_ACTIVATE, {
249
+ relatedTarget: target
250
+ })
251
+ }
252
+
253
+ _clear() {
254
+ SelectorEngine.find(SELECTOR_LINK_ITEMS, this._config.target)
255
+ .filter(node => node.classList.contains(CLASS_NAME_ACTIVE))
256
+ .forEach(node => node.classList.remove(CLASS_NAME_ACTIVE))
257
+ }
258
+
259
+ // Static
260
+
261
+ static jQueryInterface(config) {
262
+ return this.each(function () {
263
+ const data = ScrollSpy.getOrCreateInstance(this, config)
264
+
265
+ if (typeof config !== 'string') {
266
+ return
267
+ }
268
+
269
+ if (typeof data[config] === 'undefined') {
270
+ throw new TypeError(`No method named "${config}"`)
271
+ }
272
+
273
+ data[config]()
274
+ })
275
+ }
276
+ }
277
+
278
+ /**
279
+ * ------------------------------------------------------------------------
280
+ * Data Api implementation
281
+ * ------------------------------------------------------------------------
282
+ */
283
+
284
+ EventHandler.on(window, EVENT_LOAD_DATA_API, () => {
285
+ SelectorEngine.find(SELECTOR_DATA_SPY)
286
+ .forEach(spy => new ScrollSpy(spy))
287
+ })
288
+
289
+ /**
290
+ * ------------------------------------------------------------------------
291
+ * jQuery
292
+ * ------------------------------------------------------------------------
293
+ * add .ScrollSpy to jQuery only if jQuery is present
294
+ */
295
+
296
+ defineJQueryPlugin(ScrollSpy)
297
+
298
+ export default ScrollSpy
@@ -0,0 +1,347 @@
1
+ /**
2
+ * --------------------------------------------------------------------------
3
+ * CoreUI (v4.0.2): sidebar.js
4
+ * Licensed under MIT (https://coreui.io/license)
5
+ * --------------------------------------------------------------------------
6
+ */
7
+
8
+ import {
9
+ defineJQueryPlugin,
10
+ reflow,
11
+ typeCheckConfig
12
+ } from './util/index'
13
+ import EventHandler from './dom/event-handler'
14
+ import Manipulator from './dom/manipulator'
15
+ import BaseComponent from './base-component'
16
+
17
+ /**
18
+ * ------------------------------------------------------------------------
19
+ * Constants
20
+ * ------------------------------------------------------------------------
21
+ */
22
+
23
+ const NAME = 'sidebar'
24
+ const DATA_KEY = 'coreui.sidebar'
25
+ const EVENT_KEY = `.${DATA_KEY}`
26
+ const DATA_API_KEY = '.data-api'
27
+
28
+ const Default = {}
29
+
30
+ const DefaultType = {}
31
+
32
+ const CLASS_NAME_BACKDROP = 'sidebar-backdrop'
33
+ const CLASS_NAME_FADE = 'fade'
34
+ const CLASS_NAME_HIDE = 'hide'
35
+ const CLASS_NAME_SHOW = 'show'
36
+ const CLASS_NAME_SIDEBAR_NARROW = 'sidebar-narrow'
37
+ const CLASS_NAME_SIDEBAR_OVERLAID = 'sidebar-overlaid'
38
+ const CLASS_NAME_SIDEBAR_NARROW_UNFOLDABLE = 'sidebar-narrow-unfoldable'
39
+
40
+ const EVENT_HIDE = `hide${EVENT_KEY}`
41
+ const EVENT_HIDDEN = `hidden${EVENT_KEY}`
42
+ const EVENT_RESIZE = 'resize'
43
+ const EVENT_SHOW = `show${EVENT_KEY}`
44
+ const EVENT_SHOWN = `shown${EVENT_KEY}`
45
+ const EVENT_CLICK_DATA_API = `click${EVENT_KEY}${DATA_API_KEY}`
46
+ const EVENT_LOAD_DATA_API = `load${EVENT_KEY}${DATA_API_KEY}`
47
+
48
+ const SELECTOR_DATA_CLOSE = '[data-coreui-close="sidebar"]'
49
+ const SELECTOR_DATA_TOGGLE = '[data-coreui-toggle]'
50
+
51
+ const SELECTOR_SIDEBAR = '.sidebar'
52
+
53
+ /**
54
+ * ------------------------------------------------------------------------
55
+ * Class Definition
56
+ * ------------------------------------------------------------------------
57
+ */
58
+
59
+ class Sidebar extends BaseComponent {
60
+ constructor(element, config) {
61
+ super(element)
62
+ this._config = this._getConfig(config)
63
+ this._show = this._isVisible()
64
+ this._mobile = this._isMobile()
65
+ this._overlaid = this._isOverlaid()
66
+ this._narrow = this._isNarrow()
67
+ this._unfoldable = this._isUnfoldable()
68
+ this._backdrop = null
69
+ this._addEventListeners()
70
+ }
71
+
72
+ // Getters
73
+
74
+ static get Default() {
75
+ return Default
76
+ }
77
+
78
+ static get DefaultType() {
79
+ return DefaultType
80
+ }
81
+
82
+ static get NAME() {
83
+ return NAME
84
+ }
85
+
86
+ // Public
87
+
88
+ show() {
89
+ EventHandler.trigger(this._element, EVENT_SHOW)
90
+
91
+ if (this._element.classList.contains(CLASS_NAME_HIDE)) {
92
+ this._element.classList.remove(CLASS_NAME_HIDE)
93
+ }
94
+
95
+ if (this._isMobile()) {
96
+ this._element.classList.add(CLASS_NAME_SHOW)
97
+ this._showBackdrop()
98
+ }
99
+
100
+ const complete = () => {
101
+ if (this._isVisible() === true) {
102
+ this._show = true
103
+ if (this._isMobile() || this._isOverlaid()) {
104
+ this._addClickOutListener()
105
+ }
106
+
107
+ EventHandler.trigger(this._element, EVENT_SHOWN)
108
+ }
109
+ }
110
+
111
+ this._queueCallback(complete, this._element, true)
112
+ }
113
+
114
+ hide() {
115
+ EventHandler.trigger(this._element, EVENT_HIDE)
116
+
117
+ if (this._element.classList.contains(CLASS_NAME_SHOW)) {
118
+ this._element.classList.remove(CLASS_NAME_SHOW)
119
+ }
120
+
121
+ if (this._isMobile()) {
122
+ this._removeBackdrop()
123
+ } else {
124
+ this._element.classList.add(CLASS_NAME_HIDE)
125
+ }
126
+
127
+ const complete = () => {
128
+ if (this._isVisible() === false) {
129
+ this._show = false
130
+ if (this._isMobile() || this._isOverlaid()) {
131
+ this._removeClickOutListener()
132
+ }
133
+
134
+ EventHandler.trigger(this._element, EVENT_HIDDEN)
135
+ }
136
+ }
137
+
138
+ this._queueCallback(complete, this._element, true)
139
+ }
140
+
141
+ toggle() {
142
+ if (this._isVisible()) {
143
+ this.hide()
144
+ return
145
+ }
146
+
147
+ this.show()
148
+ }
149
+
150
+ narrow() {
151
+ if (!this._isMobile()) {
152
+ this._addClassName(CLASS_NAME_SIDEBAR_NARROW)
153
+ this._narrow = true
154
+ }
155
+ }
156
+
157
+ unfoldable() {
158
+ if (!this._isMobile()) {
159
+ this._addClassName(CLASS_NAME_SIDEBAR_NARROW_UNFOLDABLE)
160
+ this._unfoldable = true
161
+ }
162
+ }
163
+
164
+ reset() {
165
+ if (!this._isMobile()) {
166
+ if (this._narrow) {
167
+ this._element.classList.remove(CLASS_NAME_SIDEBAR_NARROW)
168
+ this._narrow = false
169
+ }
170
+
171
+ if (this._unfoldable) {
172
+ this._element.classList.remove(CLASS_NAME_SIDEBAR_NARROW_UNFOLDABLE)
173
+ this._unfoldable = false
174
+ }
175
+ }
176
+ }
177
+
178
+ toggleNarrow() {
179
+ if (this._narrow) {
180
+ this.reset()
181
+ return
182
+ }
183
+
184
+ this.narrow()
185
+ }
186
+
187
+ toggleUnfoldable() {
188
+ if (this._unfoldable) {
189
+ this.reset()
190
+ return
191
+ }
192
+
193
+ this.unfoldable()
194
+ }
195
+
196
+ // Private
197
+
198
+ _getConfig(config) {
199
+ config = {
200
+ ...Default,
201
+ ...Manipulator.getDataAttributes(this._element),
202
+ ...(typeof config === 'object' ? config : {})
203
+ }
204
+ typeCheckConfig(NAME, config, DefaultType)
205
+ return config
206
+ }
207
+
208
+ _isMobile() {
209
+ return Boolean(window.getComputedStyle(this._element, null).getPropertyValue('--cui-is-mobile'))
210
+ }
211
+
212
+ _isNarrow() {
213
+ return this._element.classList.contains(CLASS_NAME_SIDEBAR_NARROW)
214
+ }
215
+
216
+ _isOverlaid() {
217
+ return this._element.classList.contains(CLASS_NAME_SIDEBAR_OVERLAID)
218
+ }
219
+
220
+ _isUnfoldable() {
221
+ return this._element.classList.contains(CLASS_NAME_SIDEBAR_NARROW_UNFOLDABLE)
222
+ }
223
+
224
+ _isVisible() {
225
+ const rect = this._element.getBoundingClientRect()
226
+ return (
227
+ rect.top >= 0 && rect.left >= 0 && rect.bottom <= (window.innerHeight || document.documentElement.clientHeight) && rect.right <= (window.innerWidth || document.documentElement.clientWidth)
228
+ )
229
+ }
230
+
231
+ _addClassName(className) {
232
+ this._element.classList.add(className)
233
+ }
234
+
235
+ _removeBackdrop() {
236
+ if (this._backdrop) {
237
+ this._backdrop.parentNode.removeChild(this._backdrop)
238
+ this._backdrop = null
239
+ }
240
+ }
241
+
242
+ _showBackdrop() {
243
+ if (!this._backdrop) {
244
+ this._backdrop = document.createElement('div')
245
+ this._backdrop.className = CLASS_NAME_BACKDROP
246
+ this._backdrop.classList.add(CLASS_NAME_FADE)
247
+ document.body.appendChild(this._backdrop)
248
+ reflow(this._backdrop)
249
+ this._backdrop.classList.add(CLASS_NAME_SHOW)
250
+ }
251
+ }
252
+
253
+ _clickOutListener(event, sidebar) {
254
+ if (event.target.closest(SELECTOR_SIDEBAR) === null) {
255
+ event.preventDefault()
256
+ event.stopPropagation()
257
+ sidebar.hide()
258
+ }
259
+ }
260
+
261
+ _addClickOutListener() {
262
+ EventHandler.on(document, EVENT_CLICK_DATA_API, event => {
263
+ this._clickOutListener(event, this)
264
+ })
265
+ }
266
+
267
+ _removeClickOutListener() {
268
+ EventHandler.off(document, EVENT_CLICK_DATA_API)
269
+ }
270
+
271
+ // Sidebar navigation
272
+ _addEventListeners() {
273
+ if (this._mobile && this._show) {
274
+ this._addClickOutListener()
275
+ }
276
+
277
+ if (this._overlaid && this._show) {
278
+ this._addClickOutListener()
279
+ }
280
+
281
+ EventHandler.on(this._element, EVENT_CLICK_DATA_API, SELECTOR_DATA_TOGGLE, event => {
282
+ event.preventDefault()
283
+ const toggle = Manipulator.getDataAttribute(event.target, 'toggle')
284
+
285
+ if (toggle === 'narrow') {
286
+ this.toggleNarrow()
287
+ }
288
+
289
+ if (toggle === 'unfoldable') {
290
+ this.toggleUnfoldable()
291
+ }
292
+ })
293
+
294
+ EventHandler.on(this._element, EVENT_CLICK_DATA_API, SELECTOR_DATA_CLOSE, event => {
295
+ event.preventDefault()
296
+ this.hide()
297
+ })
298
+
299
+ EventHandler.on(window, EVENT_RESIZE, () => {
300
+ if (this._isMobile() && this._isVisible()) {
301
+ this.hide()
302
+ }
303
+ })
304
+ }
305
+
306
+ // Static
307
+
308
+ static sidebarInterface(element, config) {
309
+ const data = Sidebar.getOrCreateInstance(element, config)
310
+
311
+ if (typeof config === 'string') {
312
+ if (typeof data[config] === 'undefined') {
313
+ throw new TypeError(`No method named "${config}"`)
314
+ }
315
+
316
+ data[config]()
317
+ }
318
+ }
319
+
320
+ static jQueryInterface(config) {
321
+ return this.each(function () {
322
+ Sidebar.sidebarInterface(this, config)
323
+ })
324
+ }
325
+ }
326
+
327
+ /**
328
+ * ------------------------------------------------------------------------
329
+ * Data Api implementation
330
+ * ------------------------------------------------------------------------
331
+ */
332
+
333
+ EventHandler.on(window, EVENT_LOAD_DATA_API, () => {
334
+ Array.from(document.querySelectorAll(SELECTOR_SIDEBAR)).forEach(element => {
335
+ Sidebar.sidebarInterface(element)
336
+ })
337
+ })
338
+
339
+ /**
340
+ * ------------------------------------------------------------------------
341
+ * jQuery
342
+ * ------------------------------------------------------------------------
343
+ */
344
+
345
+ defineJQueryPlugin(NAME, Sidebar)
346
+
347
+ export default Sidebar