@coreui/coreui 5.5.0 → 5.6.1

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 (116) hide show
  1. package/LICENSE +1 -1
  2. package/README.md +5 -3
  3. package/dist/css/coreui-grid.css +2 -2
  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 +2 -2
  8. package/dist/css/coreui-grid.rtl.css.map +1 -1
  9. package/dist/css/coreui-grid.rtl.min.css +2 -2
  10. package/dist/css/coreui-grid.rtl.min.css.map +1 -1
  11. package/dist/css/coreui-reboot.css +11 -2
  12. package/dist/css/coreui-reboot.css.map +1 -1
  13. package/dist/css/coreui-reboot.min.css +3 -3
  14. package/dist/css/coreui-reboot.min.css.map +1 -1
  15. package/dist/css/coreui-reboot.rtl.css +11 -2
  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 +11 -2
  20. package/dist/css/coreui-utilities.css.map +1 -1
  21. package/dist/css/coreui-utilities.min.css +3 -3
  22. package/dist/css/coreui-utilities.min.css.map +1 -1
  23. package/dist/css/coreui-utilities.rtl.css +11 -2
  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 +337 -2
  28. package/dist/css/coreui.css.map +1 -1
  29. package/dist/css/coreui.min.css +3 -3
  30. package/dist/css/coreui.min.css.map +1 -1
  31. package/dist/css/coreui.rtl.css +332 -2
  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/css/themes/bootstrap/bootstrap.css +337 -2
  36. package/dist/css/themes/bootstrap/bootstrap.css.map +1 -1
  37. package/dist/css/themes/bootstrap/bootstrap.min.css +3 -3
  38. package/dist/css/themes/bootstrap/bootstrap.min.css.map +1 -1
  39. package/dist/css/themes/bootstrap/bootstrap.rtl.css +332 -2
  40. package/dist/css/themes/bootstrap/bootstrap.rtl.css.map +1 -1
  41. package/dist/css/themes/bootstrap/bootstrap.rtl.min.css +3 -3
  42. package/dist/css/themes/bootstrap/bootstrap.rtl.min.css.map +1 -1
  43. package/dist/js/bootstrap.bundle.js +872 -60
  44. package/dist/js/bootstrap.bundle.js.map +1 -1
  45. package/dist/js/bootstrap.bundle.min.js +3 -3
  46. package/dist/js/bootstrap.bundle.min.js.map +1 -1
  47. package/dist/js/bootstrap.esm.js +871 -53
  48. package/dist/js/bootstrap.esm.js.map +1 -1
  49. package/dist/js/bootstrap.esm.min.js +3 -3
  50. package/dist/js/bootstrap.esm.min.js.map +1 -1
  51. package/dist/js/bootstrap.js +872 -52
  52. package/dist/js/bootstrap.js.map +1 -1
  53. package/dist/js/bootstrap.min.js +3 -3
  54. package/dist/js/bootstrap.min.js.map +1 -1
  55. package/dist/js/coreui.bundle.js +872 -60
  56. package/dist/js/coreui.bundle.js.map +1 -1
  57. package/dist/js/coreui.bundle.min.js +3 -3
  58. package/dist/js/coreui.bundle.min.js.map +1 -1
  59. package/dist/js/coreui.esm.js +871 -53
  60. package/dist/js/coreui.esm.js.map +1 -1
  61. package/dist/js/coreui.esm.min.js +3 -3
  62. package/dist/js/coreui.esm.min.js.map +1 -1
  63. package/dist/js/coreui.js +872 -52
  64. package/dist/js/coreui.js.map +1 -1
  65. package/dist/js/coreui.min.js +3 -3
  66. package/dist/js/coreui.min.js.map +1 -1
  67. package/js/dist/alert.js +2 -2
  68. package/js/dist/base-component.js +3 -3
  69. package/js/dist/base-component.js.map +1 -1
  70. package/js/dist/button.js +2 -2
  71. package/js/dist/carousel.js +2 -2
  72. package/js/dist/chip-input.js +526 -0
  73. package/js/dist/chip-input.js.map +1 -0
  74. package/js/dist/chip.js +322 -0
  75. package/js/dist/chip.js.map +1 -0
  76. package/js/dist/collapse.js +2 -2
  77. package/js/dist/dom/data.js +2 -2
  78. package/js/dist/dom/event-handler.js +2 -2
  79. package/js/dist/dom/manipulator.js +2 -2
  80. package/js/dist/dom/selector-engine.js +2 -2
  81. package/js/dist/dropdown.js +2 -2
  82. package/js/dist/modal.js +2 -2
  83. package/js/dist/navigation.js +2 -2
  84. package/js/dist/offcanvas.js +2 -2
  85. package/js/dist/popover.js +2 -2
  86. package/js/dist/scrollspy.js +2 -2
  87. package/js/dist/sidebar.js +2 -2
  88. package/js/dist/tab.js +2 -2
  89. package/js/dist/toast.js +2 -2
  90. package/js/dist/tooltip.js +2 -2
  91. package/js/dist/util/backdrop.js +2 -2
  92. package/js/dist/util/component-functions.js +2 -2
  93. package/js/dist/util/config.js +2 -2
  94. package/js/dist/util/focustrap.js +2 -2
  95. package/js/dist/util/index.js +2 -2
  96. package/js/dist/util/sanitizer.js +2 -2
  97. package/js/dist/util/scrollbar.js +2 -2
  98. package/js/dist/util/swipe.js +2 -2
  99. package/js/dist/util/template-factory.js +2 -2
  100. package/js/index.esm.js +2 -0
  101. package/js/index.umd.js +4 -0
  102. package/js/src/base-component.js +1 -1
  103. package/js/src/chip-input.js +593 -0
  104. package/js/src/chip.js +365 -0
  105. package/package.json +22 -22
  106. package/scss/_banner.scss +2 -2
  107. package/scss/_chip.import.scss +1 -0
  108. package/scss/_chip.scss +261 -0
  109. package/scss/_forms.scss +1 -0
  110. package/scss/_maps.scss +14 -0
  111. package/scss/_root.scss +5 -0
  112. package/scss/coreui.scss +1 -0
  113. package/scss/forms/_chip-input.import.scss +1 -0
  114. package/scss/forms/_chip-input.scss +109 -0
  115. package/scss/mixins/_chip.scss +14 -0
  116. package/scss/mixins/_focus-ring.scss +9 -0
