@coreui/coreui 5.5.0 → 5.6.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 (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 +874 -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 +873 -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 +874 -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 +874 -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 +873 -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 +874 -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 +528 -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 +595 -0
  104. package/js/src/chip.js +365 -0
  105. package/package.json +20 -20
  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/dist/js/coreui.js CHANGED
@@ -1,6 +1,6 @@
1
1
  /*!
2
- * CoreUI v5.5.0 (https://coreui.io)
3
- * Copyright 2025 The CoreUI Team (https://github.com/orgs/coreui/people)
2
+ * CoreUI v5.6.0 (https://coreui.io)
3
+ * Copyright 2026 The CoreUI Team (https://github.com/orgs/coreui/people)
4
4
  * Licensed under MIT (https://github.com/coreui/coreui/blob/main/LICENSE)
5
5
  */
6
6
  (function (global, factory) {
@@ -684,7 +684,7 @@
684
684
  * Constants
685
685
  */
686
686
 
687
- const VERSION = '5.5.0';
687
+ const VERSION = '5.6.0';
688
688
 
689
689
  /**
690
690
  * Class definition
@@ -878,11 +878,11 @@
878
878
  * Constants
879
879
  */
880
880
 
881
- const NAME$h = 'alert';
882
- const DATA_KEY$c = 'coreui.alert';
883
- const EVENT_KEY$d = `.${DATA_KEY$c}`;
884
- const EVENT_CLOSE = `close${EVENT_KEY$d}`;
885
- const EVENT_CLOSED = `closed${EVENT_KEY$d}`;
881
+ const NAME$j = 'alert';
882
+ const DATA_KEY$e = 'coreui.alert';
883
+ const EVENT_KEY$f = `.${DATA_KEY$e}`;
884
+ const EVENT_CLOSE = `close${EVENT_KEY$f}`;
885
+ const EVENT_CLOSED = `closed${EVENT_KEY$f}`;
886
886
  const CLASS_NAME_FADE$5 = 'fade';
887
887
  const CLASS_NAME_SHOW$a = 'show';
888
888
 
@@ -893,7 +893,7 @@
893
893
  class Alert extends BaseComponent {
894
894
  // Getters
895
895
  static get NAME() {
896
- return NAME$h;
896
+ return NAME$j;
897
897
  }
898
898
 
899
899
  // Public
@@ -956,13 +956,13 @@
956
956
  * Constants
957
957
  */
958
958
 
959
- const NAME$g = 'button';
960
- const DATA_KEY$b = 'coreui.button';
961
- const EVENT_KEY$c = `.${DATA_KEY$b}`;
962
- const DATA_API_KEY$8 = '.data-api';
963
- const CLASS_NAME_ACTIVE$4 = 'active';
959
+ const NAME$i = 'button';
960
+ const DATA_KEY$d = 'coreui.button';
961
+ const EVENT_KEY$e = `.${DATA_KEY$d}`;
962
+ const DATA_API_KEY$a = '.data-api';
963
+ const CLASS_NAME_ACTIVE$5 = 'active';
964
964
  const SELECTOR_DATA_TOGGLE$6 = '[data-coreui-toggle="button"]';
965
- const EVENT_CLICK_DATA_API$8 = `click${EVENT_KEY$c}${DATA_API_KEY$8}`;
965
+ const EVENT_CLICK_DATA_API$8 = `click${EVENT_KEY$e}${DATA_API_KEY$a}`;
966
966
 
967
967
  /**
968
968
  * Class definition
@@ -971,13 +971,13 @@
971
971
  class Button extends BaseComponent {
972
972
  // Getters
973
973
  static get NAME() {
974
- return NAME$g;
974
+ return NAME$i;
975
975
  }
976
976
 
977
977
  // Public
978
978
  toggle() {
979
979
  // Toggle class and sync the `aria-pressed` attribute with the return value of the `.toggle()` method
980
- this._element.setAttribute('aria-pressed', this._element.classList.toggle(CLASS_NAME_ACTIVE$4));
980
+ this._element.setAttribute('aria-pressed', this._element.classList.toggle(CLASS_NAME_ACTIVE$5));
981
981
  }
982
982
 
983
983
  // Static
@@ -1023,23 +1023,23 @@
1023
1023
  * Constants
1024
1024
  */
1025
1025
 
1026
- const NAME$f = 'swipe';
1027
- const EVENT_KEY$b = '.coreui.swipe';
1028
- const EVENT_TOUCHSTART = `touchstart${EVENT_KEY$b}`;
1029
- const EVENT_TOUCHMOVE = `touchmove${EVENT_KEY$b}`;
1030
- const EVENT_TOUCHEND = `touchend${EVENT_KEY$b}`;
1031
- const EVENT_POINTERDOWN = `pointerdown${EVENT_KEY$b}`;
1032
- const EVENT_POINTERUP = `pointerup${EVENT_KEY$b}`;
1026
+ const NAME$h = 'swipe';
1027
+ const EVENT_KEY$d = '.coreui.swipe';
1028
+ const EVENT_TOUCHSTART = `touchstart${EVENT_KEY$d}`;
1029
+ const EVENT_TOUCHMOVE = `touchmove${EVENT_KEY$d}`;
1030
+ const EVENT_TOUCHEND = `touchend${EVENT_KEY$d}`;
1031
+ const EVENT_POINTERDOWN = `pointerdown${EVENT_KEY$d}`;
1032
+ const EVENT_POINTERUP = `pointerup${EVENT_KEY$d}`;
1033
1033
  const POINTER_TYPE_TOUCH = 'touch';
1034
1034
  const POINTER_TYPE_PEN = 'pen';
1035
1035
  const CLASS_NAME_POINTER_EVENT = 'pointer-event';
1036
1036
  const SWIPE_THRESHOLD = 40;
1037
- const Default$e = {
1037
+ const Default$g = {
1038
1038
  endCallback: null,
1039
1039
  leftCallback: null,
1040
1040
  rightCallback: null
1041
1041
  };
1042
- const DefaultType$e = {
1042
+ const DefaultType$g = {
1043
1043
  endCallback: '(function|null)',
1044
1044
  leftCallback: '(function|null)',
1045
1045
  rightCallback: '(function|null)'
@@ -1064,18 +1064,18 @@
1064
1064
 
1065
1065
  // Getters
1066
1066
  static get Default() {
1067
- return Default$e;
1067
+ return Default$g;
1068
1068
  }
1069
1069
  static get DefaultType() {
1070
- return DefaultType$e;
1070
+ return DefaultType$g;
1071
1071
  }
1072
1072
  static get NAME() {
1073
- return NAME$f;
1073
+ return NAME$h;
1074
1074
  }
1075
1075
 
1076
1076
  // Public
1077
1077
  dispose() {
1078
- EventHandler.off(this._element, EVENT_KEY$b);
1078
+ EventHandler.off(this._element, EVENT_KEY$d);
1079
1079
  }
1080
1080
 
1081
1081
  // Private
@@ -1146,10 +1146,10 @@
1146
1146
  * Constants
1147
1147
  */
1148
1148
 
1149
- const NAME$e = 'carousel';
1150
- const DATA_KEY$a = 'coreui.carousel';
1151
- const EVENT_KEY$a = `.${DATA_KEY$a}`;
1152
- const DATA_API_KEY$7 = '.data-api';
1149
+ const NAME$g = 'carousel';
1150
+ const DATA_KEY$c = 'coreui.carousel';
1151
+ const EVENT_KEY$c = `.${DATA_KEY$c}`;
1152
+ const DATA_API_KEY$9 = '.data-api';
1153
1153
  const ARROW_LEFT_KEY$1 = 'ArrowLeft';
1154
1154
  const ARROW_RIGHT_KEY$1 = 'ArrowRight';
1155
1155
  const TOUCHEVENT_COMPAT_WAIT = 500; // Time for mouse compat events to fire after touch
@@ -1158,16 +1158,16 @@
1158
1158
  const ORDER_PREV = 'prev';
1159
1159
  const DIRECTION_LEFT = 'left';
1160
1160
  const DIRECTION_RIGHT = 'right';
1161
- const EVENT_SLIDE = `slide${EVENT_KEY$a}`;
1162
- const EVENT_SLID = `slid${EVENT_KEY$a}`;
1163
- const EVENT_KEYDOWN$1 = `keydown${EVENT_KEY$a}`;
1164
- const EVENT_MOUSEENTER$1 = `mouseenter${EVENT_KEY$a}`;
1165
- const EVENT_MOUSELEAVE$1 = `mouseleave${EVENT_KEY$a}`;
1166
- const EVENT_DRAG_START = `dragstart${EVENT_KEY$a}`;
1167
- const EVENT_LOAD_DATA_API$5 = `load${EVENT_KEY$a}${DATA_API_KEY$7}`;
1168
- const EVENT_CLICK_DATA_API$7 = `click${EVENT_KEY$a}${DATA_API_KEY$7}`;
1161
+ const EVENT_SLIDE = `slide${EVENT_KEY$c}`;
1162
+ const EVENT_SLID = `slid${EVENT_KEY$c}`;
1163
+ const EVENT_KEYDOWN$1 = `keydown${EVENT_KEY$c}`;
1164
+ const EVENT_MOUSEENTER$1 = `mouseenter${EVENT_KEY$c}`;
1165
+ const EVENT_MOUSELEAVE$1 = `mouseleave${EVENT_KEY$c}`;
1166
+ const EVENT_DRAG_START = `dragstart${EVENT_KEY$c}`;
1167
+ const EVENT_LOAD_DATA_API$5 = `load${EVENT_KEY$c}${DATA_API_KEY$9}`;
1168
+ const EVENT_CLICK_DATA_API$7 = `click${EVENT_KEY$c}${DATA_API_KEY$9}`;
1169
1169
  const CLASS_NAME_CAROUSEL = 'carousel';
1170
- const CLASS_NAME_ACTIVE$3 = 'active';
1170
+ const CLASS_NAME_ACTIVE$4 = 'active';
1171
1171
  const CLASS_NAME_SLIDE = 'slide';
1172
1172
  const CLASS_NAME_END = 'carousel-item-end';
1173
1173
  const CLASS_NAME_START = 'carousel-item-start';
@@ -1184,7 +1184,7 @@
1184
1184
  [ARROW_LEFT_KEY$1]: DIRECTION_RIGHT,
1185
1185
  [ARROW_RIGHT_KEY$1]: DIRECTION_LEFT
1186
1186
  };
1187
- const Default$d = {
1187
+ const Default$f = {
1188
1188
  interval: 5000,
1189
1189
  keyboard: true,
1190
1190
  pause: 'hover',
@@ -1192,7 +1192,7 @@
1192
1192
  touch: true,
1193
1193
  wrap: true
1194
1194
  };
1195
- const DefaultType$d = {
1195
+ const DefaultType$f = {
1196
1196
  interval: '(number|boolean)',
1197
1197
  // TODO:v6 remove boolean support
1198
1198
  keyboard: 'boolean',
@@ -1223,13 +1223,13 @@
1223
1223
 
1224
1224
  // Getters
1225
1225
  static get Default() {
1226
- return Default$d;
1226
+ return Default$f;
1227
1227
  }
1228
1228
  static get DefaultType() {
1229
- return DefaultType$d;
1229
+ return DefaultType$f;
1230
1230
  }
1231
1231
  static get NAME() {
1232
- return NAME$e;
1232
+ return NAME$g;
1233
1233
  }
1234
1234
 
1235
1235
  // Public
@@ -1356,11 +1356,11 @@
1356
1356
  return;
1357
1357
  }
1358
1358
  const activeIndicator = SelectorEngine.findOne(SELECTOR_ACTIVE, this._indicatorsElement);
1359
- activeIndicator.classList.remove(CLASS_NAME_ACTIVE$3);
1359
+ activeIndicator.classList.remove(CLASS_NAME_ACTIVE$4);
1360
1360
  activeIndicator.removeAttribute('aria-current');
1361
1361
  const newActiveIndicator = SelectorEngine.findOne(`[data-coreui-slide-to="${index}"]`, this._indicatorsElement);
1362
1362
  if (newActiveIndicator) {
1363
- newActiveIndicator.classList.add(CLASS_NAME_ACTIVE$3);
1363
+ newActiveIndicator.classList.add(CLASS_NAME_ACTIVE$4);
1364
1364
  newActiveIndicator.setAttribute('aria-current', 'true');
1365
1365
  }
1366
1366
  }
@@ -1413,8 +1413,8 @@
1413
1413
  nextElement.classList.add(directionalClassName);
1414
1414
  const completeCallBack = () => {
1415
1415
  nextElement.classList.remove(directionalClassName, orderClassName);
1416
- nextElement.classList.add(CLASS_NAME_ACTIVE$3);
1417
- activeElement.classList.remove(CLASS_NAME_ACTIVE$3, orderClassName, directionalClassName);
1416
+ nextElement.classList.add(CLASS_NAME_ACTIVE$4);
1417
+ activeElement.classList.remove(CLASS_NAME_ACTIVE$4, orderClassName, directionalClassName);
1418
1418
  this._isSliding = false;
1419
1419
  triggerEvent(EVENT_SLID);
1420
1420
  };
@@ -1507,6 +1507,826 @@
1507
1507
 
1508
1508
  defineJQueryPlugin(Carousel);
1509
1509
 
1510
+ /**
1511
+ * --------------------------------------------------------------------------
1512
+ * CoreUI chip.js
1513
+ * Licensed under MIT (https://github.com/coreui/coreui/blob/main/LICENSE)
1514
+ * --------------------------------------------------------------------------
1515
+ */
1516
+
1517
+
1518
+ /**
1519
+ * Constants
1520
+ */
1521
+
1522
+ const NAME$f = 'chip';
1523
+ const DATA_KEY$b = 'coreui.chip';
1524
+ const EVENT_KEY$b = `.${DATA_KEY$b}`;
1525
+ const DATA_API_KEY$8 = '.data-api';
1526
+ const EVENT_REMOVE$1 = `remove${EVENT_KEY$b}`;
1527
+ const EVENT_REMOVED = `removed${EVENT_KEY$b}`;
1528
+ const EVENT_SELECT$1 = `select${EVENT_KEY$b}`;
1529
+ const EVENT_SELECTED = `selected${EVENT_KEY$b}`;
1530
+ const EVENT_DESELECT = `deselect${EVENT_KEY$b}`;
1531
+ const EVENT_DESELECTED = `deselected${EVENT_KEY$b}`;
1532
+ const SELECTOR_CHIP_REMOVE$1 = '.chip-remove';
1533
+ const SELECTOR_DATA_CHIP = '[data-coreui-chip]';
1534
+ const SELECTOR_FOCUSABLE_ITEMS$1 = '.chip:not(.disabled)';
1535
+ const CLASS_NAME_CHIP_CLICKABLE = 'chip-clickable';
1536
+ const CLASS_NAME_CHIP_REMOVE = 'chip-remove';
1537
+ const CLASS_NAME_ACTIVE$3 = 'active';
1538
+ const CLASS_NAME_DISABLED$1 = 'disabled';
1539
+ const DEFAULT_REMOVE_ICON$1 = '<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>';
1540
+ const Default$e = {
1541
+ ariaRemoveLabel: 'Remove',
1542
+ disabled: false,
1543
+ removable: false,
1544
+ removeIcon: DEFAULT_REMOVE_ICON$1,
1545
+ selectable: false,
1546
+ selected: false
1547
+ };
1548
+ const DefaultType$e = {
1549
+ ariaRemoveLabel: 'string',
1550
+ disabled: 'boolean',
1551
+ removable: 'boolean',
1552
+ removeIcon: 'string',
1553
+ selectable: 'boolean',
1554
+ selected: 'boolean'
1555
+ };
1556
+
1557
+ /**
1558
+ * Class definition
1559
+ */
1560
+
1561
+ class Chip extends BaseComponent {
1562
+ constructor(element, config) {
1563
+ super(element, config);
1564
+ this._disabled = this._config.disabled || this._element.classList.contains(CLASS_NAME_DISABLED$1);
1565
+ this._selected = this._config.selected || this._element.classList.contains(CLASS_NAME_ACTIVE$3);
1566
+ this._ensureRemoveButton();
1567
+ this._applyState();
1568
+ if (this._config.selectable || this._config.removable) {
1569
+ this._makeFocusable();
1570
+ }
1571
+ this._addEventListeners();
1572
+ }
1573
+
1574
+ // Getters
1575
+ static get Default() {
1576
+ return Default$e;
1577
+ }
1578
+ static get DefaultType() {
1579
+ return DefaultType$e;
1580
+ }
1581
+ static get NAME() {
1582
+ return NAME$f;
1583
+ }
1584
+
1585
+ // Public
1586
+ remove() {
1587
+ const removeEvent = EventHandler.trigger(this._element, EVENT_REMOVE$1);
1588
+ if (removeEvent.defaultPrevented) {
1589
+ return;
1590
+ }
1591
+ this._destroyElement();
1592
+ }
1593
+ toggle() {
1594
+ if (!this._config.selectable) {
1595
+ return;
1596
+ }
1597
+ if (this._selected) {
1598
+ this.deselect();
1599
+ return;
1600
+ }
1601
+ this.select();
1602
+ }
1603
+ select() {
1604
+ if (!this._config.selectable) {
1605
+ return;
1606
+ }
1607
+ if (this._selected) {
1608
+ return;
1609
+ }
1610
+ const selectEvent = EventHandler.trigger(this._element, EVENT_SELECT$1);
1611
+ if (selectEvent.defaultPrevented) {
1612
+ return;
1613
+ }
1614
+ this._selected = true;
1615
+ this._applyState();
1616
+ EventHandler.trigger(this._element, EVENT_SELECTED);
1617
+ }
1618
+ deselect() {
1619
+ if (!this._config.selectable) {
1620
+ return;
1621
+ }
1622
+ if (!this._selected) {
1623
+ return;
1624
+ }
1625
+ const deselectEvent = EventHandler.trigger(this._element, EVENT_DESELECT);
1626
+ if (deselectEvent.defaultPrevented) {
1627
+ return;
1628
+ }
1629
+ this._selected = false;
1630
+ this._applyState();
1631
+ EventHandler.trigger(this._element, EVENT_DESELECTED);
1632
+ }
1633
+
1634
+ // Private
1635
+ _addEventListeners() {
1636
+ EventHandler.on(this._element, 'keydown', event => this._handleKeydown(event));
1637
+ EventHandler.on(this._element, 'click', event => {
1638
+ if (this._disabled) {
1639
+ return;
1640
+ }
1641
+ if (event.target.closest(SELECTOR_CHIP_REMOVE$1)) {
1642
+ return;
1643
+ }
1644
+ this.toggle();
1645
+ });
1646
+ EventHandler.on(this._element, 'click', SELECTOR_CHIP_REMOVE$1, event => {
1647
+ event.stopPropagation();
1648
+ this.remove();
1649
+ });
1650
+ }
1651
+ _applyState() {
1652
+ if (!this._disabled && (this._config.clickable || this._config.selectable)) {
1653
+ this._element.classList.add(CLASS_NAME_CHIP_CLICKABLE);
1654
+ }
1655
+ if (this._disabled) {
1656
+ this._element.classList.add(CLASS_NAME_DISABLED$1);
1657
+ this._element.setAttribute('aria-disabled', 'true');
1658
+ } else {
1659
+ this._element.classList.remove(CLASS_NAME_DISABLED$1);
1660
+ if (this._element.getAttribute('aria-disabled') === 'true') {
1661
+ this._element.setAttribute('aria-disabled', 'false');
1662
+ }
1663
+ }
1664
+ if (this._config.selectable) {
1665
+ this._element.classList.toggle(CLASS_NAME_ACTIVE$3, this._selected);
1666
+ this._element.setAttribute('aria-selected', this._selected ? 'true' : 'false');
1667
+ } else {
1668
+ this._element.classList.remove(CLASS_NAME_ACTIVE$3);
1669
+ if (this._element.getAttribute('aria-selected') === 'true') {
1670
+ this._element.setAttribute('aria-selected', 'false');
1671
+ }
1672
+ }
1673
+ }
1674
+ _createRemoveButton() {
1675
+ const button = document.createElement('button');
1676
+ button.type = 'button';
1677
+ button.className = CLASS_NAME_CHIP_REMOVE;
1678
+ button.setAttribute('aria-label', this._config.ariaRemoveLabel);
1679
+ button.setAttribute('tabindex', '-1'); // Not in tab order, chips handle keyboard
1680
+ button.innerHTML = this._config.removeIcon;
1681
+ return button;
1682
+ }
1683
+ _ensureRemoveButton() {
1684
+ if (!this._config.removable) {
1685
+ return;
1686
+ }
1687
+ if (SelectorEngine.findOne(SELECTOR_CHIP_REMOVE$1, this._element)) {
1688
+ return;
1689
+ }
1690
+ this._element.append(this._createRemoveButton());
1691
+ }
1692
+ _makeFocusable() {
1693
+ if (this._element.hasAttribute('tabindex') || this._disabled) {
1694
+ return;
1695
+ }
1696
+ this._element.setAttribute('tabindex', '0');
1697
+ }
1698
+ _handleKeydown(event) {
1699
+ const {
1700
+ key
1701
+ } = event;
1702
+ if (this._disabled) {
1703
+ return;
1704
+ }
1705
+ switch (key) {
1706
+ case 'Enter':
1707
+ case ' ':
1708
+ case 'Spacebar':
1709
+ {
1710
+ if (!this._config.selectable) {
1711
+ return;
1712
+ }
1713
+ event.preventDefault();
1714
+ this.toggle();
1715
+ break;
1716
+ }
1717
+ case 'Backspace':
1718
+ case 'Delete':
1719
+ {
1720
+ if (this._config.removable) {
1721
+ event.preventDefault();
1722
+ const sibling = this._getFocusableSibling(false) || this._getFocusableSibling(true);
1723
+ sibling == null || sibling.focus();
1724
+ this.remove();
1725
+ }
1726
+ break;
1727
+ }
1728
+ case 'ArrowLeft':
1729
+ {
1730
+ event.preventDefault();
1731
+ const chip = this._getFocusableSibling(false);
1732
+ chip == null || chip.focus();
1733
+ break;
1734
+ }
1735
+ case 'ArrowRight':
1736
+ {
1737
+ event.preventDefault();
1738
+ const chip = this._getFocusableSibling(true);
1739
+ chip == null || chip.focus();
1740
+ break;
1741
+ }
1742
+ case 'Home':
1743
+ {
1744
+ event.preventDefault();
1745
+ this._navigateToEdge(0);
1746
+ break;
1747
+ }
1748
+ case 'End':
1749
+ {
1750
+ event.preventDefault();
1751
+ this._navigateToEdge(-1);
1752
+ break;
1753
+ }
1754
+
1755
+ // No default
1756
+ }
1757
+ }
1758
+ _getFocusableSibling(shouldGetNext) {
1759
+ const chips = SelectorEngine.find(SELECTOR_FOCUSABLE_ITEMS$1, this._element.parentElement);
1760
+ const sibling = getNextActiveElement(chips, this._element, shouldGetNext, !chips.includes(this._element));
1761
+ return sibling === this._element ? null : sibling;
1762
+ }
1763
+ _navigateToEdge(targetIndex) {
1764
+ const chips = SelectorEngine.find(SELECTOR_FOCUSABLE_ITEMS$1, this._element.parentElement);
1765
+ if (chips.length === 0) {
1766
+ return;
1767
+ }
1768
+ const targetChip = chips.at(targetIndex);
1769
+ targetChip == null || targetChip.focus();
1770
+ }
1771
+ _destroyElement() {
1772
+ EventHandler.trigger(this._element, EVENT_REMOVED);
1773
+ this._element.remove();
1774
+ this.dispose();
1775
+ }
1776
+
1777
+ // Static
1778
+ static chipInterface(element, config) {
1779
+ const data = Chip.getOrCreateInstance(element, config);
1780
+ if (typeof config === 'string') {
1781
+ if (typeof data[config] === 'undefined') {
1782
+ throw new TypeError(`No method named "${config}"`);
1783
+ }
1784
+ data[config]();
1785
+ }
1786
+ }
1787
+ static jQueryInterface(config) {
1788
+ return this.each(function () {
1789
+ const data = Chip.getOrCreateInstance(this);
1790
+ if (typeof config !== 'string') {
1791
+ return;
1792
+ }
1793
+ if (data[config] === undefined || config.startsWith('_') || config === 'constructor') {
1794
+ throw new TypeError(`No method named "${config}"`);
1795
+ }
1796
+ data[config](this);
1797
+ });
1798
+ }
1799
+ }
1800
+
1801
+ /**
1802
+ * Data API implementation
1803
+ */
1804
+
1805
+ EventHandler.on(document, `DOMContentLoaded${EVENT_KEY$b}${DATA_API_KEY$8}`, () => {
1806
+ for (const element of SelectorEngine.find(SELECTOR_DATA_CHIP)) {
1807
+ Chip.chipInterface(element);
1808
+ }
1809
+ });
1810
+
1811
+ /**
1812
+ * jQuery
1813
+ */
1814
+
1815
+ defineJQueryPlugin(Chip);
1816
+
1817
+ /**
1818
+ * --------------------------------------------------------------------------
1819
+ * CoreUI chip-input.js
1820
+ * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)
1821
+ *
1822
+ * This component is a highly modified version of the Bootstrap's chip-input.js
1823
+ * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)
1824
+ * --------------------------------------------------------------------------
1825
+ */
1826
+
1827
+
1828
+ /**
1829
+ * Constants
1830
+ */
1831
+
1832
+ const NAME$e = 'chip-input';
1833
+ const DATA_KEY$a = 'coreui.chip-input';
1834
+ const EVENT_KEY$a = `.${DATA_KEY$a}`;
1835
+ const DATA_API_KEY$7 = '.data-api';
1836
+ const EVENT_ADD = `add${EVENT_KEY$a}`;
1837
+ const EVENT_REMOVE = `remove${EVENT_KEY$a}`;
1838
+ const EVENT_CHANGE = `change${EVENT_KEY$a}`;
1839
+ const EVENT_SELECT = `select${EVENT_KEY$a}`;
1840
+ const EVENT_INPUT = `input${EVENT_KEY$a}`;
1841
+ const SELECTOR_DATA_CHIP_INPUT = '[data-coreui-chip-input]';
1842
+ const SELECTOR_CHIP = '.chip';
1843
+ const SELECTOR_CHIP_ACTIVE = `${SELECTOR_CHIP}.active`;
1844
+ const SELECTOR_CHIP_INPUT_LABEL = '.chip-input-label';
1845
+ const SELECTOR_CHIP_REMOVE = '.chip-remove';
1846
+ const SELECTOR_FOCUSABLE_ITEMS = '.chip:not(.disabled)';
1847
+ const CLASS_NAME_CHIP = 'chip';
1848
+ const CLASS_NAME_DISABLED = 'disabled';
1849
+ const CLASS_NAME_CHIP_INPUT_FIELD = 'chip-input-field';
1850
+ 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>';
1851
+ const Default$d = {
1852
+ chipClassName: null,
1853
+ createOnBlur: true,
1854
+ disabled: false,
1855
+ id: null,
1856
+ maxChips: null,
1857
+ name: null,
1858
+ placeholder: '',
1859
+ readonly: false,
1860
+ removable: true,
1861
+ removeIcon: DEFAULT_REMOVE_ICON,
1862
+ selectable: false,
1863
+ separator: ','
1864
+ };
1865
+ const DefaultType$d = {
1866
+ chipClassName: '(string|function|null)',
1867
+ createOnBlur: 'boolean',
1868
+ disabled: 'boolean',
1869
+ maxChips: '(number|null)',
1870
+ id: '(string|null)',
1871
+ name: '(string|null)',
1872
+ placeholder: 'string',
1873
+ readonly: 'boolean',
1874
+ removable: 'boolean',
1875
+ removeIcon: 'string',
1876
+ selectable: 'boolean',
1877
+ separator: '(string|null)'
1878
+ };
1879
+
1880
+ /**
1881
+ * Class definition
1882
+ */
1883
+
1884
+ class ChipInput extends BaseComponent {
1885
+ constructor(element, config) {
1886
+ var _this$_config$id;
1887
+ super(element, config);
1888
+ this._uniqueId = (_this$_config$id = this._config.id) != null ? _this$_config$id : getUID(`${this.constructor.NAME}`);
1889
+ this._disabled = this._config.disabled || this._element.classList.contains(CLASS_NAME_DISABLED);
1890
+ this._readonly = this._config.readonly;
1891
+ this._chips = [];
1892
+ this._input = SelectorEngine.findOne('input', this._element);
1893
+ this._hiddenInput = null;
1894
+ if (this._input) {
1895
+ this._setInputSize();
1896
+ } else {
1897
+ this._createInput();
1898
+ }
1899
+ this._applyInteractionState();
1900
+ this._initializeExistingChips();
1901
+ this._createHiddenInput();
1902
+ this._addEventListeners();
1903
+ }
1904
+
1905
+ // Getters
1906
+ static get Default() {
1907
+ return Default$d;
1908
+ }
1909
+ static get DefaultType() {
1910
+ return DefaultType$d;
1911
+ }
1912
+ static get NAME() {
1913
+ return NAME$e;
1914
+ }
1915
+
1916
+ // Public
1917
+ add(value) {
1918
+ if (this._disabled || this._readonly) {
1919
+ return null;
1920
+ }
1921
+ const trimmedValue = String(value).trim();
1922
+ if (!trimmedValue) {
1923
+ return null;
1924
+ }
1925
+
1926
+ // Chips are unique by value
1927
+ if (this._chips.includes(trimmedValue)) {
1928
+ return null;
1929
+ }
1930
+
1931
+ // Check max chips limit
1932
+ if (this._config.maxChips !== null && this._chips.length >= this._config.maxChips) {
1933
+ return null;
1934
+ }
1935
+ const addEvent = EventHandler.trigger(this._element, EVENT_ADD, {
1936
+ value: trimmedValue,
1937
+ relatedTarget: this._input
1938
+ });
1939
+ if (addEvent.defaultPrevented) {
1940
+ return null;
1941
+ }
1942
+ const chip = this._createChip(trimmedValue);
1943
+ this._element.insertBefore(chip, this._input);
1944
+ this._chips.push(trimmedValue);
1945
+ const values = this.getValues();
1946
+ this._hiddenInput.value = values.join(',');
1947
+ EventHandler.trigger(this._element, EVENT_CHANGE, {
1948
+ values
1949
+ });
1950
+ return chip;
1951
+ }
1952
+ remove(chipOrValue) {
1953
+ if (this._disabled || this._readonly) {
1954
+ return false;
1955
+ }
1956
+ let chip;
1957
+ let value;
1958
+ if (typeof chipOrValue === 'string') {
1959
+ value = chipOrValue;
1960
+ chip = this._findChipByValue(value);
1961
+ } else {
1962
+ chip = chipOrValue;
1963
+ value = this._getChipValue(chip);
1964
+ }
1965
+ if (!chip || !value) {
1966
+ return false;
1967
+ }
1968
+ const removeEvent = EventHandler.trigger(this._element, EVENT_REMOVE, {
1969
+ value,
1970
+ chip,
1971
+ relatedTarget: this._input
1972
+ });
1973
+ if (removeEvent.defaultPrevented) {
1974
+ return false;
1975
+ }
1976
+ const chipInstance = Chip.getInstance(chip);
1977
+ if (chipInstance) {
1978
+ chipInstance.remove();
1979
+ } else {
1980
+ chip.remove();
1981
+ this._handleChipRemoved(chip, value);
1982
+ }
1983
+ return !chip.isConnected;
1984
+ }
1985
+ removeSelected() {
1986
+ var _this$_input;
1987
+ const chipsToRemove = this._getSelectedChipElements();
1988
+ for (const chip of chipsToRemove) {
1989
+ this.remove(chip);
1990
+ }
1991
+ (_this$_input = this._input) == null || _this$_input.focus();
1992
+ }
1993
+ getValues() {
1994
+ return [...this._chips];
1995
+ }
1996
+ getSelectedValues() {
1997
+ return this._getSelectedChipElements().map(chip => this._getChipValue(chip));
1998
+ }
1999
+ clear() {
2000
+ const chips = SelectorEngine.find(SELECTOR_CHIP, this._element);
2001
+ for (const chip of chips) {
2002
+ this.remove(chip);
2003
+ }
2004
+ }
2005
+ clearSelection() {
2006
+ for (const chip of this._getSelectedChipElements()) {
2007
+ var _Chip$getInstance;
2008
+ (_Chip$getInstance = Chip.getInstance(chip)) == null || _Chip$getInstance.deselect();
2009
+ }
2010
+ EventHandler.trigger(this._element, EVENT_SELECT, {
2011
+ selected: []
2012
+ });
2013
+ }
2014
+ selectChip(chip) {
2015
+ const chipElements = this._getChipElements();
2016
+ if (!chipElements.includes(chip)) {
2017
+ return;
2018
+ }
2019
+ const chipInstance = Chip.getInstance(chip);
2020
+ if (!chipInstance) {
2021
+ return;
2022
+ }
2023
+ chipInstance.select();
2024
+ }
2025
+ focus() {
2026
+ var _this$_input2;
2027
+ (_this$_input2 = this._input) == null || _this$_input2.focus();
2028
+ }
2029
+
2030
+ // Private
2031
+ _emitSelectionChange() {
2032
+ EventHandler.trigger(this._element, EVENT_SELECT, {
2033
+ selected: this.getSelectedValues()
2034
+ });
2035
+ }
2036
+ _getChipElements() {
2037
+ return SelectorEngine.find(SELECTOR_CHIP, this._element);
2038
+ }
2039
+ _getSelectedChipElements() {
2040
+ return SelectorEngine.find(SELECTOR_CHIP_ACTIVE, this._element);
2041
+ }
2042
+ _createInput() {
2043
+ const input = document.createElement('input');
2044
+ const label = SelectorEngine.findOne(SELECTOR_CHIP_INPUT_LABEL, this._element);
2045
+ const labelFor = label == null ? void 0 : label.getAttribute('for');
2046
+ const generatedInputId = labelFor || getUID(`${this.constructor.NAME}-input`);
2047
+ input.type = 'text';
2048
+ input.className = CLASS_NAME_CHIP_INPUT_FIELD;
2049
+ input.id = generatedInputId;
2050
+ if (this._config.placeholder) {
2051
+ input.placeholder = this._config.placeholder;
2052
+ }
2053
+ if (label && !labelFor) {
2054
+ label.setAttribute('for', generatedInputId);
2055
+ }
2056
+ this._input = input;
2057
+ this._setInputSize();
2058
+ this._element.append(input);
2059
+ }
2060
+ _createHiddenInput() {
2061
+ const hiddenInput = document.createElement('input');
2062
+ hiddenInput.type = 'hidden';
2063
+ hiddenInput.id = this._uniqueId;
2064
+ hiddenInput.name = this._config.name || this._uniqueId;
2065
+ this._element.append(hiddenInput);
2066
+ this._hiddenInput = hiddenInput;
2067
+ this._hiddenInput.value = this.getValues().join(',');
2068
+ }
2069
+ _createChip(value) {
2070
+ const chip = document.createElement('span');
2071
+ chip.className = CLASS_NAME_CHIP;
2072
+ chip.dataset.coreuiChipValue = value;
2073
+ chip.append(document.createTextNode(value));
2074
+ this._applyChipClassName(chip, value);
2075
+ this._setupChip(chip);
2076
+ return chip;
2077
+ }
2078
+ _createChipFromInput() {
2079
+ if (this._disabled || this._readonly) {
2080
+ return;
2081
+ }
2082
+ const value = this._input.value.trim();
2083
+ if (value) {
2084
+ this.add(value);
2085
+ this._input.value = '';
2086
+ this._setInputSize();
2087
+ }
2088
+ }
2089
+ _findChipByValue(value) {
2090
+ const chips = this._getChipElements();
2091
+ return chips.find(chip => this._getChipValue(chip) === value);
2092
+ }
2093
+ _getChipValue(chip) {
2094
+ var _clone$textContent;
2095
+ if (chip.dataset.coreuiChipValue) {
2096
+ return chip.dataset.coreuiChipValue;
2097
+ }
2098
+ const clone = chip.cloneNode(true);
2099
+ const remove = SelectorEngine.findOne(SELECTOR_CHIP_REMOVE, clone);
2100
+ if (remove) {
2101
+ remove.remove();
2102
+ }
2103
+ return ((_clone$textContent = clone.textContent) == null ? void 0 : _clone$textContent.trim()) || '';
2104
+ }
2105
+ _initializeExistingChips() {
2106
+ const existingChips = SelectorEngine.find(SELECTOR_CHIP, this._element);
2107
+ for (const chip of existingChips) {
2108
+ const value = this._getChipValue(chip);
2109
+ if (value) {
2110
+ this._chips.push(value);
2111
+ this._applyChipClassName(chip, value);
2112
+ this._setupChip(chip);
2113
+ }
2114
+ }
2115
+ }
2116
+ _applyChipClassName(chip, value) {
2117
+ const className = this._resolveChipClassName(value);
2118
+ if (!className) {
2119
+ return;
2120
+ }
2121
+ chip.classList.add(...className.split(/\s+/).filter(Boolean));
2122
+ }
2123
+ _resolveChipClassName(value) {
2124
+ const {
2125
+ chipClassName
2126
+ } = this._config;
2127
+ if (!chipClassName) {
2128
+ return '';
2129
+ }
2130
+ if (typeof chipClassName === 'function') {
2131
+ const resolvedClassName = chipClassName(value);
2132
+ return typeof resolvedClassName === 'string' ? resolvedClassName : '';
2133
+ }
2134
+ return typeof chipClassName === 'string' ? chipClassName : '';
2135
+ }
2136
+ _setupChip(chip) {
2137
+ Chip.getOrCreateInstance(chip, {
2138
+ ariaRemoveLabel: `Remove ${this._getChipValue(chip)}`,
2139
+ disabled: this._disabled,
2140
+ removable: this._config.removable && !this._readonly && !this._disabled,
2141
+ removeIcon: this._config.removeIcon,
2142
+ selectable: this._config.selectable
2143
+ });
2144
+ const removeButton = SelectorEngine.findOne(SELECTOR_CHIP_REMOVE, chip);
2145
+ if (removeButton) {
2146
+ removeButton.disabled = this._disabled || this._readonly;
2147
+ }
2148
+ }
2149
+ _applyInteractionState() {
2150
+ this._element.classList.toggle(CLASS_NAME_DISABLED, this._disabled);
2151
+ this._input.disabled = this._disabled;
2152
+ this._input.readOnly = !this._disabled && this._readonly;
2153
+ this._element.setAttribute('aria-disabled', this._disabled ? 'true' : 'false');
2154
+ this._element.setAttribute('aria-readonly', this._readonly ? 'true' : 'false');
2155
+ }
2156
+ _addEventListeners() {
2157
+ EventHandler.on(this._element, 'keydown', event => {
2158
+ if (event.target === this._input) {
2159
+ return;
2160
+ }
2161
+ if (event.key.length === 1) {
2162
+ // eslint-disable-next-line no-console
2163
+ console.log(event.key.length);
2164
+ this._input.focus();
2165
+ }
2166
+ });
2167
+ EventHandler.on(this._input, 'keydown', event => this._handleInputKeydown(event));
2168
+ EventHandler.on(this._input, 'input', event => this._handleInput(event));
2169
+ EventHandler.on(this._input, 'paste', event => this._handlePaste(event));
2170
+ EventHandler.on(this._input, 'focus', () => this.clearSelection());
2171
+ if (this._config.createOnBlur) {
2172
+ EventHandler.on(this._input, 'blur', event => {
2173
+ var _event$relatedTarget;
2174
+ // Don't create chip if clicking on a chip
2175
+ if (!((_event$relatedTarget = event.relatedTarget) != null && _event$relatedTarget.closest(SELECTOR_CHIP))) {
2176
+ this._createChipFromInput();
2177
+ }
2178
+ });
2179
+ }
2180
+ EventHandler.on(this._element, 'selected.coreui.chip', SELECTOR_CHIP, () => {
2181
+ this._emitSelectionChange();
2182
+ });
2183
+ EventHandler.on(this._element, 'deselected.coreui.chip', SELECTOR_CHIP, () => {
2184
+ this._emitSelectionChange();
2185
+ });
2186
+ EventHandler.on(this._element, 'remove.coreui.chip', SELECTOR_CHIP, event => {
2187
+ if (this._disabled || this._readonly) {
2188
+ event.preventDefault();
2189
+ }
2190
+ });
2191
+ EventHandler.on(this._element, 'removed.coreui.chip', SELECTOR_CHIP, event => {
2192
+ const chip = event.target.closest(SELECTOR_CHIP);
2193
+ if (chip) {
2194
+ this._handleChipRemoved(chip);
2195
+ const focusableChips = SelectorEngine.find(SELECTOR_FOCUSABLE_ITEMS, this._element);
2196
+ if (focusableChips.length > 0) {
2197
+ var _this$_input3;
2198
+ (_this$_input3 = this._input) == null || _this$_input3.focus();
2199
+ }
2200
+ this._emitSelectionChange();
2201
+ }
2202
+ });
2203
+
2204
+ // Focus input when clicking container background
2205
+ EventHandler.on(this._element, 'click', event => {
2206
+ if (event.target === this._element) {
2207
+ var _this$_input4;
2208
+ (_this$_input4 = this._input) == null || _this$_input4.focus();
2209
+ }
2210
+ });
2211
+ }
2212
+ _handleInputKeydown(event) {
2213
+ const {
2214
+ key
2215
+ } = event;
2216
+ switch (key) {
2217
+ case 'Enter':
2218
+ {
2219
+ event.preventDefault();
2220
+ this._createChipFromInput();
2221
+ break;
2222
+ }
2223
+ case 'Backspace':
2224
+ case 'Delete':
2225
+ {
2226
+ if (this._input.value === '') {
2227
+ event.preventDefault();
2228
+ const chips = this._getChipElements();
2229
+ if (chips.length > 0) {
2230
+ const lastChip = chips.at(-1);
2231
+ lastChip.focus();
2232
+ }
2233
+ }
2234
+ break;
2235
+ }
2236
+ case 'ArrowLeft':
2237
+ {
2238
+ if (this._input.selectionStart === 0 && this._input.selectionEnd === 0) {
2239
+ event.preventDefault();
2240
+ const chips = this._getChipElements();
2241
+ if (chips.length > 0) {
2242
+ const lastChip = chips.at(-1);
2243
+ lastChip.focus();
2244
+ }
2245
+ }
2246
+ break;
2247
+ }
2248
+ case 'Escape':
2249
+ {
2250
+ this._input.value = '';
2251
+ this._input.blur();
2252
+ break;
2253
+ }
2254
+
2255
+ // No default
2256
+ }
2257
+ }
2258
+ _handleChipRemoved(chip, value = null) {
2259
+ const chipValue = value || this._getChipValue(chip);
2260
+ const valueIndex = this._chips.indexOf(chipValue);
2261
+ if (valueIndex !== -1) {
2262
+ this._chips.splice(valueIndex, 1);
2263
+ }
2264
+ const values = this.getValues();
2265
+ this._hiddenInput.value = values.join(',');
2266
+ EventHandler.trigger(this._element, EVENT_CHANGE, {
2267
+ values
2268
+ });
2269
+ }
2270
+ _handleInput(event) {
2271
+ if (this._disabled || this._readonly) {
2272
+ return;
2273
+ }
2274
+ const {
2275
+ value
2276
+ } = event.target;
2277
+ const {
2278
+ separator
2279
+ } = this._config;
2280
+ if (separator && value.includes(separator)) {
2281
+ const parts = value.split(separator);
2282
+ for (const part of parts.slice(0, -1)) {
2283
+ this.add(part.trim());
2284
+ }
2285
+ this._input.value = parts.at(-1);
2286
+ }
2287
+ this._setInputSize();
2288
+ EventHandler.trigger(this._element, EVENT_INPUT, {
2289
+ value: this._input.value,
2290
+ relatedTarget: this._input
2291
+ });
2292
+ }
2293
+ _handlePaste(event) {
2294
+ if (this._disabled || this._readonly) {
2295
+ return;
2296
+ }
2297
+ const {
2298
+ separator
2299
+ } = this._config;
2300
+ if (!separator) {
2301
+ return;
2302
+ }
2303
+ const pastedData = (event.clipboardData || window.clipboardData).getData('text');
2304
+ if (pastedData.includes(separator)) {
2305
+ event.preventDefault();
2306
+ const parts = pastedData.split(separator);
2307
+ for (const part of parts) {
2308
+ this.add(part.trim());
2309
+ }
2310
+ }
2311
+ }
2312
+ _setInputSize() {
2313
+ if (!this._input) {
2314
+ return;
2315
+ }
2316
+ this._input.size = Math.max(this._input.placeholder.length, this._input.value.length) || 1;
2317
+ }
2318
+ }
2319
+
2320
+ /**
2321
+ * Data API implementation
2322
+ */
2323
+
2324
+ EventHandler.on(document, `DOMContentLoaded${EVENT_KEY$a}${DATA_API_KEY$7}`, () => {
2325
+ for (const element of SelectorEngine.find(SELECTOR_DATA_CHIP_INPUT)) {
2326
+ ChipInput.getOrCreateInstance(element);
2327
+ }
2328
+ });
2329
+
1510
2330
  /**
1511
2331
  * --------------------------------------------------------------------------
1512
2332
  * CoreUI collapse.js
@@ -5077,6 +5897,8 @@
5077
5897
  Alert,
5078
5898
  Button,
5079
5899
  Carousel,
5900
+ Chip,
5901
+ ChipInput,
5080
5902
  Collapse,
5081
5903
  Dropdown,
5082
5904
  Modal,