@coreui/react-pro 5.24.1 → 5.26.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 (416) hide show
  1. package/README.md +1 -1
  2. package/dist/cjs/components/card/CCardImage.js.map +1 -1
  3. package/dist/cjs/components/carousel/CCarousel.js +44 -33
  4. package/dist/cjs/components/carousel/CCarousel.js.map +1 -1
  5. package/dist/cjs/components/carousel/CCarouselItem.js +19 -28
  6. package/dist/cjs/components/carousel/CCarouselItem.js.map +1 -1
  7. package/dist/cjs/components/chip/CChip.d.ts +12 -0
  8. package/dist/cjs/components/chip/CChip.js +16 -63
  9. package/dist/cjs/components/chip/CChip.js.map +1 -1
  10. package/dist/cjs/components/chip/const.d.ts +1 -0
  11. package/dist/cjs/components/chip/const.js +8 -0
  12. package/dist/cjs/components/chip/const.js.map +1 -0
  13. package/dist/cjs/components/chip-set/CChipSet.d.ts +73 -0
  14. package/dist/cjs/components/chip-set/CChipSet.js +66 -0
  15. package/dist/cjs/components/chip-set/CChipSet.js.map +1 -0
  16. package/dist/cjs/components/chip-set/index.d.ts +2 -0
  17. package/dist/cjs/components/chip-set/useChipSet.d.ts +48 -0
  18. package/dist/cjs/components/chip-set/useChipSet.js +163 -0
  19. package/dist/cjs/components/chip-set/useChipSet.js.map +1 -0
  20. package/dist/cjs/components/chip-set/utils.d.ts +7 -0
  21. package/dist/cjs/components/chip-set/utils.js +18 -0
  22. package/dist/cjs/components/chip-set/utils.js.map +1 -0
  23. package/dist/cjs/components/collapse/CCollapse.js +14 -6
  24. package/dist/cjs/components/collapse/CCollapse.js.map +1 -1
  25. package/dist/cjs/components/conditional-portal/CConditionalPortal.js +3 -1
  26. package/dist/cjs/components/conditional-portal/CConditionalPortal.js.map +1 -1
  27. package/dist/cjs/components/date-picker/CDatePicker.d.ts +1 -1
  28. package/dist/cjs/components/date-picker/CDatePicker.js.map +1 -1
  29. package/dist/cjs/components/date-range-picker/CDateRangePicker.js +2 -0
  30. package/dist/cjs/components/date-range-picker/CDateRangePicker.js.map +1 -1
  31. package/dist/cjs/components/dropdown/CDropdown.js +23 -30
  32. package/dist/cjs/components/dropdown/CDropdown.js.map +1 -1
  33. package/dist/cjs/components/dropdown/CDropdownToggle.js.map +1 -1
  34. package/dist/cjs/components/form/CChipInput.d.ts +14 -2
  35. package/dist/cjs/components/form/CChipInput.js +77 -49
  36. package/dist/cjs/components/form/CChipInput.js.map +1 -1
  37. package/dist/cjs/components/form/CFormCheck.js.map +1 -1
  38. package/dist/cjs/components/form/CFormInput.js.map +1 -1
  39. package/dist/cjs/components/form/CFormSelect.js.map +1 -1
  40. package/dist/cjs/components/form/CFormTextarea.js.map +1 -1
  41. package/dist/cjs/components/form/CInputGroupText.js.map +1 -1
  42. package/dist/cjs/components/grid/CContainer.js +3 -1
  43. package/dist/cjs/components/grid/CContainer.js.map +1 -1
  44. package/dist/cjs/components/header/CHeaderBrand.js.map +1 -1
  45. package/dist/cjs/components/index.d.ts +2 -0
  46. package/dist/cjs/components/link/CLink.js +4 -2
  47. package/dist/cjs/components/link/CLink.js.map +1 -1
  48. package/dist/cjs/components/list-group/CListGroupItem.js.map +1 -1
  49. package/dist/cjs/components/modal/CModal.js +14 -2
  50. package/dist/cjs/components/modal/CModal.js.map +1 -1
  51. package/dist/cjs/components/multi-select/CMultiSelect.d.ts +73 -1
  52. package/dist/cjs/components/multi-select/CMultiSelect.js +157 -18
  53. package/dist/cjs/components/multi-select/CMultiSelect.js.map +1 -1
  54. package/dist/cjs/components/multi-select/CMultiSelectNativeSelect.js +1 -1
  55. package/dist/cjs/components/multi-select/CMultiSelectNativeSelect.js.map +1 -1
  56. package/dist/cjs/components/multi-select/CMultiSelectOptions.d.ts +3 -0
  57. package/dist/cjs/components/multi-select/CMultiSelectOptions.js +45 -2
  58. package/dist/cjs/components/multi-select/CMultiSelectOptions.js.map +1 -1
  59. package/dist/cjs/components/multi-select/CMultiSelectSelection.d.ts +1 -0
  60. package/dist/cjs/components/multi-select/CMultiSelectSelection.js +4 -3
  61. package/dist/cjs/components/multi-select/CMultiSelectSelection.js.map +1 -1
  62. package/dist/cjs/components/multi-select/types.d.ts +12 -0
  63. package/dist/cjs/components/multi-select/utils.js +1 -4
  64. package/dist/cjs/components/multi-select/utils.js.map +1 -1
  65. package/dist/cjs/components/nav/CNav.js.map +1 -1
  66. package/dist/cjs/components/nav/CNavGroup.d.ts +13 -6
  67. package/dist/cjs/components/nav/CNavGroup.js +86 -23
  68. package/dist/cjs/components/nav/CNavGroup.js.map +1 -1
  69. package/dist/cjs/components/nav/CNavGroupContext.d.ts +25 -0
  70. package/dist/cjs/components/nav/CNavGroupContext.js +13 -0
  71. package/dist/cjs/components/nav/CNavGroupContext.js.map +1 -0
  72. package/dist/cjs/components/nav/CNavLink.d.ts +1 -5
  73. package/dist/cjs/components/nav/CNavLink.js +21 -8
  74. package/dist/cjs/components/nav/CNavLink.js.map +1 -1
  75. package/dist/cjs/components/one-time-password-input/COneTimePassword.js +3 -3
  76. package/dist/cjs/components/one-time-password-input/COneTimePassword.js.map +1 -1
  77. package/dist/cjs/components/popover/CPopover.js +69 -24
  78. package/dist/cjs/components/popover/CPopover.js.map +1 -1
  79. package/dist/cjs/components/progress/CProgress.js.map +1 -1
  80. package/dist/cjs/components/rating/CRating.d.ts +1 -1
  81. package/dist/cjs/components/rating/CRating.js.map +1 -1
  82. package/dist/cjs/components/search-button/CSearchButton.d.ts +32 -0
  83. package/dist/cjs/components/search-button/CSearchButton.js +77 -0
  84. package/dist/cjs/components/search-button/CSearchButton.js.map +1 -0
  85. package/dist/cjs/components/search-button/index.d.ts +2 -0
  86. package/dist/cjs/components/search-button/types.d.ts +10 -0
  87. package/dist/cjs/components/search-button/utils.d.ts +11 -0
  88. package/dist/cjs/components/search-button/utils.js +115 -0
  89. package/dist/cjs/components/search-button/utils.js.map +1 -0
  90. package/dist/cjs/components/sidebar/CSidebar.js +40 -23
  91. package/dist/cjs/components/sidebar/CSidebar.js.map +1 -1
  92. package/dist/cjs/components/sidebar/CSidebarNav.d.ts +12 -0
  93. package/dist/cjs/components/sidebar/CSidebarNav.js +12 -36
  94. package/dist/cjs/components/sidebar/CSidebarNav.js.map +1 -1
  95. package/dist/cjs/components/smart-table/CSmartTable.js +2 -2
  96. package/dist/cjs/components/smart-table/CSmartTable.js.map +1 -1
  97. package/dist/cjs/components/smart-table/CSmartTableInterface.d.ts +2 -2
  98. package/dist/cjs/components/table/CTableDataCell.js.map +1 -1
  99. package/dist/cjs/components/table/types.d.ts +2 -1
  100. package/dist/cjs/components/table/utils.js +4 -4
  101. package/dist/cjs/components/table/utils.js.map +1 -1
  102. package/dist/cjs/components/tabs/CTabPanel.js +3 -1
  103. package/dist/cjs/components/tabs/CTabPanel.js.map +1 -1
  104. package/dist/cjs/components/time-picker/CTimePicker.d.ts +1 -1
  105. package/dist/cjs/components/time-picker/CTimePicker.js +1 -1
  106. package/dist/cjs/components/time-picker/CTimePicker.js.map +1 -1
  107. package/dist/cjs/components/tooltip/CTooltip.js +69 -24
  108. package/dist/cjs/components/tooltip/CTooltip.js.map +1 -1
  109. package/dist/cjs/components/virtual-scroller/CVirtualScroller.js +11 -8
  110. package/dist/cjs/components/virtual-scroller/CVirtualScroller.js.map +1 -1
  111. package/dist/cjs/helpers/polymorphicComponent.d.ts +1 -2
  112. package/dist/cjs/hooks/useDebouncedCallback.d.ts +1 -1
  113. package/dist/cjs/hooks/useDebouncedCallback.js +1 -1
  114. package/dist/cjs/hooks/useDebouncedCallback.js.map +1 -1
  115. package/dist/cjs/hooks/useForkedRef.d.ts +1 -1
  116. package/dist/cjs/hooks/useForkedRef.js +6 -3
  117. package/dist/cjs/hooks/useForkedRef.js.map +1 -1
  118. package/dist/cjs/hooks/usePopper.js +8 -6
  119. package/dist/cjs/hooks/usePopper.js.map +1 -1
  120. package/dist/cjs/index.js +4 -0
  121. package/dist/cjs/index.js.map +1 -1
  122. package/dist/cjs/node_modules/@babel/runtime/helpers/esm/objectWithoutPropertiesLoose.js +1 -1
  123. package/dist/cjs/node_modules/@babel/runtime/helpers/esm/objectWithoutPropertiesLoose.js.map +1 -1
  124. package/dist/cjs/node_modules/@coreui/icons/dist/esm/free/cil-arrow-bottom.js +1 -1
  125. package/dist/cjs/node_modules/@coreui/icons/dist/esm/free/cil-arrow-bottom.js.map +1 -1
  126. package/dist/cjs/node_modules/@coreui/icons/dist/esm/free/cil-arrow-top.js +1 -1
  127. package/dist/cjs/node_modules/@coreui/icons/dist/esm/free/cil-arrow-top.js.map +1 -1
  128. package/dist/cjs/node_modules/@coreui/icons/dist/esm/free/cil-filter-x.js +1 -1
  129. package/dist/cjs/node_modules/@coreui/icons/dist/esm/free/cil-filter-x.js.map +1 -1
  130. package/dist/cjs/node_modules/@coreui/icons/dist/esm/free/cil-swap-vertical.js +1 -1
  131. package/dist/cjs/node_modules/@coreui/icons/dist/esm/free/cil-swap-vertical.js.map +1 -1
  132. package/dist/cjs/node_modules/ua-parser-js/dist/ua-parser.min.js +4 -4
  133. package/dist/cjs/node_modules/ua-parser-js/dist/ua-parser.min.js.map +1 -1
  134. package/dist/cjs/utils/executeAfterTransition.js.map +1 -1
  135. package/dist/cjs/utils/index.d.ts +2 -1
  136. package/dist/cjs/utils/swipe.d.ts +26 -0
  137. package/dist/cjs/utils/swipe.js +94 -0
  138. package/dist/cjs/utils/swipe.js.map +1 -0
  139. package/dist/esm/components/card/CCardImage.js.map +1 -1
  140. package/dist/esm/components/carousel/CCarousel.js +44 -33
  141. package/dist/esm/components/carousel/CCarousel.js.map +1 -1
  142. package/dist/esm/components/carousel/CCarouselItem.js +19 -28
  143. package/dist/esm/components/carousel/CCarouselItem.js.map +1 -1
  144. package/dist/esm/components/chip/CChip.d.ts +12 -0
  145. package/dist/esm/components/chip/CChip.js +16 -63
  146. package/dist/esm/components/chip/CChip.js.map +1 -1
  147. package/dist/esm/components/chip/const.d.ts +1 -0
  148. package/dist/esm/components/chip/const.js +6 -0
  149. package/dist/esm/components/chip/const.js.map +1 -0
  150. package/dist/esm/components/chip-set/CChipSet.d.ts +73 -0
  151. package/dist/esm/components/chip-set/CChipSet.js +64 -0
  152. package/dist/esm/components/chip-set/CChipSet.js.map +1 -0
  153. package/dist/esm/components/chip-set/index.d.ts +2 -0
  154. package/dist/esm/components/chip-set/useChipSet.d.ts +48 -0
  155. package/dist/esm/components/chip-set/useChipSet.js +161 -0
  156. package/dist/esm/components/chip-set/useChipSet.js.map +1 -0
  157. package/dist/esm/components/chip-set/utils.d.ts +7 -0
  158. package/dist/esm/components/chip-set/utils.js +16 -0
  159. package/dist/esm/components/chip-set/utils.js.map +1 -0
  160. package/dist/esm/components/collapse/CCollapse.js +14 -6
  161. package/dist/esm/components/collapse/CCollapse.js.map +1 -1
  162. package/dist/esm/components/conditional-portal/CConditionalPortal.js +3 -1
  163. package/dist/esm/components/conditional-portal/CConditionalPortal.js.map +1 -1
  164. package/dist/esm/components/date-picker/CDatePicker.d.ts +1 -1
  165. package/dist/esm/components/date-picker/CDatePicker.js.map +1 -1
  166. package/dist/esm/components/date-range-picker/CDateRangePicker.js +2 -0
  167. package/dist/esm/components/date-range-picker/CDateRangePicker.js.map +1 -1
  168. package/dist/esm/components/dropdown/CDropdown.js +23 -30
  169. package/dist/esm/components/dropdown/CDropdown.js.map +1 -1
  170. package/dist/esm/components/dropdown/CDropdownToggle.js.map +1 -1
  171. package/dist/esm/components/form/CChipInput.d.ts +14 -2
  172. package/dist/esm/components/form/CChipInput.js +78 -50
  173. package/dist/esm/components/form/CChipInput.js.map +1 -1
  174. package/dist/esm/components/form/CFormCheck.js.map +1 -1
  175. package/dist/esm/components/form/CFormInput.js.map +1 -1
  176. package/dist/esm/components/form/CFormSelect.js.map +1 -1
  177. package/dist/esm/components/form/CFormTextarea.js.map +1 -1
  178. package/dist/esm/components/form/CInputGroupText.js.map +1 -1
  179. package/dist/esm/components/grid/CContainer.js +3 -1
  180. package/dist/esm/components/grid/CContainer.js.map +1 -1
  181. package/dist/esm/components/header/CHeaderBrand.js.map +1 -1
  182. package/dist/esm/components/index.d.ts +2 -0
  183. package/dist/esm/components/link/CLink.js +4 -2
  184. package/dist/esm/components/link/CLink.js.map +1 -1
  185. package/dist/esm/components/list-group/CListGroupItem.js.map +1 -1
  186. package/dist/esm/components/modal/CModal.js +14 -2
  187. package/dist/esm/components/modal/CModal.js.map +1 -1
  188. package/dist/esm/components/multi-select/CMultiSelect.d.ts +73 -1
  189. package/dist/esm/components/multi-select/CMultiSelect.js +158 -19
  190. package/dist/esm/components/multi-select/CMultiSelect.js.map +1 -1
  191. package/dist/esm/components/multi-select/CMultiSelectNativeSelect.js +1 -1
  192. package/dist/esm/components/multi-select/CMultiSelectNativeSelect.js.map +1 -1
  193. package/dist/esm/components/multi-select/CMultiSelectOptions.d.ts +3 -0
  194. package/dist/esm/components/multi-select/CMultiSelectOptions.js +45 -2
  195. package/dist/esm/components/multi-select/CMultiSelectOptions.js.map +1 -1
  196. package/dist/esm/components/multi-select/CMultiSelectSelection.d.ts +1 -0
  197. package/dist/esm/components/multi-select/CMultiSelectSelection.js +4 -3
  198. package/dist/esm/components/multi-select/CMultiSelectSelection.js.map +1 -1
  199. package/dist/esm/components/multi-select/types.d.ts +12 -0
  200. package/dist/esm/components/multi-select/utils.js +1 -4
  201. package/dist/esm/components/multi-select/utils.js.map +1 -1
  202. package/dist/esm/components/nav/CNav.js.map +1 -1
  203. package/dist/esm/components/nav/CNavGroup.d.ts +13 -6
  204. package/dist/esm/components/nav/CNavGroup.js +87 -24
  205. package/dist/esm/components/nav/CNavGroup.js.map +1 -1
  206. package/dist/esm/components/nav/CNavGroupContext.d.ts +25 -0
  207. package/dist/esm/components/nav/CNavGroupContext.js +11 -0
  208. package/dist/esm/components/nav/CNavGroupContext.js.map +1 -0
  209. package/dist/esm/components/nav/CNavLink.d.ts +1 -5
  210. package/dist/esm/components/nav/CNavLink.js +21 -8
  211. package/dist/esm/components/nav/CNavLink.js.map +1 -1
  212. package/dist/esm/components/one-time-password-input/COneTimePassword.js +3 -3
  213. package/dist/esm/components/one-time-password-input/COneTimePassword.js.map +1 -1
  214. package/dist/esm/components/popover/CPopover.js +69 -24
  215. package/dist/esm/components/popover/CPopover.js.map +1 -1
  216. package/dist/esm/components/progress/CProgress.js.map +1 -1
  217. package/dist/esm/components/rating/CRating.d.ts +1 -1
  218. package/dist/esm/components/rating/CRating.js.map +1 -1
  219. package/dist/esm/components/search-button/CSearchButton.d.ts +32 -0
  220. package/dist/esm/components/search-button/CSearchButton.js +75 -0
  221. package/dist/esm/components/search-button/CSearchButton.js.map +1 -0
  222. package/dist/esm/components/search-button/index.d.ts +2 -0
  223. package/dist/esm/components/search-button/types.d.ts +10 -0
  224. package/dist/esm/components/search-button/utils.d.ts +11 -0
  225. package/dist/esm/components/search-button/utils.js +104 -0
  226. package/dist/esm/components/search-button/utils.js.map +1 -0
  227. package/dist/esm/components/sidebar/CSidebar.js +40 -23
  228. package/dist/esm/components/sidebar/CSidebar.js.map +1 -1
  229. package/dist/esm/components/sidebar/CSidebarNav.d.ts +12 -0
  230. package/dist/esm/components/sidebar/CSidebarNav.js +13 -37
  231. package/dist/esm/components/sidebar/CSidebarNav.js.map +1 -1
  232. package/dist/esm/components/smart-table/CSmartTable.js +2 -2
  233. package/dist/esm/components/smart-table/CSmartTable.js.map +1 -1
  234. package/dist/esm/components/smart-table/CSmartTableInterface.d.ts +2 -2
  235. package/dist/esm/components/table/CTableDataCell.js.map +1 -1
  236. package/dist/esm/components/table/types.d.ts +2 -1
  237. package/dist/esm/components/table/utils.js +4 -4
  238. package/dist/esm/components/table/utils.js.map +1 -1
  239. package/dist/esm/components/tabs/CTabPanel.js +3 -1
  240. package/dist/esm/components/tabs/CTabPanel.js.map +1 -1
  241. package/dist/esm/components/time-picker/CTimePicker.d.ts +1 -1
  242. package/dist/esm/components/time-picker/CTimePicker.js +1 -1
  243. package/dist/esm/components/time-picker/CTimePicker.js.map +1 -1
  244. package/dist/esm/components/tooltip/CTooltip.js +69 -24
  245. package/dist/esm/components/tooltip/CTooltip.js.map +1 -1
  246. package/dist/esm/components/virtual-scroller/CVirtualScroller.js +11 -8
  247. package/dist/esm/components/virtual-scroller/CVirtualScroller.js.map +1 -1
  248. package/dist/esm/helpers/polymorphicComponent.d.ts +1 -2
  249. package/dist/esm/hooks/useDebouncedCallback.d.ts +1 -1
  250. package/dist/esm/hooks/useDebouncedCallback.js +1 -1
  251. package/dist/esm/hooks/useDebouncedCallback.js.map +1 -1
  252. package/dist/esm/hooks/useForkedRef.d.ts +1 -1
  253. package/dist/esm/hooks/useForkedRef.js +6 -3
  254. package/dist/esm/hooks/useForkedRef.js.map +1 -1
  255. package/dist/esm/hooks/usePopper.js +9 -7
  256. package/dist/esm/hooks/usePopper.js.map +1 -1
  257. package/dist/esm/index.js +2 -0
  258. package/dist/esm/index.js.map +1 -1
  259. package/dist/esm/node_modules/@babel/runtime/helpers/esm/objectWithoutPropertiesLoose.js +1 -1
  260. package/dist/esm/node_modules/@babel/runtime/helpers/esm/objectWithoutPropertiesLoose.js.map +1 -1
  261. package/dist/esm/node_modules/@coreui/icons/dist/esm/free/cil-arrow-bottom.js +1 -1
  262. package/dist/esm/node_modules/@coreui/icons/dist/esm/free/cil-arrow-bottom.js.map +1 -1
  263. package/dist/esm/node_modules/@coreui/icons/dist/esm/free/cil-arrow-top.js +1 -1
  264. package/dist/esm/node_modules/@coreui/icons/dist/esm/free/cil-arrow-top.js.map +1 -1
  265. package/dist/esm/node_modules/@coreui/icons/dist/esm/free/cil-filter-x.js +1 -1
  266. package/dist/esm/node_modules/@coreui/icons/dist/esm/free/cil-filter-x.js.map +1 -1
  267. package/dist/esm/node_modules/@coreui/icons/dist/esm/free/cil-swap-vertical.js +1 -1
  268. package/dist/esm/node_modules/@coreui/icons/dist/esm/free/cil-swap-vertical.js.map +1 -1
  269. package/dist/esm/node_modules/ua-parser-js/dist/ua-parser.min.js +4 -4
  270. package/dist/esm/node_modules/ua-parser-js/dist/ua-parser.min.js.map +1 -1
  271. package/dist/esm/utils/executeAfterTransition.js.map +1 -1
  272. package/dist/esm/utils/index.d.ts +2 -1
  273. package/dist/esm/utils/swipe.d.ts +26 -0
  274. package/dist/esm/utils/swipe.js +90 -0
  275. package/dist/esm/utils/swipe.js.map +1 -0
  276. package/package.json +8 -6
  277. package/src/components/autocomplete/CAutocompleteOptions.tsx +1 -1
  278. package/src/components/autocomplete/__tests__/CAutocomplete.spec.tsx +18 -16
  279. package/src/components/autocomplete/__tests__/CAutocompleteOptions.spec.tsx +37 -28
  280. package/src/components/autocomplete/__tests__/__snapshots__/CAutocomplete.spec.tsx.snap +129 -0
  281. package/src/components/autocomplete/__tests__/__snapshots__/CAutocompleteOptions.spec.tsx.snap +36 -0
  282. package/src/components/calendar/__tests__/CCalendar.spec.tsx +40 -45
  283. package/src/components/calendar/__tests__/__snapshots__/CCalendar.spec.tsx.snap +99 -75
  284. package/src/components/calendar/__tests__/utils.spec.tsx +8 -18
  285. package/src/components/card/CCardImage.tsx +3 -2
  286. package/src/components/carousel/CCarousel.tsx +48 -51
  287. package/src/components/carousel/CCarouselContext.ts +1 -1
  288. package/src/components/carousel/CCarouselItem.tsx +25 -26
  289. package/src/components/carousel/__tests__/CCarousel.spec.tsx +47 -4
  290. package/src/components/carousel/__tests__/CCarouselItem.spec.tsx +37 -0
  291. package/src/components/chip/CChip.tsx +45 -78
  292. package/src/components/chip/__tests__/CChip.spec.tsx +26 -19
  293. package/src/components/chip/const.ts +3 -0
  294. package/src/components/chip-set/CChipSet.tsx +183 -0
  295. package/src/components/chip-set/__tests__/CChipSet.spec.tsx +215 -0
  296. package/src/components/chip-set/__tests__/__snapshots__/CChipSet.spec.tsx.snap +22 -0
  297. package/src/components/chip-set/index.ts +3 -0
  298. package/src/components/chip-set/useChipSet.ts +243 -0
  299. package/src/components/chip-set/utils.ts +19 -0
  300. package/src/components/collapse/CCollapse.tsx +18 -6
  301. package/src/components/conditional-portal/CConditionalPortal.tsx +4 -2
  302. package/src/components/date-picker/CDatePicker.tsx +12 -13
  303. package/src/components/date-picker/__tests__/CDatePicker.spec.tsx +1 -1
  304. package/src/components/date-picker/__tests__/__snapshots__/CDatePicker.spec.tsx.snap +12 -640
  305. package/src/components/date-range-picker/CDateRangePicker.tsx +2 -0
  306. package/src/components/date-range-picker/__tests__/CDateRangePicker.spec.tsx +1 -1
  307. package/src/components/date-range-picker/__tests__/__snapshots__/CDateRangePicker.spec.tsx.snap +21 -1259
  308. package/src/components/dropdown/CDropdown.tsx +29 -34
  309. package/src/components/dropdown/CDropdownToggle.tsx +1 -1
  310. package/src/components/dropdown/__tests__/CDropdown.spec.tsx +56 -1
  311. package/src/components/dropdown/__tests__/__snapshots__/CDropdown.spec.tsx.snap +2 -2
  312. package/src/components/dropdown/__tests__/__snapshots__/CDropdownMenu.spec.tsx.snap +1 -1
  313. package/src/components/focus-trap/__tests__/CFocusTrap.spec.tsx +1 -1
  314. package/src/components/form/CChipInput.tsx +105 -67
  315. package/src/components/form/CFormCheck.tsx +1 -2
  316. package/src/components/form/CFormInput.tsx +1 -2
  317. package/src/components/form/CFormSelect.tsx +1 -2
  318. package/src/components/form/CFormTextarea.tsx +1 -2
  319. package/src/components/form/CInputGroupText.tsx +3 -2
  320. package/src/components/form/__tests__/CChipInput.spec.tsx +67 -1
  321. package/src/components/form/__tests__/CFormInput.spec.tsx +17 -20
  322. package/src/components/form/__tests__/__snapshots__/CChipInput.spec.tsx.snap +7 -0
  323. package/src/components/form/__tests__/__snapshots__/CFormInput.spec.tsx.snap +12 -3
  324. package/src/components/grid/CContainer.tsx +3 -1
  325. package/src/components/header/CHeaderBrand.tsx +3 -2
  326. package/src/components/index.ts +2 -0
  327. package/src/components/link/CLink.tsx +7 -4
  328. package/src/components/list-group/CListGroupItem.tsx +3 -2
  329. package/src/components/loading-button/__tests__/CLoadingButton.spec.tsx +1 -1
  330. package/src/components/loading-button/__tests__/__snapshots__/CLoadingButton.spec.tsx.snap +4 -4
  331. package/src/components/modal/CModal.tsx +19 -2
  332. package/src/components/modal/__tests__/CModal.spec.tsx +43 -0
  333. package/src/components/multi-select/CMultiSelect.tsx +341 -46
  334. package/src/components/multi-select/CMultiSelectNativeSelect.tsx +1 -1
  335. package/src/components/multi-select/CMultiSelectOptions.tsx +74 -3
  336. package/src/components/multi-select/CMultiSelectSelection.tsx +5 -1
  337. package/src/components/multi-select/__tests__/CMultiSelect.spec.tsx +27 -69
  338. package/src/components/multi-select/__tests__/CMultiSelectNativeSelect.spec.tsx +4 -5
  339. package/src/components/multi-select/__tests__/CMultiSelectOptions.spec.tsx +4 -4
  340. package/src/components/multi-select/__tests__/CMultiSelectSelection.spec.tsx +7 -24
  341. package/src/components/multi-select/__tests__/__snapshots__/CMultiSelect.spec.tsx.snap +108 -61
  342. package/src/components/multi-select/__tests__/__snapshots__/CMultiSelectNativeSelect.spec.tsx.snap +2 -4
  343. package/src/components/multi-select/__tests__/__snapshots__/CMultiSelectOptions.spec.tsx.snap +7 -0
  344. package/src/components/multi-select/__tests__/__snapshots__/CMultiSelectSelection.spec.tsx.snap +16 -9
  345. package/src/components/multi-select/types.ts +14 -0
  346. package/src/components/nav/CNav.tsx +3 -2
  347. package/src/components/nav/CNavGroup.tsx +196 -105
  348. package/src/components/nav/CNavGroupContext.ts +27 -0
  349. package/src/components/nav/CNavLink.tsx +26 -12
  350. package/src/components/nav/__tests__/CNavGroup.spec.tsx +207 -4
  351. package/src/components/nav/__tests__/__snapshots__/CNavGroup.spec.tsx.snap +3 -1
  352. package/src/components/offcanvas/__tests__/COffcanvas.spec.tsx +1 -0
  353. package/src/components/one-time-password-input/COneTimePassword.tsx +10 -11
  354. package/src/components/picker/__tests__/CPicker.spec.tsx +1 -1
  355. package/src/components/picker/__tests__/__snapshots__/CPicker.spec.tsx.snap +2 -16
  356. package/src/components/popover/CPopover.tsx +71 -26
  357. package/src/components/popover/__tests__/CPopover.spec.tsx +85 -4
  358. package/src/components/progress/CProgress.tsx +1 -2
  359. package/src/components/rating/CRating.tsx +1 -0
  360. package/src/components/search-button/CSearchButton.tsx +195 -0
  361. package/src/components/search-button/__tests__/CSearchButton.spec.tsx +95 -0
  362. package/src/components/search-button/__tests__/__snapshots__/CSearchButton.spec.tsx.snap +87 -0
  363. package/src/components/search-button/index.ts +3 -0
  364. package/src/components/search-button/types.ts +10 -0
  365. package/src/components/search-button/utils.ts +140 -0
  366. package/src/components/sidebar/CSidebar.tsx +51 -26
  367. package/src/components/sidebar/CSidebarNav.tsx +39 -53
  368. package/src/components/sidebar/__tests__/CSidebar.spec.tsx +26 -0
  369. package/src/components/smart-table/CSmartTable.tsx +5 -4
  370. package/src/components/smart-table/CSmartTableInterface.tsx +2 -2
  371. package/src/components/smart-table/__tests__/CSmartTable.spec.tsx +3 -2
  372. package/src/components/smart-table/__tests__/__snapshots__/CSmartTable.spec.tsx.snap +7 -15
  373. package/src/components/stepper/__tests__/CStepper.spec.tsx +24 -21
  374. package/src/components/stepper/__tests__/__snapshots__/CStepper.spec.tsx.snap +295 -0
  375. package/src/components/table/CTableDataCell.tsx +2 -1
  376. package/src/components/table/types.ts +3 -1
  377. package/src/components/table/utils.ts +4 -4
  378. package/src/components/tabs/CTabPanel.tsx +3 -1
  379. package/src/components/tabs/CTabsContext.ts +1 -1
  380. package/src/components/tabs/__tests__/CTabContent.spec.tsx +1 -0
  381. package/src/components/tabs/__tests__/CTabPane.spec.tsx +1 -0
  382. package/src/components/time-picker/CTimePicker.tsx +6 -7
  383. package/src/components/time-picker/__tests__/CTimePicker.spec.tsx +10 -1
  384. package/src/components/time-picker/__tests__/__snapshots__/CTimePicker.spec.tsx.snap +599 -315
  385. package/src/components/tooltip/CTooltip.tsx +72 -27
  386. package/src/components/tooltip/__tests__/CTooltip.spec.tsx +102 -1
  387. package/src/components/virtual-scroller/CVirtualScroller.tsx +13 -14
  388. package/src/helpers/polymorphicComponent.ts +1 -1
  389. package/src/hooks/useColorModes.ts +2 -2
  390. package/src/hooks/useDebouncedCallback.ts +7 -4
  391. package/src/hooks/useForkedRef.ts +20 -15
  392. package/src/hooks/usePopper.ts +13 -9
  393. package/src/utils/__tests__/swipe.spec.ts +82 -0
  394. package/src/utils/executeAfterTransition.ts +1 -1
  395. package/src/utils/index.ts +2 -0
  396. package/src/utils/mergeClassNames.ts +1 -1
  397. package/src/utils/swipe.ts +114 -0
  398. package/dist/cjs/components/accordion/CAccordionCollapse.d.ts +0 -3
  399. package/dist/cjs/components/sidebar/CSidebarNavContext.d.ts +0 -5
  400. package/dist/cjs/components/sidebar/CSidebarNavContext.js +0 -8
  401. package/dist/cjs/components/sidebar/CSidebarNavContext.js.map +0 -1
  402. package/dist/esm/components/accordion/CAccordionCollapse.d.ts +0 -3
  403. package/dist/esm/components/sidebar/CSidebarNavContext.d.ts +0 -5
  404. package/dist/esm/components/sidebar/CSidebarNavContext.js +0 -6
  405. package/dist/esm/components/sidebar/CSidebarNavContext.js.map +0 -1
  406. package/src/components/accordion/CAccordionCollapse.tsx +0 -20
  407. package/src/components/accordion/__tests__/CAccordionCollapse.spec.tsx +0 -10
  408. package/src/components/accordion/__tests__/__snapshots__/CAccordionCollapse.spec.tsx.snap +0 -11
  409. package/src/components/button/__tests__/__snapshots__/CButtonClose.spec.tsx.snap +0 -26
  410. package/src/components/calendar/__tests__/CCalendar.accessibility.spec.tsx +0 -595
  411. package/src/components/calendar/__tests__/CCalendar.comprehensive.spec.tsx +0 -402
  412. package/src/components/calendar/__tests__/CCalendar.edge-cases.spec.tsx +0 -416
  413. package/src/components/calendar/__tests__/CCalendar.interactions.spec.tsx +0 -593
  414. package/src/components/header/CHeaderBrand.tsx~HEAD +0 -36
  415. package/src/components/sidebar/CSidebarNavContext.ts +0 -8
  416. /package/src/components/calendar/__tests__/{test-setup.ts → setup.ts} +0 -0
