@coreui/coreui 5.6.0 → 5.7.0

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 (120) hide show
  1. package/README.md +3 -4
  2. package/dist/css/coreui-grid.css +1 -1
  3. package/dist/css/coreui-grid.css.map +1 -1
  4. package/dist/css/coreui-grid.min.css +1 -1
  5. package/dist/css/coreui-grid.min.css.map +1 -1
  6. package/dist/css/coreui-grid.rtl.css +1 -1
  7. package/dist/css/coreui-grid.rtl.css.map +1 -1
  8. package/dist/css/coreui-grid.rtl.min.css +1 -1
  9. package/dist/css/coreui-grid.rtl.min.css.map +1 -1
  10. package/dist/css/coreui-reboot.css +5 -3
  11. package/dist/css/coreui-reboot.css.map +1 -1
  12. package/dist/css/coreui-reboot.min.css +2 -2
  13. package/dist/css/coreui-reboot.min.css.map +1 -1
  14. package/dist/css/coreui-reboot.rtl.css +5 -3
  15. package/dist/css/coreui-reboot.rtl.css.map +1 -1
  16. package/dist/css/coreui-reboot.rtl.min.css +2 -2
  17. package/dist/css/coreui-reboot.rtl.min.css.map +1 -1
  18. package/dist/css/coreui-utilities.css +5 -3
  19. package/dist/css/coreui-utilities.css.map +1 -1
  20. package/dist/css/coreui-utilities.min.css +2 -2
  21. package/dist/css/coreui-utilities.min.css.map +1 -1
  22. package/dist/css/coreui-utilities.rtl.css +5 -3
  23. package/dist/css/coreui-utilities.rtl.css.map +1 -1
  24. package/dist/css/coreui-utilities.rtl.min.css +2 -2
  25. package/dist/css/coreui-utilities.rtl.min.css.map +1 -1
  26. package/dist/css/coreui.css +172 -68
  27. package/dist/css/coreui.css.map +1 -1
  28. package/dist/css/coreui.min.css +2 -2
  29. package/dist/css/coreui.min.css.map +1 -1
  30. package/dist/css/coreui.rtl.css +167 -66
  31. package/dist/css/coreui.rtl.css.map +1 -1
  32. package/dist/css/coreui.rtl.min.css +2 -2
  33. package/dist/css/coreui.rtl.min.css.map +1 -1
  34. package/dist/css/themes/bootstrap/bootstrap.css +172 -68
  35. package/dist/css/themes/bootstrap/bootstrap.css.map +1 -1
  36. package/dist/css/themes/bootstrap/bootstrap.min.css +2 -2
  37. package/dist/css/themes/bootstrap/bootstrap.min.css.map +1 -1
  38. package/dist/css/themes/bootstrap/bootstrap.rtl.css +167 -66
  39. package/dist/css/themes/bootstrap/bootstrap.rtl.css.map +1 -1
  40. package/dist/css/themes/bootstrap/bootstrap.rtl.min.css +2 -2
  41. package/dist/css/themes/bootstrap/bootstrap.rtl.min.css.map +1 -1
  42. package/dist/js/bootstrap.bundle.js +578 -261
  43. package/dist/js/bootstrap.bundle.js.map +1 -1
  44. package/dist/js/bootstrap.bundle.min.js +2 -2
  45. package/dist/js/bootstrap.bundle.min.js.map +1 -1
  46. package/dist/js/bootstrap.esm.js +578 -262
  47. package/dist/js/bootstrap.esm.js.map +1 -1
  48. package/dist/js/bootstrap.esm.min.js +2 -2
  49. package/dist/js/bootstrap.esm.min.js.map +1 -1
  50. package/dist/js/bootstrap.js +578 -261
  51. package/dist/js/bootstrap.js.map +1 -1
  52. package/dist/js/bootstrap.min.js +2 -2
  53. package/dist/js/bootstrap.min.js.map +1 -1
  54. package/dist/js/coreui.bundle.js +578 -261
  55. package/dist/js/coreui.bundle.js.map +1 -1
  56. package/dist/js/coreui.bundle.min.js +2 -2
  57. package/dist/js/coreui.bundle.min.js.map +1 -1
  58. package/dist/js/coreui.esm.js +578 -262
  59. package/dist/js/coreui.esm.js.map +1 -1
  60. package/dist/js/coreui.esm.min.js +2 -2
  61. package/dist/js/coreui.esm.min.js.map +1 -1
  62. package/dist/js/coreui.js +578 -261
  63. package/dist/js/coreui.js.map +1 -1
  64. package/dist/js/coreui.min.js +2 -2
  65. package/dist/js/coreui.min.js.map +1 -1
  66. package/js/dist/alert.js +1 -1
  67. package/js/dist/base-component.js +2 -2
  68. package/js/dist/base-component.js.map +1 -1
  69. package/js/dist/button.js +1 -1
  70. package/js/dist/carousel.js +1 -1
  71. package/js/dist/chip-input.js +1 -3
  72. package/js/dist/chip-input.js.map +1 -1
  73. package/js/dist/chip.js +1 -1
  74. package/js/dist/collapse.js +1 -1
  75. package/js/dist/dom/data.js +1 -1
  76. package/js/dist/dom/event-handler.js +1 -1
  77. package/js/dist/dom/manipulator.js +1 -1
  78. package/js/dist/dom/selector-engine.js +1 -1
  79. package/js/dist/dropdown.js +1 -1
  80. package/js/dist/modal.js +1 -1
  81. package/js/dist/navigation.js +2 -2
  82. package/js/dist/navigation.js.map +1 -1
  83. package/js/dist/offcanvas.js +1 -1
  84. package/js/dist/popover.js +1 -1
  85. package/js/dist/scrollspy.js +1 -1
  86. package/js/dist/search-button.js +336 -0
  87. package/js/dist/search-button.js.map +1 -0
  88. package/js/dist/sidebar.js +7 -10
  89. package/js/dist/sidebar.js.map +1 -1
  90. package/js/dist/tab.js +1 -1
  91. package/js/dist/toast.js +1 -1
  92. package/js/dist/tooltip.js +1 -1
  93. package/js/dist/util/backdrop.js +1 -1
  94. package/js/dist/util/component-functions.js +1 -1
  95. package/js/dist/util/config.js +1 -1
  96. package/js/dist/util/focustrap.js +1 -1
  97. package/js/dist/util/index.js +1 -1
  98. package/js/dist/util/sanitizer.js +1 -1
  99. package/js/dist/util/scrollbar.js +1 -1
  100. package/js/dist/util/swipe.js +1 -1
  101. package/js/dist/util/template-factory.js +1 -1
  102. package/js/index.esm.js +1 -0
  103. package/js/index.umd.js +2 -0
  104. package/js/src/base-component.js +1 -1
  105. package/js/src/chip-input.js +0 -2
  106. package/js/src/navigation.js +1 -1
  107. package/js/src/search-button.js +409 -0
  108. package/js/src/sidebar.js +6 -10
  109. package/package.json +17 -16
  110. package/scss/_banner.scss +1 -1
  111. package/scss/_root.scss +3 -0
  112. package/scss/_search-button.scss +127 -0
  113. package/scss/_variables-dark.scss +2 -1
  114. package/scss/_variables.scss +12 -6
  115. package/scss/coreui.scss +1 -0
  116. package/scss/functions/_color-translucent.scss +33 -0
  117. package/scss/functions/_contrast-ratio.scss +3 -3
  118. package/scss/sidebar/_sidebar-narrow.scss +21 -13
  119. package/scss/sidebar/_sidebar-nav.scss +65 -45
  120. package/scss/sidebar/_sidebar.scss +1 -6