package/js/src/chip.js ADDED
@@ -0,0 +1,365 @@
1
+ /**
2
+ * --------------------------------------------------------------------------
3
+ * CoreUI chip.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 SelectorEngine from './dom/selector-engine.js'
11
+ import { defineJQueryPlugin, getNextActiveElement } from './util/index.js'
12
+
13
+ /**
14
+ * Constants
15
+ */
16
+
17
+ const NAME = 'chip'
18
+ const DATA_KEY = 'coreui.chip'
19
+ const EVENT_KEY = `.${DATA_KEY}`
20
+ const DATA_API_KEY = '.data-api'
21
+
22
+ const EVENT_REMOVE = `remove${EVENT_KEY}`
23
+ const EVENT_REMOVED = `removed${EVENT_KEY}`
24
+ const EVENT_SELECT = `select${EVENT_KEY}`
25
+ const EVENT_SELECTED = `selected${EVENT_KEY}`
26
+ const EVENT_DESELECT = `deselect${EVENT_KEY}`
27
+ const EVENT_DESELECTED = `deselected${EVENT_KEY}`
28
+
29
+ const SELECTOR_CHIP_REMOVE = '.chip-remove'
30
+ const SELECTOR_DATA_CHIP = '[data-coreui-chip]'
31
+ const SELECTOR_FOCUSABLE_ITEMS = '.chip:not(.disabled)'
32
+
33
+ const CLASS_NAME_CHIP_CLICKABLE = 'chip-clickable'
34
+ const CLASS_NAME_CHIP_REMOVE = 'chip-remove'
35
+ const CLASS_NAME_ACTIVE = 'active'
36
+ const CLASS_NAME_DISABLED = 'disabled'
37
+
38
+ const DEFAULT_REMOVE_ICON = '<svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" viewBox="0 0 16 16" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round"><line x1="4" y1="4" x2="12" y2="12"/><line x1="12" y1="4" x2="4" y2="12"/></svg>'
39
+
40
+ const Default = {
41
+ ariaRemoveLabel: 'Remove',
42
+ disabled: false,
43
+ removable: false,
44
+ removeIcon: DEFAULT_REMOVE_ICON,
45
+ selectable: false,
46
+ selected: false
47
+ }
48
+
49
+ const DefaultType = {
50
+ ariaRemoveLabel: 'string',
51
+ disabled: 'boolean',
52
+ removable: 'boolean',
53
+ removeIcon: 'string',
54
+ selectable: 'boolean',
55
+ selected: 'boolean'
56
+ }
57
+
58
+ /**
59
+ * Class definition
60
+ */
61
+
62
+ class Chip extends BaseComponent {
63
+ constructor(element, config) {
64
+ super(element, config)
65
+
66
+ this._disabled = this._config.disabled || this._element.classList.contains(CLASS_NAME_DISABLED)
67
+ this._selected = this._config.selected || this._element.classList.contains(CLASS_NAME_ACTIVE)
68
+
69
+ this._ensureRemoveButton()
70
+ this._applyState()
71
+
72
+ if (this._config.selectable || this._config.removable) {
73
+ this._makeFocusable()
74
+ }
75
+
76
+ this._addEventListeners()
77
+ }
78
+
79
+ // Getters
80
+ static get Default() {
81
+ return Default
82
+ }
83
+
84
+ static get DefaultType() {
85
+ return DefaultType
86
+ }
87
+
88
+ static get NAME() {
89
+ return NAME
90
+ }
91
+
92
+ // Public
93
+ remove() {
94
+ const removeEvent = EventHandler.trigger(this._element, EVENT_REMOVE)
95
+
96
+ if (removeEvent.defaultPrevented) {
97
+ return
98
+ }
99
+
100
+ this._destroyElement()
101
+ }
102
+
103
+ toggle() {
104
+ if (!this._config.selectable) {
105
+ return
106
+ }
107
+
108
+ if (this._selected) {
109
+ this.deselect()
110
+ return
111
+ }
112
+
113
+ this.select()
114
+ }
115
+
116
+ select() {
117
+ if (!this._config.selectable) {
118
+ return
119
+ }
120
+
121
+ if (this._selected) {
122
+ return
123
+ }
124
+
125
+ const selectEvent = EventHandler.trigger(this._element, EVENT_SELECT)
126
+ if (selectEvent.defaultPrevented) {
127
+ return
128
+ }
129
+
130
+ this._selected = true
131
+ this._applyState()
132
+
133
+ EventHandler.trigger(this._element, EVENT_SELECTED)
134
+ }
135
+
136
+ deselect() {
137
+ if (!this._config.selectable) {
138
+ return
139
+ }
140
+
141
+ if (!this._selected) {
142
+ return
143
+ }
144
+
145
+ const deselectEvent = EventHandler.trigger(this._element, EVENT_DESELECT)
146
+ if (deselectEvent.defaultPrevented) {
147
+ return
148
+ }
149
+
150
+ this._selected = false
151
+ this._applyState()
152
+
153
+ EventHandler.trigger(this._element, EVENT_DESELECTED)
154
+ }
155
+
156
+ // Private
157
+ _addEventListeners() {
158
+ EventHandler.on(this._element, 'keydown', event => this._handleKeydown(event))
159
+
160
+ EventHandler.on(this._element, 'click', event => {
161
+ if (this._disabled) {
162
+ return
163
+ }
164
+
165
+ if (event.target.closest(SELECTOR_CHIP_REMOVE)) {
166
+ return
167
+ }
168
+
169
+ this.toggle()
170
+ })
171
+
172
+ EventHandler.on(this._element, 'click', SELECTOR_CHIP_REMOVE, event => {
173
+ event.stopPropagation()
174
+ this.remove()
175
+ })
176
+ }
177
+
178
+ _applyState() {
179
+ if (!this._disabled && (this._config.clickable || this._config.selectable)) {
180
+ this._element.classList.add(CLASS_NAME_CHIP_CLICKABLE)
181
+ }
182
+
183
+ if (this._disabled) {
184
+ this._element.classList.add(CLASS_NAME_DISABLED)
185
+ this._element.setAttribute('aria-disabled', 'true')
186
+ } else {
187
+ this._element.classList.remove(CLASS_NAME_DISABLED)
188
+ if (this._element.getAttribute('aria-disabled') === 'true') {
189
+ this._element.setAttribute('aria-disabled', 'false')
190
+ }
191
+ }
192
+
193
+ if (this._config.selectable) {
194
+ this._element.classList.toggle(CLASS_NAME_ACTIVE, this._selected)
195
+ this._element.setAttribute('aria-selected', this._selected ? 'true' : 'false')
196
+ } else {
197
+ this._element.classList.remove(CLASS_NAME_ACTIVE)
198
+ if (this._element.getAttribute('aria-selected') === 'true') {
199
+ this._element.setAttribute('aria-selected', 'false')
200
+ }
201
+ }
202
+ }
203
+
204
+ _createRemoveButton() {
205
+ const button = document.createElement('button')
206
+ button.type = 'button'
207
+ button.className = CLASS_NAME_CHIP_REMOVE
208
+ button.setAttribute('aria-label', this._config.ariaRemoveLabel)
209
+ button.setAttribute('tabindex', '-1') // Not in tab order, chips handle keyboard
210
+ button.innerHTML = this._config.removeIcon
211
+ return button
212
+ }
213
+
214
+ _ensureRemoveButton() {
215
+ if (!this._config.removable) {
216
+ return
217
+ }
218
+
219
+ if (SelectorEngine.findOne(SELECTOR_CHIP_REMOVE, this._element)) {
220
+ return
221
+ }
222
+
223
+ this._element.append(this._createRemoveButton())
224
+ }
225
+
226
+ _makeFocusable() {
227
+ if (this._element.hasAttribute('tabindex') || this._disabled) {
228
+ return
229
+ }
230
+
231
+ this._element.setAttribute('tabindex', '0')
232
+ }
233
+
234
+ _handleKeydown(event) {
235
+ const { key } = event
236
+ if (this._disabled) {
237
+ return
238
+ }
239
+
240
+ switch (key) {
241
+ case 'Enter':
242
+ case ' ':
243
+ case 'Spacebar': {
244
+ if (!this._config.selectable) {
245
+ return
246
+ }
247
+
248
+ event.preventDefault()
249
+ this.toggle()
250
+ break
251
+ }
252
+
253
+ case 'Backspace':
254
+ case 'Delete': {
255
+ if (this._config.removable) {
256
+ event.preventDefault()
257
+ const sibling = this._getFocusableSibling(false) || this._getFocusableSibling(true)
258
+ sibling?.focus()
259
+ this.remove()
260
+ }
261
+
262
+ break
263
+ }
264
+
265
+ case 'ArrowLeft': {
266
+ event.preventDefault()
267
+ const chip = this._getFocusableSibling(false)
268
+ chip?.focus()
269
+
270
+ break
271
+ }
272
+
273
+ case 'ArrowRight': {
274
+ event.preventDefault()
275
+ const chip = this._getFocusableSibling(true)
276
+ chip?.focus()
277
+
278
+ break
279
+ }
280
+
281
+ case 'Home': {
282
+ event.preventDefault()
283
+ this._navigateToEdge(0)
284
+ break
285
+ }
286
+
287
+ case 'End': {
288
+ event.preventDefault()
289
+ this._navigateToEdge(-1)
290
+ break
291
+ }
292
+
293
+ // No default
294
+ }
295
+ }
296
+
297
+ _getFocusableSibling(shouldGetNext) {
298
+ const chips = SelectorEngine.find(SELECTOR_FOCUSABLE_ITEMS, this._element.parentElement)
299
+ const sibling = getNextActiveElement(chips, this._element, shouldGetNext, !chips.includes(this._element))
300
+ return sibling === this._element ? null : sibling
301
+ }
302
+
303
+ _navigateToEdge(targetIndex) {
304
+ const chips = SelectorEngine.find(SELECTOR_FOCUSABLE_ITEMS, this._element.parentElement)
305
+ if (chips.length === 0) {
306
+ return
307
+ }
308
+
309
+ const targetChip = chips.at(targetIndex)
310
+ targetChip?.focus()
311
+ }
312
+
313
+ _destroyElement() {
314
+ EventHandler.trigger(this._element, EVENT_REMOVED)
315
+ this._element.remove()
316
+ this.dispose()
317
+ }
318
+
319
+ // Static
320
+ static chipInterface(element, config) {
321
+ const data = Chip.getOrCreateInstance(element, config)
322
+
323
+ if (typeof config === 'string') {
324
+ if (typeof data[config] === 'undefined') {
325
+ throw new TypeError(`No method named "${config}"`)
326
+ }
327
+
328
+ data[config]()
329
+ }
330
+ }
331
+
332
+ static jQueryInterface(config) {
333
+ return this.each(function () {
334
+ const data = Chip.getOrCreateInstance(this)
335
+
336
+ if (typeof config !== 'string') {
337
+ return
338
+ }
339
+
340
+ if (data[config] === undefined || config.startsWith('_') || config === 'constructor') {
341
+ throw new TypeError(`No method named "${config}"`)
342
+ }
343
+
344
+ data[config](this)
345
+ })
346
+ }
347
+ }
348
+
349
+ /**
350
+ * Data API implementation
351
+ */
352
+
353
+ EventHandler.on(document, `DOMContentLoaded${EVENT_KEY}${DATA_API_KEY}`, () => {
354
+ for (const element of SelectorEngine.find(SELECTOR_DATA_CHIP)) {
355
+ Chip.chipInterface(element)
356
+ }
357
+ })
358
+
359
+ /**
360
+ * jQuery
361
+ */
362
+
363
+ defineJQueryPlugin(Chip)
364
+
365
+ export default Chip
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.5.0",
4
+ "version": "5.6.1",
5
5
  "config": {
6
- "version_short": "5.5"
6
+ "version_short": "5.6"
7
7
  },