@@ -226,7 +226,7 @@ export const CDropdown: PolymorphicRefForwardingComponent<'div', CDropdownProps>
226
226
  popperConfig,
227
227
  portal = false,
228
228
  reference = 'toggle',
229
- variant = 'btn-group',
229
+ variant = 'dropdown',
230
230
  visible = false,
231
231
  ...rest
232
232
  },
@@ -271,18 +271,14 @@ export const CDropdown: PolymorphicRefForwardingComponent<'div', CDropdownProps>
271
271
  useEffect(() => {
272
272
  if (visible) {
273
273
  handleShow()
274
- } else {
274
+ } else if (_visible) {
275
275
  handleHide()
276
276
  }
277
277
  }, [visible])
278
278
 
279
279
  useEffect(() => {
280
- return () => {
281
- if (_visible) {
282
- handleHide()
283
- }
284
- }
285
- }, [])
280
+ return () => destroyPopper()
281
+ }, [destroyPopper])
286
282
 
287
283
  useEffect(() => {
288
284
  const referenceElement = getReferenceElement(reference, dropdownToggleElement, dropdownRef)
@@ -302,21 +298,12 @@ export const CDropdown: PolymorphicRefForwardingComponent<'div', CDropdownProps>
302
298
  const handleHide = useCallback(() => {
303
299
  setVisible(false)
304
300
 
305
- const menuElement = dropdownMenuRef.current
306
- const toggleElement = dropdownToggleElement
307
-
308
301
  if (allowPopperUse) {
309
302
  destroyPopper()
310
303
  }
311
304
 
312
- menuElement?.removeEventListener('keydown', handleKeydown)
313
- toggleElement?.removeEventListener('keydown', handleKeydown)
314
-
315
- window.removeEventListener('click', handleClick)
316
- window.removeEventListener('keyup', handleKeyup)
317
-
318
305
  onHide?.()
319
- }, [allowPopperUse, dropdownToggleElement, destroyPopper, onHide])
306
+ }, [allowPopperUse, destroyPopper, onHide])
320
307
 