package/js/index.umd.js CHANGED
@@ -17,6 +17,7 @@ import Navigation from './src/navigation.js'
17
17
  import OffCanvas from './src/offcanvas.js'
18
18
  import Popover from './src/popover.js'
19
19
  import ScrollSpy from './src/scrollspy.js'
20
+ import SearchButton from './src/search-button.js'
20
21
  import Sidebar from './src/sidebar.js'
21
22
  import Tab from './src/tab.js'
22
23
  import Toast from './src/toast.js'
@@ -35,6 +36,7 @@ export default {
35
36
  OffCanvas,
36
37
  Popover,
37
38
  ScrollSpy,
39
+ SearchButton,
38
40
  Sidebar,
39
41
  Tab,
40
42
  Toast,
@@ -17,7 +17,7 @@ import { executeAfterTransition, getElement } from './util/index.js'
17
17
  * Constants
18
18
  */
19
19
 
20
- const VERSION = '5.6.0'
20
+ const VERSION = '5.7.0'
21
21
 
22
22
  /**
23
23
  * Class definition
@@ -409,8 +409,6 @@ class ChipInput extends BaseComponent {
409
409
  }
410
410
 
411
411
  if (event.key.length === 1) {
412
- // eslint-disable-next-line no-console
413
- console.log(event.key.length)
414
412
  this._input.focus()
415
413
  }
416
414
  })
@@ -45,7 +45,7 @@ const SELECTOR_NAV_GROUP = '.nav-group'
45
45
  const SELECTOR_NAV_GROUP_ITEMS = '.nav-group-items'
46
46
  const SELECTOR_NAV_GROUP_TOGGLE = '.nav-group-toggle'
47
47
  const SELECTOR_NAV_LINK = '.nav-link'
48
- const SELECTOR_DATA_NAVIGATION = '[data-coreui="navigation"]'
48
+ const SELECTOR_DATA_NAVIGATION = '[data-coreui-navigation], [data-coreui="navigation"]'
49
49
 
50
50
  /**
51
51
  * ------------------------------------------------------------------------
@@ -0,0 +1,409 @@
1
+ /**
2
+ * --------------------------------------------------------------------------
3
+ * CoreUI search-button.js
4
+ * Licensed under MIT (https://github.com/coreui/coreui/blob/main/LICENSE)
5
+ * --------------------------------------------------------------------------
6
+ */
7
+
8
+ import BaseComponent from './base-component.js'
9
+ import EventHandler from './dom/event-handler.js'
10
+ import { defineJQueryPlugin } from './util/index.js'
11
+
12
+ /**
13
+ * Constants
14
+ */
15
+
16
+ const NAME = 'search-button'
17
+ const DATA_KEY = 'coreui.search-button'
18
+ const EVENT_KEY = `.${DATA_KEY}`
19
+ const DATA_API_KEY = '.data-api'
20
+
21
+ const EVENT_BLUR_DATA_API = `blur${EVENT_KEY}${DATA_API_KEY}`
22
+ const EVENT_CLICK_DATA_API = `click${EVENT_KEY}${DATA_API_KEY}`
23
+ const EVENT_KEYDOWN_DATA_API = `keydown${EVENT_KEY}${DATA_API_KEY}`
24
+ const EVENT_KEYUP_DATA_API = `keyup${EVENT_KEY}${DATA_API_KEY}`
25
+ const EVENT_TRIGGER = `trigger${EVENT_KEY}`
26
+
27
+ const CLASS_NAME_SHORTCUT_KEYS = 'search-button-keys'
28
+ const CLASS_NAME_SHORTCUT_KEY = 'search-button-key'
29
+ const CLASS_NAME_ACTIVE = 'active'
30
+
31
+ const SELECTOR_DATA_TOGGLE = '[data-coreui-search-button]'
32
+ const SELECTOR_EDITABLE_TARGET = 'input, textarea, select, [contenteditable=""], [contenteditable="true"], [contenteditable="plaintext-only"]'
33
+ const SELECTOR_PLACEHOLDER = '.search-button-placeholder'
34
+ const SELECTOR_SHORTCUT_KEY = '.search-button-key'
35
+ const SELECTOR_SHORTCUT_KEYS = '.search-button-keys'
36
+
37
+ const Default = {
38
+ preventDefault: true,
39
+ shortcut: 'meta+/,ctrl+/'
40
+ }
41
+
42
+ const DefaultType = {
43
+ preventDefault: 'boolean',
44
+ shortcut: 'string'
45
+ }
46
+
47
+ const MODIFIER_KEYS = new Set(['alt', 'ctrl', 'meta', 'shift'])
48
+
49
+ const KEY_ALIASES = {
50
+ cmd: 'meta',
51
+ command: 'meta',
52
+ control: 'ctrl',
53
+ option: 'alt',
54
+ return: 'enter',
55
+ esc: 'escape',
56
+ spacebar: 'space',
57
+ ' ': 'space'
58
+ }
59
+
60
+ const KEY_LABELS = {
61
+ alt: 'Alt',
62
+ ctrl: 'Ctrl',
63
+ meta: '⌘',
64
+ shift: 'Shift',
65
+ space: 'Space'
66
+ }
67
+
68
+ /**
69
+ * Class definition
70
+ */
71
+
72
+ class SearchButton extends BaseComponent {
73
+ constructor(element, config) {
74
+ super(element, config)
75
+
76
+ this._shortcutTriggered = false
77
+ this._shortcuts = this._parseShortcut(this._config.shortcut)
78
+ this._preferredShortcut = this._getPreferredShortcut(this._shortcuts)
79
+ this._syncShortcutKeys()
80
+ }
81
+
82
+ // Getters
83
+ static get Default() {
84
+ return Default
85
+ }
86
+
87
+ static get DefaultType() {
88
+ return DefaultType
89
+ }
90
+
91
+ static get NAME() {
92
+ return NAME
93
+ }
94
+
95
+ // Public
96
+ trigger() {
97
+ this._triggerEvent('api')
98
+ }
99
+
100
+ // Private
101
+ _triggerEvent(trigger) {
102
+ if (this._isDisabled()) {
103
+ return
104
+ }
105
+
106
+ EventHandler.trigger(this._element, EVENT_TRIGGER, { trigger })
107
+ }
108
+
109
+ _handleShortcut(event) {
110
+ if (this._isDisabled() || event.defaultPrevented || event.repeat || this._shouldIgnoreShortcut(event)) {
111
+ return false
112
+ }
113
+
114
+ const matchedShortcut = this._shortcuts.find(shortcut => this._matchesShortcut(shortcut, event))
115
+
116
+ if (!matchedShortcut) {
117
+ return false
118
+ }
119
+
120
+ if (this._config.preventDefault) {
121
+ event.preventDefault()
122
+ }
123
+
124
+ this._shortcutTriggered = true
125
+
126
+ try {
127
+ this._element.click()
128
+ } finally {
129
+ this._shortcutTriggered = false
130
+ }
131
+
132
+ return true
133
+ }
134
+
135
+ _isDisabled() {
136
+ return this._element.classList.contains('disabled') ||
137
+ this._element.getAttribute('aria-disabled') === 'true' ||
138
+ this._element.disabled
139
+ }
140
+
141
+ _ensureShortcutKeys() {
142
+ const existingShortcutKeys = this._element.querySelector(SELECTOR_SHORTCUT_KEYS)
143
+
144
+ if (existingShortcutKeys) {
145
+ return existingShortcutKeys
146
+ }
147
+
148
+ const shortcutKeys = document.createElement('span')
149
+ shortcutKeys.className = CLASS_NAME_SHORTCUT_KEYS
150
+ shortcutKeys.setAttribute('aria-hidden', 'true')
151
+ const placeholder = this._element.querySelector(SELECTOR_PLACEHOLDER)
152
+
153
+ if (placeholder) {
154
+ placeholder.after(shortcutKeys)
155
+ return shortcutKeys
156
+ }
157
+
158
+ this._element.append(shortcutKeys)
159
+ return shortcutKeys
160
+ }
161
+
162
+ _syncShortcutKeys() {
163
+ const shortcutKeys = this._ensureShortcutKeys()
164
+ const shortcutTokens = this._formatShortcutTokens(this._preferredShortcut?.shortcut || '')
165
+ .filter(Boolean)
166
+
167
+ shortcutKeys.replaceChildren()
168
+
169
+ for (const key of shortcutTokens) {
170
+ const shortcutKey = document.createElement('span')
171
+ shortcutKey.className = CLASS_NAME_SHORTCUT_KEY
172
+ shortcutKey.textContent = key
173
+ shortcutKey.dataset.coreuiSearchButtonKey = key
174
+ shortcutKeys.append(shortcutKey)
175
+ }
176
+ }
177
+
178
+ _syncActiveKeys(event) {
179
+ const pressedKeys = this._getPressedKeys(event)
180
+
181
+ for (const shortcutKey of this._element.querySelectorAll(SELECTOR_SHORTCUT_KEY)) {
182
+ shortcutKey.classList.toggle(CLASS_NAME_ACTIVE, pressedKeys.has(shortcutKey.dataset.coreuiSearchButtonKey))
183
+ }
184
+ }
185
+
186
+ _clearActiveKeys() {
187
+ for (const shortcutKey of this._element.querySelectorAll(SELECTOR_SHORTCUT_KEY)) {
188
+ shortcutKey.classList.remove(CLASS_NAME_ACTIVE)
189
+ }
190
+ }
191
+
192
+ _consumeShortcutTrigger() {
193
+ const shortcutTriggered = this._shortcutTriggered
194
+ this._shortcutTriggered = false
195
+ return shortcutTriggered
196
+ }
197
+
198
+ _shouldIgnoreShortcut(event) {
199
+ return this._isEditableTarget(event.target) && !event.ctrlKey && !event.metaKey
200
+ }
201
+
202
+ _isEditableTarget(target) {
203
+ if (!(target instanceof Element)) {
204
+ return false
205
+ }
206
+
207
+ return target.matches(SELECTOR_EDITABLE_TARGET) || target.closest(SELECTOR_EDITABLE_TARGET)
208
+ }
209
+
210
+ _normalizeKey(key) {
211
+ return KEY_ALIASES[key.toLowerCase()] || key.toLowerCase()
212
+ }
213
+
214
+ _parseShortcut(shortcut) {
215
+ return shortcut
216
+ .split(',')
217
+ .map(value => value.trim())
218
+ .filter(Boolean)
219
+ .map(value => {
220
+ const keys = value.split('+').map(part => this._normalizeKey(part.trim()))
221
+ const modifiers = {
222
+ alt: false,
223
+ ctrl: false,
224
+ meta: false,
225
+ shift: false
226
+ }
227
+
228
+ let key = ''
229
+
230
+ for (const part of keys) {
231
+ if (MODIFIER_KEYS.has(part)) {
232
+ modifiers[part] = true
233
+ continue
234
+ }
235
+
236
+ key = part
237
+ }
238
+
239
+ return {
240
+ key,
241
+ modifiers,
242
+ shortcut: value
243
+ }
244
+ })
245
+ }
246
+
247
+ _matchesShortcut(shortcut, event) {
248
+ if (!shortcut.key || this._normalizeKey(event.key) !== shortcut.key) {
249
+ return false
250
+ }
251
+
252
+ return shortcut.modifiers.alt === event.altKey &&
253
+ shortcut.modifiers.ctrl === event.ctrlKey &&
254
+ shortcut.modifiers.meta === event.metaKey &&
255
+ shortcut.modifiers.shift === event.shiftKey
256
+ }
257
+
258
+ _formatShortcutTokens(shortcut) {
259
+ return shortcut
260
+ .split('+')
261
+ .map(part => this._normalizeKey(part.trim()))
262
+ .map(part => this._getKeyLabel(part))
263
+ }
264
+
265
+ _getPlatform() {
266
+ return window.navigator.userAgentData?.platform ||
267
+ window.navigator.platform ||
268
+ window.navigator.userAgent ||
269
+ ''
270
+ }
271
+
272
+ _isMacOS() {
273
+ return /Mac|iPhone|iPad|iPod|macOS|Macintosh/.test(this._getPlatform())
274
+ }
275
+
276
+ _getPreferredShortcut(shortcuts) {
277
+ return shortcuts.find(shortcut => {
278
+ return this._isMacOS() ? shortcut.modifiers.meta : shortcut.modifiers.ctrl
279
+ }) || shortcuts[0] || null
280
+ }
281
+
282
+ _getPressedKeys(event) {
283
+ const pressedKeys = new Set()
284
+
285
+ if (event.altKey) {
286
+ pressedKeys.add(KEY_LABELS.alt)
287
+ }
288
+
289
+ if (event.ctrlKey) {
290
+ pressedKeys.add(KEY_LABELS.ctrl)
291
+ }
292
+
293
+ if (event.metaKey) {
294
+ pressedKeys.add(KEY_LABELS.meta)
295
+ }
296
+
297
+ if (event.shiftKey) {
298
+ pressedKeys.add(KEY_LABELS.shift)
299
+ }
300
+
301
+ const normalizedKey = this._normalizeKey(event.key)
302
+ const keyLabel = this._getKeyLabel(normalizedKey)
303
+
304
+ if (!MODIFIER_KEYS.has(normalizedKey) && event.type === 'keydown') {
305
+ pressedKeys.add(keyLabel)
306
+ }
307
+
308
+ return pressedKeys
309
+ }
310
+
311
+ _getKeyLabel(key) {
312
+ return KEY_LABELS[key] || (key.length === 1 ? key.toUpperCase() : `${key.charAt(0).toUpperCase()}${key.slice(1)}`)
313
+ }
314
+
315
+ // Static
316
+ static searchButtonInterface(element, config) {
317
+ const data = SearchButton.getOrCreateInstance(element, config)
318
+
319
+ if (typeof config === 'string') {
320
+ if (config.startsWith('_') || typeof data[config] !== 'function') {
321
+ throw new TypeError(`No method named "${config}"`)
322
+ }
323
+
324
+ data[config]()
325
+ }
326
+ }
327
+
328
+ static jQueryInterface(config) {
329
+ return this.each(function () {
330
+ SearchButton.searchButtonInterface(this, config)
331
+ })
332
+ }
333
+
334
+ static _initializeDataApi() {
335
+ for (const button of document.querySelectorAll(SELECTOR_DATA_TOGGLE)) {
336
+ SearchButton.getOrCreateInstance(button)
337
+ }
338
+ }
339
+
340
+ static _handleDataApiClick(event) {
341
+ event.preventDefault()
342
+
343
+ const button = event.target.closest(SELECTOR_DATA_TOGGLE)
344
+ const data = SearchButton.getOrCreateInstance(button)
345
+ const shortcutTriggered = data._consumeShortcutTrigger()
346
+
347
+ if (shortcutTriggered) {
348
+ data._triggerEvent('shortcut')
349
+ return
350
+ }
351
+
352
+ data._triggerEvent('click')
353
+ }
354
+
355
+ static _handleDataApiKeydown(event) {
356
+ for (const button of document.querySelectorAll(SELECTOR_DATA_TOGGLE)) {
357
+ const data = SearchButton.getOrCreateInstance(button)
358
+ data._syncActiveKeys(event)
359
+
360
+ if (data._handleShortcut(event)) {
361
+ break
362
+ }
363
+ }
364
+ }
365
+
366
+ static _handleDataApiKeyup(event) {
367
+ for (const button of document.querySelectorAll(SELECTOR_DATA_TOGGLE)) {
368
+ SearchButton.getOrCreateInstance(button)._syncActiveKeys(event)
369
+ }
370
+ }
371
+
372
+ static _handleDataApiBlur() {
373
+ for (const button of document.querySelectorAll(SELECTOR_DATA_TOGGLE)) {
374
+ SearchButton.getOrCreateInstance(button)._clearActiveKeys()
375
+ }
376
+ }
377
+ }
378
+
379
+ /**
380
+ * Data API implementation
381
+ */
382
+
383
+ EventHandler.on(document, `DOMContentLoaded${EVENT_KEY}${DATA_API_KEY}`, () => {
384
+ SearchButton._initializeDataApi()
385
+ })
386
+
387
+ EventHandler.on(document, EVENT_CLICK_DATA_API, SELECTOR_DATA_TOGGLE, event => {
388
+ SearchButton._handleDataApiClick(event)
389
+ })
390
+
391
+ EventHandler.on(document, EVENT_KEYDOWN_DATA_API, event => {
392
+ SearchButton._handleDataApiKeydown(event)
393
+ })
394
+
395
+ EventHandler.on(document, EVENT_KEYUP_DATA_API, event => {
396
+ SearchButton._handleDataApiKeyup(event)
397
+ })
398
+
399
+ EventHandler.on(window, EVENT_BLUR_DATA_API, () => {
400
+ SearchButton._handleDataApiBlur()
401
+ })
402
+
403
+ /**
404
+ * jQuery
405
+ */
406
+
407
+ defineJQueryPlugin(SearchButton)
408
+
409
+ export default SearchButton
package/js/src/sidebar.js CHANGED
@@ -155,14 +155,14 @@ class Sidebar extends BaseComponent {
155
155
 
156
156
  narrow() {
157
157
  if (!this._isMobile()) {
158
- this._addClassName(CLASS_NAME_SIDEBAR_NARROW)
158
+ this._element.classList.add(CLASS_NAME_SIDEBAR_NARROW)
159
159
  this._narrow = true
160
160
  }
161
161
  }
162
162
 
163
163
  unfoldable() {
164
164
  if (!this._isMobile()) {
165
- this._addClassName(CLASS_NAME_SIDEBAR_NARROW_UNFOLDABLE)
165
+ this._element.classList.add(CLASS_NAME_SIDEBAR_NARROW_UNFOLDABLE)
166
166
  this._unfoldable = true
167
167
  }
168
168
  }
@@ -234,21 +234,17 @@ class Sidebar extends BaseComponent {
234
234
  )
235
235
  }
236
236
 
237
- _addClassName(className) {
238
- this._element.classList.add(className)
239
- }
240
-
241
- _clickOutListener(event, sidebar) {
237
+ _clickOutListener(event) {
242
238
  if (event.target.closest(SELECTOR_SIDEBAR) === null) {
243
239
  event.preventDefault()
244
240
  event.stopPropagation()
245
- sidebar.hide()
241
+ this.hide()
246
242
  }
247
243
  }
248
244
 
249
245
  _addClickOutListener() {
250
246
  EventHandler.on(document, EVENT_CLICK_DATA_API, event => {
251
- this._clickOutListener(event, this)
247
+ this._clickOutListener(event)
252
248
  })
253
249
  }
254
250
 
@@ -268,7 +264,7 @@ class Sidebar extends BaseComponent {
268
264
 
269
265
  EventHandler.on(this._element, EVENT_CLICK_DATA_API, SELECTOR_DATA_TOGGLE, event => {
270
266
  event.preventDefault()
271
- const toggle = Manipulator.getDataAttribute(event.target, 'toggle')
267
+ const toggle = Manipulator.getDataAttribute(event.target.closest(SELECTOR_DATA_TOGGLE), 'toggle')
272
268
 
273
269
  if (toggle === 'narrow') {
274
270
  this.toggleNarrow()
package/package.json CHANGED
@@ -1,9 +1,9 @@
1
1
  {
2
2
  "name": "@coreui/coreui",
3
3
  "description": "The most popular front-end framework for developing responsive, mobile-first projects on the web rewritten and maintained by the CoreUI Team",
4
- "version": "5.6.0",
4
+ "version": "5.7.0",
5
5
  "config": {
6
- "version_short": "5.6"
6
+ "version_short": "5.7"
7
7
  },
8
8
  "keywords": [
9
9
  "css",
@@ -102,30 +102,31 @@
102
102
  "devDependencies": {
103
103
  "@babel/cli": "^7.28.6",
104
104
  "@babel/core": "^7.29.0",
105
- "@babel/preset-env": "^7.29.0",
106
- "@docsearch/css": "^4.6.0",
107
- "@docsearch/js": "^4.6.0",
105
+ "@babel/preset-env": "^7.29.5",
106
+ "@coreui/internal-links": "^5.1.0",
107
+ "@docsearch/css": "^4.6.3",
108
+ "@docsearch/js": "^4.6.3",
108
109
  "@eslint/markdown": "^7.5.1",
109
110
  "@popperjs/core": "^2.11.8",
110
- "@rollup/plugin-babel": "^6.1.0",
111
- "@rollup/plugin-commonjs": "^29.0.0",
111
+ "@rollup/plugin-babel": "^7.0.0",
112
+ "@rollup/plugin-commonjs": "^29.0.2",
112
113
  "@rollup/plugin-node-resolve": "^16.0.3",
113
114
  "@rollup/plugin-replace": "^6.0.3",
114
115
  "@stackblitz/sdk": "^1.11.0",
115
- "autoprefixer": "^10.4.27",
116
+ "autoprefixer": "^10.5.0",
116
117
  "bootstrap": "^5.3.8",
117
- "bundlewatch": "^0.4.1",
118
+ "bundlewatch": "^0.4.2",
118
119
  "clean-css-cli": "^5.6.3",
119
120
  "clipboard": "^2.0.11",
120
121
  "cross-env": "^10.1.0",
121
- "eslint": "^9.39.3",
122
+ "eslint": "^9.39.4",
122
123
  "eslint-config-xo": "0.49.0",
123
124
  "eslint-plugin-html": "^8.1.4",
124
125
  "eslint-plugin-import": "^2.32.0",
125
126
  "eslint-plugin-unicorn": "^62.0.0",
126
- "find-unused-sass-variables": "^6.1.1",
127
+ "find-unused-sass-variables": "^6.2.0",
127
128
  "globals": "^16.5.0",
128
- "globby": "^16.1.1",
129
+ "globby": "^16.2.0",
129
130
  "hammer-simulator": "0.0.1",
130
131
  "html-entities": "^2.6.0",
131
132
  "hugo-bin": "^0.149.2",
@@ -144,18 +145,18 @@
144
145
  "lockfile-lint": "^5.0.0",
145
146
  "nodemon": "^3.1.14",
146
147
  "npm-run-all": "^4.1.5",
147
- "postcss": "^8.5.8",
148
+ "postcss": "^8.5.14",
148
149
  "postcss-cli": "^11.0.1",
149
150
  "postcss-combine-duplicated-selectors": "^10.0.3",
150
151
  "rimraf": "^6.1.3",
151
- "rollup": "^4.59.0",
152
+ "rollup": "^4.60.4",
152
153
  "rollup-plugin-istanbul": "^5.0.0",
153
- "sass-embedded": "^1.97.3",
154
+ "sass-embedded": "^1.99.0",
154
155
  "sass-true": "^10.1.0",
155
156
  "shelljs": "^0.10.0",
156
157
  "stylelint": "^16.26.1",
157
158
  "stylelint-config-twbs-bootstrap": "^16.1.0",
158
- "terser": "5.46.0",
159
+ "terser": "5.47.1",
159
160
  "vnu-jar": "25.12.31"
160
161
  },
161
162
  "files": [
package/scss/_banner.scss CHANGED
@@ -1,7 +1,7 @@
1
1
  $file: "" !default;
2
2
 
3
3
  /*!
4
- * CoreUI #{$file} v5.6.0 (https://coreui.io)
4
+ * CoreUI #{$file} v5.7.0 (https://coreui.io)
5
5
  * Copyright (c) 2026 creativeLabs Łukasz Holeczek
6
6
  * Licensed under MIT (https://github.com/coreui/coreui/blob/main/LICENSE)
7
7
  */
package/scss/_root.scss CHANGED
@@ -1,5 +1,6 @@
1
1
  @use "sass:meta";
2
2
  @use "functions/color" as *;
3
+ @use "functions/color-translucent" as *;
3
4
  @use "functions/to-rgb" as *;
4
5
  @use "mixins/color-mode" as *;
5
6
  @use "vendor/rfs" as *;
@@ -88,6 +89,7 @@
88
89
  --#{$prefix}tertiary-color-rgb: #{to-rgb($body-tertiary-color)};
89
90
  --#{$prefix}tertiary-bg: #{$body-tertiary-bg};
90
91
  --#{$prefix}tertiary-bg-rgb: #{to-rgb($body-tertiary-bg)};
92
+ --#{$prefix}tertiary-bg-translucent: #{color-translucent($body-tertiary-bg)};
91
93
 
92
94
  --#{$prefix}body-color-dark: #{$body-color-dark};
93
95
  --#{$prefix}body-color-rgb-dark: #{to-rgb($body-color-dark)};
@@ -191,6 +193,7 @@
191
193
  --#{$prefix}tertiary-color-rgb: #{to-rgb($body-tertiary-color-dark)};
192
194
  --#{$prefix}tertiary-bg: #{$body-tertiary-bg-dark};
193
195
  --#{$prefix}tertiary-bg-rgb: #{to-rgb($body-tertiary-bg-dark)};
196
+ --#{$prefix}tertiary-bg-translucent: #{color-translucent($body-tertiary-bg-dark, .1, $body-bg-dark)};
194
197
 
195
198
  --#{$prefix}high-emphasis: #{$high-emphasis-dark}; // Deprecated in v5.0.0
196
199
  --#{$prefix}medium-emphasis: #{$medium-emphasis-dark}; // Deprecated in v5.0.0