8
8
  "keywords": [
9
9
  "css",
@@ -100,32 +100,32 @@
100
100
  "@popperjs/core": "^2.11.8"
101
101
  },
102
102
  "devDependencies": {
103
- "@babel/cli": "^7.28.3",
104
- "@babel/core": "^7.28.5",
105
- "@babel/preset-env": "^7.28.5",
106
- "@docsearch/css": "^4.3.2",
107
- "@docsearch/js": "^4.3.2",
103
+ "@babel/cli": "^7.28.6",
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",
108
108
  "@eslint/markdown": "^7.5.1",
109
109
  "@popperjs/core": "^2.11.8",
110
- "@rollup/plugin-babel": "^6.1.0",
111
- "@rollup/plugin-commonjs": "^29.0.0",
110
+ "@rollup/plugin-babel": "^7.0.0",
111
+ "@rollup/plugin-commonjs": "^29.0.2",
112
112
  "@rollup/plugin-node-resolve": "^16.0.3",
113
113
  "@rollup/plugin-replace": "^6.0.3",
114
114
  "@stackblitz/sdk": "^1.11.0",
115
- "autoprefixer": "^10.4.23",
115
+ "autoprefixer": "^10.4.27",
116
116
  "bootstrap": "^5.3.8",
117
117
  "bundlewatch": "^0.4.1",
118
118
  "clean-css-cli": "^5.6.3",
119
119
  "clipboard": "^2.0.11",
120
120
  "cross-env": "^10.1.0",
121
- "eslint": "^9.39.2",
121
+ "eslint": "^9.39.3",
122
122
  "eslint-config-xo": "0.49.0",
123
- "eslint-plugin-html": "^8.1.3",
123
+ "eslint-plugin-html": "^8.1.4",
124
124
  "eslint-plugin-import": "^2.32.0",
125
125
  "eslint-plugin-unicorn": "^62.0.0",
126
126
  "find-unused-sass-variables": "^6.1.1",
127
127
  "globals": "^16.5.0",
128
- "globby": "^16.0.0",
128
+ "globby": "^16.1.1",
129
129
  "hammer-simulator": "0.0.1",
130
130
  "html-entities": "^2.6.0",
131
131
  "hugo-bin": "^0.149.2",
@@ -139,24 +139,24 @@
139
139
  "karma-detect-browsers": "^2.3.3",
140
140
  "karma-firefox-launcher": "^2.1.3",
141
141
  "karma-jasmine": "^5.1.0",
142
- "karma-jasmine-html-reporter": "^2.1.0",
142
+ "karma-jasmine-html-reporter": "^2.2.0",
143
143
  "karma-rollup-preprocessor": "7.0.8",
144
- "lockfile-lint": "^4.14.1",
145
- "nodemon": "^3.1.11",
144
+ "lockfile-lint": "^5.0.0",
145
+ "nodemon": "^3.1.14",
146
146
  "npm-run-all": "^4.1.5",
147
- "postcss": "^8.5.6",
147
+ "postcss": "^8.5.8",
148
148
  "postcss-cli": "^11.0.1",
149
149
  "postcss-combine-duplicated-selectors": "^10.0.3",
150
- "rimraf": "^6.1.2",
151
- "rollup": "^4.53.5",
150
+ "rimraf": "^6.1.3",
151
+ "rollup": "^4.59.0",
152
152
  "rollup-plugin-istanbul": "^5.0.0",
153
- "sass-embedded": "^1.97.0",
153
+ "sass-embedded": "^1.98.0",
154
154
  "sass-true": "^10.1.0",
155
155
  "shelljs": "^0.10.0",
156
156
  "stylelint": "^16.26.1",
157
157
  "stylelint-config-twbs-bootstrap": "^16.1.0",
158
- "terser": "5.44.1",
159
- "vnu-jar": "25.11.25"
158
+ "terser": "5.46.0",
159
+ "vnu-jar": "25.12.31"
160
160
  },
161
161
  "files": [
162
162
  "dist/{css,js}/**/*.{css,js,map}",
package/scss/_banner.scss CHANGED
@@ -1,7 +1,7 @@
1
1
  $file: "" !default;
2
2
 
3
3
  /*!
4
- * CoreUI #{$file} v5.5.0 (https://coreui.io)
5
- * Copyright (c) 2025 creativeLabs Łukasz Holeczek
4
+ * CoreUI #{$file} v5.6.1 (https://coreui.io)
5
+ * Copyright (c) 2026 creativeLabs Łukasz Holeczek
6
6
  * Licensed under MIT (https://github.com/coreui/coreui/blob/main/LICENSE)
7
7
  */
@@ -0,0 +1 @@
1
+ @forward "chip";