321
308
  const handleKeydown = useCallback((event: KeyboardEvent) => {
322
309
  if (!dropdownMenuRef.current) {
@@ -399,11 +386,6 @@ export const CDropdown: PolymorphicRefForwardingComponent<'div', CDropdownProps>
399
386
  }
400
387
 
401
388
  toggleElement.focus()
402
- toggleElement.addEventListener('keydown', handleKeydown)
403
- menuElement.addEventListener('keydown', handleKeydown)
404
-
405
- window.addEventListener('click', handleClick)
406
- window.addEventListener('keyup', handleKeyup)
407
389
 
408
390
  if (event && (event.key === 'ArrowDown' || event.key === 'ArrowUp')) {
409
391
  setPendingKeyDownEvent(event)
@@ -412,19 +394,32 @@ export const CDropdown: PolymorphicRefForwardingComponent<'div', CDropdownProps>
412
394
  onShow?.()
413
395
  }
414
396
  },
415
- [
416
- allowPopperUse,
417
- computedPopperConfig,
418
- dropdownToggleElement,
419
- reference,
420
- handleClick,
421
- handleKeydown,
422
- handleKeyup,
423
- initPopper,
424
- onShow,
425
- ]
397
+ [allowPopperUse, computedPopperConfig, dropdownToggleElement, reference, initPopper, onShow]
426
398
  )
427
399
 
400
+ useEffect(() => {
401
+ if (!_visible) {
402
+ return
403
+ }
404
+
405
+ const menuElement = dropdownMenuRef.current
406
+ const toggleElement = dropdownToggleElement
407
+
408
+ toggleElement?.addEventListener('keydown', handleKeydown)
409
+ menuElement?.addEventListener('keydown', handleKeydown)
410
+
411
+ window.addEventListener('click', handleClick)
412
+ window.addEventListener('keyup', handleKeyup)
413
+
414
+ return () => {
415
+ toggleElement?.removeEventListener('keydown', handleKeydown)
416
+ menuElement?.removeEventListener('keydown', handleKeydown)
417
+
418
+ window.removeEventListener('click', handleClick)
419
+ window.removeEventListener('keyup', handleKeyup)
420
+ }
421
+ }, [_visible, dropdownToggleElement, handleClick, handleKeydown, handleKeyup])
422
+
428
423
  const contextValues = useMemo(
429
424
  () => ({
430
425
  alignment,
@@ -106,7 +106,7 @@ export const CDropdownToggle: FC<CDropdownToggleProps> = ({
106
106
  if (custom && React.isValidElement(children)) {
107
107
  return (
108
108
  <>
109
- {React.cloneElement(children as React.ReactElement<any>, {
109
+ {React.cloneElement(children as React.ReactElement<Record<string, unknown>>, {
110
110
  'aria-expanded': visible,
111
111
  ...(!rest.disabled && { ...triggers }),
112
112
  ref: dropdownToggleRef,
@@ -1,6 +1,7 @@
1
1
  import * as React from 'react'
2
2
  import { render, screen, fireEvent, waitFor } from '@testing-library/react'
3
3
  import '@testing-library/jest-dom'
4
+ import { createPopper } from '@popperjs/core'
4
5
  import {
5
6
  CDropdown,
6
7
  CDropdownToggle,
@@ -11,6 +12,14 @@ import {
11
12
  CDropdownDivider,
12
13
  } from '../index'
13
14
 
15
+ jest.mock('@popperjs/core', () => {
16
+ const actual = jest.requireActual('@popperjs/core')
17
+ return {
18
+ ...actual,
19
+ createPopper: jest.fn(actual.createPopper),
20
+ }
21
+ })
22
+
14
23
  test('loads and displays CDropdown component', async () => {
15
24
  const { container } = render(<CDropdown>Test</CDropdown>)
16
25
  expect(container).toMatchSnapshot()
@@ -89,7 +98,7 @@ test('CDropdown opens on toggle click and closes on clicking outside', async ()
89
98
 
90
99
  // Click outside the dropdown to close it
91
100
  const externalArea = screen.getByTestId('external-area')
92
- fireEvent.mouseUp(externalArea)
101
+ fireEvent.click(externalArea)
93
102
 
94
103
  // Wait for the dropdown menu to be hidden
95
104
  await waitFor(() => {
@@ -98,6 +107,52 @@ test('CDropdown opens on toggle click and closes on clicking outside', async ()
98
107
  })
99
108
  })
100
109
 
110
+ test('CDropdown keeps absolute positioning attached to a replaced toggler', async () => {
111
+ const createPopperMock = createPopper as jest.Mock
112
+ createPopperMock.mockClear()
113
+
114
+ const DropdownApp = ({ togglerKey }: { togglerKey: string }) => (
115
+ <CDropdown>
116
+ <CDropdownToggle key={togglerKey} data-testid={`toggler-${togglerKey}`}>
117
+ Toggle
118
+ </CDropdownToggle>
119
+ <CDropdownMenu>
120
+ <CDropdownItem>A</CDropdownItem>
121
+ </CDropdownMenu>
122
+ </CDropdown>
123
+ )
124
+
125
+ const { rerender } = render(<DropdownApp togglerKey="first" />)
126
+
127
+ fireEvent.click(screen.getByTestId('toggler-first'))
128
+
129
+ const menu = screen.getByRole('menu')
130
+ await waitFor(() => {
131
+ expect(menu).toHaveStyle('position: absolute')
132
+ expect(menu).toHaveAttribute('data-popper-placement', 'bottom-start')
133
+ })
134
+
135
+ expect(createPopperMock).toHaveBeenCalledTimes(1)
136
+ expect(createPopperMock.mock.calls[0][0]).toBe(screen.getByTestId('toggler-first'))
137
+
138
+ const firstPopper = createPopperMock.mock.results[0].value
139
+ const destroySpy = jest.spyOn(firstPopper, 'destroy')
140
+
141
+ rerender(<DropdownApp togglerKey="second" />)
142
+
143
+ await waitFor(() => {
144
+ expect(createPopperMock).toHaveBeenCalledTimes(2)
145
+ })
146
+
147
+ expect(destroySpy).toHaveBeenCalledTimes(1)
148
+ expect(createPopperMock.mock.calls[1][0]).toBe(screen.getByTestId('toggler-second'))
149
+
150
+ await waitFor(() => {
151
+ expect(menu).toHaveStyle('position: absolute')
152
+ expect(menu).toHaveAttribute('data-popper-placement', 'bottom-start')
153
+ })
154
+ })
155
+
101
156
  test('CDropdown example', async () => {
102
157
  jest.useFakeTimers()
103
158
  const { container } = render(
@@ -13,7 +13,7 @@ exports[`CDropdown customize 1`] = `
13
13
  exports[`CDropdown example 1`] = `
14
14
  <div>
15
15
  <div
16
- class="btn-group"
16
+ class="dropdown"
17
17
  >
18
18
  <button
19
19
  aria-expanded="false"
@@ -68,7 +68,7 @@ exports[`CDropdown example 1`] = `
68
68
  exports[`loads and displays CDropdown component 1`] = `
69
69
  <div>
70
70
  <div
71
- class="btn-group"
71
+ class="dropdown"
72
72
  >
73
73
  Test
74
74
  </div>
@@ -3,7 +3,7 @@
3
3
  exports[`CDropdownMenu customize 1`] = `
4
4
  <div>
5
5
  <div
6
- class="btn-group"
6
+ class="dropdown"
7
7
  >
8
8
  <div
9
9
  class="dropdown-menu show bazinga"
@@ -6,7 +6,7 @@ import { CFocusTrap } from '../CFocusTrap'
6
6
  // Helper function to create a test component with focusable elements
7
7
  interface TestComponentProps {
8
8
  children?: React.ReactNode
9
- [key: string]: any
9
+ [key: string]: unknown
10
10
  }
11
11
 
12
12
  const TestComponent = ({ children, ...props }: TestComponentProps) => (
@@ -5,7 +5,8 @@ import React, {
5
5
  KeyboardEvent,
6
6
  ReactNode,
7
7
  forwardRef,
8
- useEffect,
8
+ isValidElement,
9
+ useId,
9
10
  useMemo,
10
11
  useRef,
11
12
  useState,
@@ -13,8 +14,9 @@ import React, {
13
14
  import PropTypes from 'prop-types'
14
15
  import classNames from 'classnames'
15
16
 
16
- import { CChip } from '../chip/CChip'
17
+ import { useChipSet } from '../chip-set/useChipSet'
17
18
  import { useForkedRef } from '../../hooks'
19
+ import { isRTL } from '../../utils'
18
20
 
19
21
  type ChipClassName = string | ((value: string) => string)
20
22
 
@@ -23,13 +25,17 @@ export interface CChipInputProps extends Omit<
23
25
  'onChange' | 'onInput' | 'onSelect'
24
26
  > {
25
27
  /**
26
- * Adds custom classes to the React Chip Input component root element.
28
+ * Declarative `CChip` children used as the initial chips. Their values seed the uncontrolled value when `defaultValue` is not provided (parity with the vanilla Chip Input).
27
29
  */
28
- className?: string
30
+ children?: ReactNode
29
31
  /**
30
32
  * Adds custom classes to chips rendered by the React Chip Input component. Accepts a static className or a resolver function based on chip value.
31
33
  */
32
34
  chipClassName?: ChipClassName
35
+ /**
36
+ * Adds custom classes to the React Chip Input component root element.
37
+ */
38
+ className?: string
33
39
  /**
34
40
  * Creates a new chip when the React Chip Input component loses focus with a pending value.
35
41
  */
@@ -42,6 +48,10 @@ export interface CChipInputProps extends Omit<
42
48
  * Disables the React Chip Input component and prevents adding, removing, or selecting chips.
43
49
  */
44
50
  disabled?: boolean
51
+ /**
52
+ * Renders the chips as filter chips, each showing a leading check icon while selected. Implies `selectable`.
53
+ */
54
+ filter?: boolean
45
55
  /**
46
56
  * Sets the `id` of the internal text input rendered by the React Chip Input component.
47
57
  */
@@ -94,6 +104,10 @@ export interface CChipInputProps extends Omit<
94
104
  * Enables chip selection behavior in the React Chip Input component.
95
105
  */
96
106
  selectable?: boolean
107
+ /**
108
+ * Sets how many chips can be selected at once in the React Chip Input component.
109
+ */
110
+ selectionMode?: 'single' | 'multiple'
97
111
  /**
98
112
  * Sets the separator character used to create chips while typing or pasting in the React Chip Input component.
99
113
  */
@@ -127,14 +141,37 @@ const uniqueValues = (values: string[]) => [
127
141
  ...new Set(values.map((value) => value.trim()).filter(Boolean)),
128
142
  ]
129
143
 
144
+ // Initial chip values can be supplied declaratively as CChip children (parity
145
+ // with the vanilla ChipInput, which reads existing .chip elements on init).
146
+ const valuesFromChildren = (children: ReactNode): string[] => {
147
+ const values: string[] = []
148
+ React.Children.forEach(children, (child) => {
149
+ if (!isValidElement(child)) {
150
+ return
151
+ }
152
+
153
+ const { value, children: childContent } = child.props as {
154
+ value?: string
155
+ children?: ReactNode
156
+ }
157
+ const chipValue = value ?? (typeof childContent === 'string' ? childContent : undefined)
158
+ if (chipValue) {
159
+ values.push(chipValue)
160
+ }
161
+ })
162
+ return values
163
+ }
164
+
130
165
  export const CChipInput = forwardRef<HTMLDivElement, CChipInputProps>(
131
166
  (
132
167
  {
168
+ children,
133
169
  className,
134
170
  chipClassName,
135
171
  createOnBlur = true,
136
172
  defaultValue = [],
137
173
  disabled,
174
+ filter,
138
175
  id,
139
176
  label,
140
177
  maxChips = null,
@@ -148,6 +185,7 @@ export const CChipInput = forwardRef<HTMLDivElement, CChipInputProps>(
148
185
  readOnly,
149
186
  removable = true,
150
187
  selectable,
188
+ selectionMode,
151
189
  separator = ',',
152
190
  size,
153
191
  value,
@@ -156,21 +194,34 @@ export const CChipInput = forwardRef<HTMLDivElement, CChipInputProps>(
156
194
  ref
157
195
  ) => {
158
196
  const isControlled = value !== undefined
159
- const [_values, setValues] = useState<string[]>(() => uniqueValues(defaultValue))
197
+ const [_values, setValues] = useState<string[]>(() =>
198
+ uniqueValues(defaultValue.length > 0 ? defaultValue : valuesFromChildren(children))
199
+ )
160
200
  const [inputValue, setInputValue] = useState('')
161
- const [selectedValues, setSelectedValues] = useState<string[]>([])
162
- const rootRef = useRef<HTMLDivElement>(null)
163
201
  const inputRef = useRef<HTMLInputElement>(null)
164
- const forkedRef = useForkedRef(ref, rootRef)
202
+ const generatedName = useId()
165
203
 
166
204
  const values = useMemo(
167
205
  () => uniqueValues(isControlled ? (value as string[]) : _values),
168
206
  [isControlled, value, _values]
169
207
  )
170
208
 
171
- useEffect(() => {
172
- setSelectedValues((prev) => prev.filter((item) => values.includes(item)))
173
- }, [values])
209
+ // Build CChipInput on the same engine as CChipSet: selection coordination,
210
+ // roving focus, and chip prop injection all live in useChipSet. CChipInput
211
+ // owns the chip list and adds the text-input layer on top.
212
+ const { rootRef, clearSelection, getFocusableChips, handleKeyDown, renderChipsFromData } =
213
+ useChipSet({
214
+ ariaRemoveLabel: undefined,
215
+ disabled,
216
+ filter,
217
+ removable: Boolean(removable && !disabled && !readOnly),
218
+ selectable,
219
+ selectionMode,
220
+ restoreFocusOnRemove: false,
221
+ onSelectionChange: onSelect,
222
+ onRemoveChip: (chipValue) => remove(chipValue),
223
+ })
224
+ const forkedRef = useForkedRef(ref, rootRef)
174
225
 
175
226
  const emitValuesChange = (nextValues: string[]) => {
176
227
  if (!isControlled) {
@@ -206,16 +257,10 @@ export const CChipInput = forwardRef<HTMLDivElement, CChipInputProps>(
206
257
  return false
207
258
  }
208
259
 
209
- const nextValues = values.filter((item) => item !== valueToRemove)
210
- emitValuesChange(nextValues)
211
- setSelectedValues((prev) => {
212
- const nextSelected = prev.filter((item) => item !== valueToRemove)
213
- if (nextSelected.length !== prev.length) {
214
- onSelect?.(nextSelected)
215
- }
216
- return nextSelected
217
- })
260
+ // Selection is cleaned up by useChipSet; here we just drop the value.
261
+ emitValuesChange(values.filter((item) => item !== valueToRemove))
218
262
  onRemove?.(valueToRemove)
263
+ inputRef.current?.focus()
219
264
  return true
220
265
  }
221
266
 
@@ -226,19 +271,8 @@ export const CChipInput = forwardRef<HTMLDivElement, CChipInputProps>(
226
271
  }
227
272
 
228
273
  const focusLastChip = () => {
229
- if (!rootRef.current) {
230
- return
231
- }
232
-
233
- const focusableChips = [
234
- ...rootRef.current.querySelectorAll<HTMLElement>(
235
- '[data-coreui-chip-focusable="true"]:not(.disabled)'
236
- ),
237
- ]
238
- if (focusableChips.length === 0) {
239
- return
240
- }
241
- focusableChips[focusableChips.length - 1].focus()
274
+ const chips = getFocusableChips()
275
+ chips[chips.length - 1]?.focus()
242
276
  }
243
277
 
244
278
  const handleInputKeyDown = (event: KeyboardEvent<HTMLInputElement>) => {
@@ -258,8 +292,16 @@ export const CChipInput = forwardRef<HTMLDivElement, CChipInputProps>(
258
292
  break
259
293
  }
260
294
 
261
- case 'ArrowLeft': {
262
- if (event.currentTarget.selectionStart === 0 && event.currentTarget.selectionEnd === 0) {
295
+ case 'ArrowLeft':
296
+ case 'ArrowRight': {
297
+ // The arrow pointing toward the chips (left in LTR, right in RTL) jumps
298
+ // to the last chip when the caret is at the start of the input.
299
+ const towardChipsKey = isRTL(rootRef.current) ? 'ArrowRight' : 'ArrowLeft'
300
+ if (
301
+ event.key === towardChipsKey &&
302
+ event.currentTarget.selectionStart === 0 &&
303
+ event.currentTarget.selectionEnd === 0
304
+ ) {
263
305
  event.preventDefault()
264
306
  focusLastChip()
265
307
  }
@@ -359,6 +401,21 @@ export const CChipInput = forwardRef<HTMLDivElement, CChipInputProps>(
359
401
  return
360
402
  }
361
403
 
404
+ // The arrow past the last chip moves focus into the text field (mirrored in RTL).
405
+ if (event.key === (isRTL(rootRef.current) ? 'ArrowLeft' : 'ArrowRight')) {
406
+ const chips = getFocusableChips()
407
+ const lastChip = chips[chips.length - 1]
408
+ if (lastChip?.contains(event.target as Node)) {
409
+ event.preventDefault()
410
+ inputRef.current?.focus()
411
+ return
412
+ }
413
+ }
414
+
415
+ if (handleKeyDown(event)) {
416
+ return
417
+ }
418
+
362
419
  if (event.key.length === 1) {
363
420
  inputRef.current?.focus()
364
421
  }
@@ -370,16 +427,6 @@ export const CChipInput = forwardRef<HTMLDivElement, CChipInputProps>(
370
427
  }
371
428
  }
372
429
 
373
- const handleSelectedChange = (chipValue: string, selected: boolean) => {
374
- setSelectedValues((prev) => {
375
- const nextSelected = selected
376
- ? uniqueValues([...prev, chipValue])
377
- : prev.filter((value) => value !== chipValue)
378
- onSelect?.(nextSelected)
379
- return nextSelected
380
- })
381
- }
382
-
383
430
  const inputSize = Math.max(placeholder.length, inputValue.length, 1)
384
431
 
385
432
  return (
@@ -406,21 +453,14 @@ export const CChipInput = forwardRef<HTMLDivElement, CChipInputProps>(
406
453
  </label>
407
454
  )}
408
455
 
409
- {values.map((chipValue) => (
410
- <CChip
411
- key={chipValue}
412
- className={resolveChipClassName(chipClassName, chipValue)}
413
- removable={Boolean(removable && !disabled && !readOnly)}
414
- ariaRemoveLabel={`Remove ${chipValue}`}
415
- disabled={disabled}
416
- onRemove={() => remove(chipValue)}
417
- selectable={selectable}
418
- selected={selectedValues.includes(chipValue)}
419
- onSelectedChange={(selected) => handleSelectedChange(chipValue, selected)}
420
- >
421
- {chipValue}
422
- </CChip>
423
- ))}
456
+ {renderChipsFromData(
457
+ values.map((chipValue) => ({
458
+ value: chipValue,
459
+ label: chipValue,
460
+ className: resolveChipClassName(chipClassName, chipValue),
461
+ ariaRemoveLabel: `Remove ${chipValue}`,
462
+ }))
463
+ )}
424
464
 
425
465
  <input
426
466
  type="text"
@@ -435,27 +475,24 @@ export const CChipInput = forwardRef<HTMLDivElement, CChipInputProps>(
435
475
  onChange={(event) => handleInputChange(event.target.value)}
436
476
  onKeyDown={handleInputKeyDown}
437
477
  onPaste={handlePaste}
438
- onFocus={() => {
439
- if (selectedValues.length > 0) {
440
- setSelectedValues([])
441
- onSelect?.([])
442
- }
443
- }}
478
+ onFocus={clearSelection}
444
479
  ref={inputRef}
445
480
  />
446
481
 
447
- {name && <input type="hidden" name={name} value={values.join(',')} />}
482
+ <input type="hidden" name={name ?? generatedName} value={values.join(',')} />
448
483
  </div>
449
484
  )
450
485
  }
451
486
  )
452
487
 
453
488
  CChipInput.propTypes = {
489
+ children: PropTypes.node,
454
490
  chipClassName: PropTypes.oneOfType([PropTypes.string, PropTypes.func]),
455
491
  className: PropTypes.string,
456
492
  createOnBlur: PropTypes.bool,
457
493
  defaultValue: PropTypes.array,
458
494
  disabled: PropTypes.bool,
495
+ filter: PropTypes.bool,
459
496
  id: PropTypes.string,
460
497
  label: PropTypes.node,
461
498
  maxChips: PropTypes.number,
@@ -469,6 +506,7 @@ CChipInput.propTypes = {
469
506
  readOnly: PropTypes.bool,
470
507
  removable: PropTypes.bool,
471
508
  selectable: PropTypes.bool,
509
+ selectionMode: PropTypes.oneOf(['single', 'multiple']),
472
510
  separator: PropTypes.string,
473
511
  size: PropTypes.oneOf(['sm', 'lg']),
474
512
  value: PropTypes.array,
@@ -32,8 +32,7 @@ export type ButtonObject = {
32
32
  }
33
33
 
34
34
  export interface CFormCheckProps
35
- extends CFormControlValidationProps,
36
- InputHTMLAttributes<HTMLInputElement> {
35
+ extends CFormControlValidationProps, InputHTMLAttributes<HTMLInputElement> {
37
36
  /**
38
37
  * Create button-like checkboxes and radio buttons.
39
38
  */
@@ -11,8 +11,7 @@ import classNames from 'classnames'
11
11
  import { CFormControlWrapper, CFormControlWrapperProps } from './CFormControlWrapper'
12
12
 
13
13
  export interface CFormInputProps
14
- extends CFormControlWrapperProps,
15
- Omit<InputHTMLAttributes<HTMLInputElement>, 'size'> {
14
+ extends CFormControlWrapperProps, Omit<InputHTMLAttributes<HTMLInputElement>, 'size'> {
16
15
  /**
17
16
  * A string of all className you want applied to the component.
18
17
  */
@@ -12,8 +12,7 @@ type Option = {
12
12
  }
13
13
 
14
14
  export interface CFormSelectProps
15
- extends CFormControlWrapperProps,
16
- Omit<InputHTMLAttributes<HTMLSelectElement>, 'size'> {
15
+ extends CFormControlWrapperProps, Omit<InputHTMLAttributes<HTMLSelectElement>, 'size'> {
17
16
  /**
18
17
  * A string of all className you want applied to the component.
19
18
  */
@@ -5,8 +5,7 @@ import classNames from 'classnames'
5
5
  import { CFormControlWrapper, CFormControlWrapperProps } from './CFormControlWrapper'
6
6
 
7
7
  export interface CFormTextareaProps
8
- extends CFormControlWrapperProps,
9
- TextareaHTMLAttributes<HTMLTextAreaElement> {
8
+ extends CFormControlWrapperProps, TextareaHTMLAttributes<HTMLTextAreaElement> {
10
9
  /**
11
10
  * A string of all className you want applied to the component.
12
11
  */
@@ -4,8 +4,9 @@ import classNames from 'classnames'
4
4
 
5
5
  import { PolymorphicRefForwardingComponent } from '../../helpers'
6
6
 
7
- export interface CInputGroupTextProps
8
- extends LabelHTMLAttributes<HTMLLabelElement | HTMLSpanElement> {
7
+ export interface CInputGroupTextProps extends LabelHTMLAttributes<
8
+ HTMLLabelElement | HTMLSpanElement
9
+ > {
9
10
  /**
10
11
  * Component used for the root node. Either a string to use a HTML element or a component.
11
12
  */