@coreui/react-pro 5.7.0 → 5.9.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 (509) hide show
  1. package/README.md +1 -1
  2. package/dist/cjs/components/accordion/CAccordion.js.map +1 -1
  3. package/dist/cjs/components/accordion/CAccordionBody.js.map +1 -1
  4. package/dist/cjs/components/accordion/CAccordionButton.js.map +1 -1
  5. package/dist/cjs/components/accordion/CAccordionHeader.js.map +1 -1
  6. package/dist/cjs/components/accordion/CAccordionItem.js.map +1 -1
  7. package/dist/cjs/components/alert/CAlert.js +1 -1
  8. package/dist/cjs/components/alert/CAlert.js.map +1 -1
  9. package/dist/cjs/components/alert/CAlertHeading.js.map +1 -1
  10. package/dist/cjs/components/alert/CAlertLink.js.map +1 -1
  11. package/dist/cjs/components/avatar/CAvatar.js.map +1 -1
  12. package/dist/cjs/components/backdrop/CBackdrop.js +1 -1
  13. package/dist/cjs/components/backdrop/CBackdrop.js.map +1 -1
  14. package/dist/cjs/components/badge/CBadge.js.map +1 -1
  15. package/dist/cjs/components/breadcrumb/CBreadcrumb.js.map +1 -1
  16. package/dist/cjs/components/breadcrumb/CBreadcrumbItem.js.map +1 -1
  17. package/dist/cjs/components/button/CButton.js.map +1 -1
  18. package/dist/cjs/components/button-group/CButtonGroup.js.map +1 -1
  19. package/dist/cjs/components/button-group/CButtonToolbar.js.map +1 -1
  20. package/dist/cjs/components/calendar/CCalendar.js +1 -1
  21. package/dist/cjs/components/calendar/CCalendar.js.map +1 -1
  22. package/dist/cjs/components/calendar/utils.js +5 -0
  23. package/dist/cjs/components/calendar/utils.js.map +1 -1
  24. package/dist/cjs/components/callout/CCallout.js.map +1 -1
  25. package/dist/cjs/components/card/CCard.js.map +1 -1
  26. package/dist/cjs/components/card/CCardBody.js.map +1 -1
  27. package/dist/cjs/components/card/CCardFooter.js.map +1 -1
  28. package/dist/cjs/components/card/CCardGroup.js.map +1 -1
  29. package/dist/cjs/components/card/CCardHeader.js.map +1 -1
  30. package/dist/cjs/components/card/CCardImage.js.map +1 -1
  31. package/dist/cjs/components/card/CCardImageOverlay.js.map +1 -1
  32. package/dist/cjs/components/card/CCardLink.js.map +1 -1
  33. package/dist/cjs/components/card/CCardSubtitle.js.map +1 -1
  34. package/dist/cjs/components/card/CCardText.js.map +1 -1
  35. package/dist/cjs/components/card/CCardTitle.js.map +1 -1
  36. package/dist/cjs/components/carousel/CCarousel.js +1 -1
  37. package/dist/cjs/components/carousel/CCarousel.js.map +1 -1
  38. package/dist/cjs/components/carousel/CCarouselCaption.js.map +1 -1
  39. package/dist/cjs/components/carousel/CCarouselItem.js +1 -1
  40. package/dist/cjs/components/carousel/CCarouselItem.js.map +1 -1
  41. package/dist/cjs/components/close-button/CCloseButton.js.map +1 -1
  42. package/dist/cjs/components/collapse/CCollapse.js +1 -1
  43. package/dist/cjs/components/collapse/CCollapse.js.map +1 -1
  44. package/dist/cjs/components/conditional-portal/CConditionalPortal.js.map +1 -1
  45. package/dist/cjs/components/date-picker/CDatePicker.js.map +1 -1
  46. package/dist/cjs/components/date-range-picker/CDateRangePicker.js +23 -15
  47. package/dist/cjs/components/date-range-picker/CDateRangePicker.js.map +1 -1
  48. package/dist/cjs/components/date-range-picker/utils.js.map +1 -1
  49. package/dist/cjs/components/dropdown/CDropdown.js +2 -2
  50. package/dist/cjs/components/dropdown/CDropdown.js.map +1 -1
  51. package/dist/cjs/components/dropdown/CDropdownDivider.js.map +1 -1
  52. package/dist/cjs/components/dropdown/CDropdownHeader.js.map +1 -1
  53. package/dist/cjs/components/dropdown/CDropdownItem.js.map +1 -1
  54. package/dist/cjs/components/dropdown/CDropdownItemPlain.js.map +1 -1
  55. package/dist/cjs/components/dropdown/CDropdownMenu.js +1 -1
  56. package/dist/cjs/components/dropdown/CDropdownMenu.js.map +1 -1
  57. package/dist/cjs/components/dropdown/CDropdownToggle.js.map +1 -1
  58. package/dist/cjs/components/dropdown/utils.js.map +1 -1
  59. package/dist/cjs/components/element-cover/CElementCover.js +1 -1
  60. package/dist/cjs/components/element-cover/CElementCover.js.map +1 -1
  61. package/dist/cjs/components/footer/CFooter.js.map +1 -1
  62. package/dist/cjs/components/form/CForm.js.map +1 -1
  63. package/dist/cjs/components/form/CFormCheck.js +1 -1
  64. package/dist/cjs/components/form/CFormCheck.js.map +1 -1
  65. package/dist/cjs/components/form/CFormControlValidation.js.map +1 -1
  66. package/dist/cjs/components/form/CFormControlWrapper.js.map +1 -1
  67. package/dist/cjs/components/form/CFormFeedback.js.map +1 -1
  68. package/dist/cjs/components/form/CFormFloating.js.map +1 -1
  69. package/dist/cjs/components/form/CFormInput.js.map +1 -1
  70. package/dist/cjs/components/form/CFormLabel.js.map +1 -1
  71. package/dist/cjs/components/form/CFormRange.js.map +1 -1
  72. package/dist/cjs/components/form/CFormSelect.js.map +1 -1
  73. package/dist/cjs/components/form/CFormSwitch.js.map +1 -1
  74. package/dist/cjs/components/form/CFormText.js.map +1 -1
  75. package/dist/cjs/components/form/CFormTextarea.js.map +1 -1
  76. package/dist/cjs/components/form/CInputGroup.js.map +1 -1
  77. package/dist/cjs/components/form/CInputGroupText.js.map +1 -1
  78. package/dist/cjs/components/grid/CCol.js.map +1 -1
  79. package/dist/cjs/components/grid/CContainer.js.map +1 -1
  80. package/dist/cjs/components/grid/CRow.js.map +1 -1
  81. package/dist/cjs/components/header/CHeader.js.map +1 -1
  82. package/dist/cjs/components/header/CHeaderBrand.js.map +1 -1
  83. package/dist/cjs/components/header/CHeaderDivider.js.map +1 -1
  84. package/dist/cjs/components/header/CHeaderNav.js.map +1 -1
  85. package/dist/cjs/components/header/CHeaderText.js.map +1 -1
  86. package/dist/cjs/components/header/CHeaderToggler.js.map +1 -1
  87. package/dist/cjs/components/image/CImage.js.map +1 -1
  88. package/dist/cjs/components/index.d.ts +1 -0
  89. package/dist/cjs/components/link/CLink.js.map +1 -1
  90. package/dist/cjs/components/list-group/CListGroup.js +4 -3
  91. package/dist/cjs/components/list-group/CListGroup.js.map +1 -1
  92. package/dist/cjs/components/list-group/CListGroupItem.js.map +1 -1
  93. package/dist/cjs/components/loading-button/CLoadingButton.js.map +1 -1
  94. package/dist/cjs/components/modal/CModal.js +1 -1
  95. package/dist/cjs/components/modal/CModal.js.map +1 -1
  96. package/dist/cjs/components/modal/CModalBody.js.map +1 -1
  97. package/dist/cjs/components/modal/CModalContent.js.map +1 -1
  98. package/dist/cjs/components/modal/CModalDialog.js.map +1 -1
  99. package/dist/cjs/components/modal/CModalFooter.js.map +1 -1
  100. package/dist/cjs/components/modal/CModalHeader.js.map +1 -1
  101. package/dist/cjs/components/modal/CModalTitle.js.map +1 -1
  102. package/dist/cjs/components/multi-select/CMultiSelect.d.ts +26 -3
  103. package/dist/cjs/components/multi-select/CMultiSelect.js +99 -86
  104. package/dist/cjs/components/multi-select/CMultiSelect.js.map +1 -1
  105. package/dist/cjs/components/multi-select/CMultiSelectNativeSelect.js.map +1 -1
  106. package/dist/cjs/components/multi-select/CMultiSelectOptions.d.ts +1 -1
  107. package/dist/cjs/components/multi-select/CMultiSelectOptions.js +5 -5
  108. package/dist/cjs/components/multi-select/CMultiSelectOptions.js.map +1 -1
  109. package/dist/cjs/components/multi-select/CMultiSelectSelection.d.ts +2 -2
  110. package/dist/cjs/components/multi-select/CMultiSelectSelection.js +8 -1
  111. package/dist/cjs/components/multi-select/CMultiSelectSelection.js.map +1 -1
  112. package/dist/cjs/components/multi-select/types.d.ts +4 -0
  113. package/dist/cjs/components/multi-select/utils.d.ts +5 -2
  114. package/dist/cjs/components/multi-select/utils.js +18 -1
  115. package/dist/cjs/components/multi-select/utils.js.map +1 -1
  116. package/dist/cjs/components/nav/CNav.js.map +1 -1
  117. package/dist/cjs/components/nav/CNavGroup.js +1 -1
  118. package/dist/cjs/components/nav/CNavGroup.js.map +1 -1
  119. package/dist/cjs/components/nav/CNavGroupItems.js.map +1 -1
  120. package/dist/cjs/components/nav/CNavItem.js.map +1 -1
  121. package/dist/cjs/components/nav/CNavLink.js +1 -1
  122. package/dist/cjs/components/nav/CNavLink.js.map +1 -1
  123. package/dist/cjs/components/nav/CNavTitle.js.map +1 -1
  124. package/dist/cjs/components/navbar/CNavbar.js.map +1 -1
  125. package/dist/cjs/components/navbar/CNavbarBrand.js.map +1 -1
  126. package/dist/cjs/components/navbar/CNavbarNav.js.map +1 -1
  127. package/dist/cjs/components/navbar/CNavbarText.js.map +1 -1
  128. package/dist/cjs/components/navbar/CNavbarToggler.js.map +1 -1
  129. package/dist/cjs/components/offcanvas/COffcanvas.js +1 -1
  130. package/dist/cjs/components/offcanvas/COffcanvas.js.map +1 -1
  131. package/dist/cjs/components/offcanvas/COffcanvasBody.js.map +1 -1
  132. package/dist/cjs/components/offcanvas/COffcanvasHeader.js.map +1 -1
  133. package/dist/cjs/components/offcanvas/COffcanvasTitle.js.map +1 -1
  134. package/dist/cjs/components/pagination/CPagination.js.map +1 -1
  135. package/dist/cjs/components/pagination/CPaginationItem.js.map +1 -1
  136. package/dist/cjs/components/picker/CPicker.d.ts +6 -0
  137. package/dist/cjs/components/picker/CPicker.js +16 -7
  138. package/dist/cjs/components/picker/CPicker.js.map +1 -1
  139. package/dist/cjs/components/placeholder/CPlaceholder.js.map +1 -1
  140. package/dist/cjs/components/popover/CPopover.js +49 -44
  141. package/dist/cjs/components/popover/CPopover.js.map +1 -1
  142. package/dist/cjs/components/progress/CProgress.js.map +1 -1
  143. package/dist/cjs/components/progress/CProgressBar.js.map +1 -1
  144. package/dist/cjs/components/progress/CProgressStacked.js.map +1 -1
  145. package/dist/cjs/components/range-slider/CRangeSlider.d.ts +79 -0
  146. package/dist/cjs/components/range-slider/CRangeSlider.js +146 -0
  147. package/dist/cjs/components/range-slider/CRangeSlider.js.map +1 -0
  148. package/dist/cjs/components/range-slider/index.d.ts +2 -0
  149. package/dist/cjs/components/range-slider/types.d.ts +11 -0
  150. package/dist/cjs/components/range-slider/utils.d.ts +39 -0
  151. package/dist/cjs/components/range-slider/utils.js +163 -0
  152. package/dist/cjs/components/range-slider/utils.js.map +1 -0
  153. package/dist/cjs/components/rating/CRating.js.map +1 -1
  154. package/dist/cjs/components/sidebar/CSidebar.js +1 -1
  155. package/dist/cjs/components/sidebar/CSidebar.js.map +1 -1
  156. package/dist/cjs/components/sidebar/CSidebarBrand.js.map +1 -1
  157. package/dist/cjs/components/sidebar/CSidebarFooter.js.map +1 -1
  158. package/dist/cjs/components/sidebar/CSidebarHeader.js.map +1 -1
  159. package/dist/cjs/components/sidebar/CSidebarNav.js.map +1 -1
  160. package/dist/cjs/components/sidebar/CSidebarToggler.js.map +1 -1
  161. package/dist/cjs/components/smart-pagination/CSmartPagination.js.map +1 -1
  162. package/dist/cjs/components/smart-table/CSmartTable.js.map +1 -1
  163. package/dist/cjs/components/smart-table/CSmartTableBody.js.map +1 -1
  164. package/dist/cjs/components/smart-table/CSmartTableHead.js.map +1 -1
  165. package/dist/cjs/components/smart-table/utils.js.map +1 -1
  166. package/dist/cjs/components/spinner/CSpinner.js.map +1 -1
  167. package/dist/cjs/components/table/CTable.js.map +1 -1
  168. package/dist/cjs/components/table/CTableBody.js.map +1 -1
  169. package/dist/cjs/components/table/CTableCaption.js.map +1 -1
  170. package/dist/cjs/components/table/CTableDataCell.js.map +1 -1
  171. package/dist/cjs/components/table/CTableFoot.js.map +1 -1
  172. package/dist/cjs/components/table/CTableHead.js.map +1 -1
  173. package/dist/cjs/components/table/CTableHeaderCell.js.map +1 -1
  174. package/dist/cjs/components/table/CTableResponsiveWrapper.js.map +1 -1
  175. package/dist/cjs/components/table/CTableRow.js.map +1 -1
  176. package/dist/cjs/components/table/utils.js.map +1 -1
  177. package/dist/cjs/components/tabs/CTab.js.map +1 -1
  178. package/dist/cjs/components/tabs/CTabContent.js.map +1 -1
  179. package/dist/cjs/components/tabs/CTabList.js +1 -1
  180. package/dist/cjs/components/tabs/CTabList.js.map +1 -1
  181. package/dist/cjs/components/tabs/CTabPane.js +1 -1
  182. package/dist/cjs/components/tabs/CTabPane.js.map +1 -1
  183. package/dist/cjs/components/tabs/CTabPanel.js +1 -1
  184. package/dist/cjs/components/tabs/CTabPanel.js.map +1 -1
  185. package/dist/cjs/components/tabs/CTabs.js.map +1 -1
  186. package/dist/cjs/components/time-picker/CTimePicker.js +18 -10
  187. package/dist/cjs/components/time-picker/CTimePicker.js.map +1 -1
  188. package/dist/cjs/components/time-picker/CTimePickerRollCol.js +2 -1
  189. package/dist/cjs/components/time-picker/CTimePickerRollCol.js.map +1 -1
  190. package/dist/cjs/components/time-picker/utils.js.map +1 -1
  191. package/dist/cjs/components/toast/CToast.js +1 -1
  192. package/dist/cjs/components/toast/CToast.js.map +1 -1
  193. package/dist/cjs/components/toast/CToastBody.js.map +1 -1
  194. package/dist/cjs/components/toast/CToastClose.js.map +1 -1
  195. package/dist/cjs/components/toast/CToastHeader.js.map +1 -1
  196. package/dist/cjs/components/toast/CToaster.js.map +1 -1
  197. package/dist/cjs/components/tooltip/CTooltip.js +49 -44
  198. package/dist/cjs/components/tooltip/CTooltip.js.map +1 -1
  199. package/dist/cjs/components/virtual-scroller/CVirtualScroller.js +5 -5
  200. package/dist/cjs/components/virtual-scroller/CVirtualScroller.js.map +1 -1
  201. package/dist/cjs/components/widgets/CWidgetStatsA.js.map +1 -1
  202. package/dist/cjs/components/widgets/CWidgetStatsB.js.map +1 -1
  203. package/dist/cjs/components/widgets/CWidgetStatsC.js.map +1 -1
  204. package/dist/cjs/components/widgets/CWidgetStatsD.js.map +1 -1
  205. package/dist/cjs/components/widgets/CWidgetStatsE.js.map +1 -1
  206. package/dist/cjs/components/widgets/CWidgetStatsF.js.map +1 -1
  207. package/dist/cjs/hooks/index.d.ts +2 -1
  208. package/dist/cjs/hooks/useColorModes.js.map +1 -1
  209. package/dist/cjs/hooks/useDebounce.js.map +1 -1
  210. package/dist/cjs/hooks/useDebouncedCallback.js.map +1 -1
  211. package/dist/cjs/hooks/useDropdownWithPopper.d.ts +10 -0
  212. package/dist/cjs/hooks/useDropdownWithPopper.js +98 -0
  213. package/dist/cjs/hooks/useDropdownWithPopper.js.map +1 -0
  214. package/dist/cjs/hooks/useForkedRef.js.map +1 -1
  215. package/dist/cjs/hooks/useIsVisible.js.map +1 -1
  216. package/dist/cjs/hooks/usePopper.js.map +1 -1
  217. package/dist/cjs/hooks/useStateWithCallback.js.map +1 -1
  218. package/dist/cjs/index.js +4 -0
  219. package/dist/cjs/index.js.map +1 -1
  220. package/dist/cjs/node_modules/@babel/runtime/helpers/esm/extends.js.map +1 -1
  221. package/dist/cjs/node_modules/@babel/runtime/helpers/esm/inheritsLoose.js.map +1 -1
  222. package/dist/cjs/node_modules/@babel/runtime/helpers/esm/objectWithoutPropertiesLoose.js.map +1 -1
  223. package/dist/cjs/node_modules/@babel/runtime/helpers/esm/setPrototypeOf.js.map +1 -1
  224. package/dist/cjs/node_modules/@coreui/icons-react/dist/index.esm.js.map +1 -1
  225. package/dist/cjs/node_modules/classnames/index.js.map +1 -1
  226. package/dist/cjs/node_modules/dom-helpers/esm/addClass.js.map +1 -1
  227. package/dist/cjs/node_modules/dom-helpers/esm/hasClass.js.map +1 -1
  228. package/dist/cjs/node_modules/dom-helpers/esm/removeClass.js.map +1 -1
  229. package/dist/cjs/node_modules/react-device-detect/dist/lib.js.map +1 -1
  230. package/dist/cjs/node_modules/react-transition-group/esm/CSSTransition.js.map +1 -1
  231. package/dist/cjs/node_modules/react-transition-group/esm/Transition.js.map +1 -1
  232. package/dist/cjs/node_modules/react-transition-group/esm/config.js.map +1 -1
  233. package/dist/cjs/node_modules/react-transition-group/esm/utils/PropTypes.js.map +1 -1
  234. package/dist/cjs/node_modules/react-transition-group/esm/utils/reflow.js.map +1 -1
  235. package/dist/cjs/packages/coreui-react-pro/node_modules/tslib/tslib.es6.js.map +1 -1
  236. package/dist/cjs/props.js.map +1 -1
  237. package/dist/cjs/utils/executeAfterTransition.js.map +1 -1
  238. package/dist/cjs/utils/getNextActiveElement.js +1 -1
  239. package/dist/cjs/utils/getNextActiveElement.js.map +1 -1
  240. package/dist/cjs/utils/getRTLPlacement.js.map +1 -1
  241. package/dist/cjs/utils/getTransitionDurationFromElement.js.map +1 -1
  242. package/dist/cjs/utils/isInViewport.js.map +1 -1
  243. package/dist/cjs/utils/isObjectInArray.js.map +1 -1
  244. package/dist/cjs/utils/isRTL.js.map +1 -1
  245. package/dist/esm/components/accordion/CAccordion.js.map +1 -1
  246. package/dist/esm/components/accordion/CAccordionBody.js.map +1 -1
  247. package/dist/esm/components/accordion/CAccordionButton.js.map +1 -1
  248. package/dist/esm/components/accordion/CAccordionHeader.js.map +1 -1
  249. package/dist/esm/components/accordion/CAccordionItem.js.map +1 -1
  250. package/dist/esm/components/alert/CAlert.js +1 -1
  251. package/dist/esm/components/alert/CAlert.js.map +1 -1
  252. package/dist/esm/components/alert/CAlertHeading.js.map +1 -1
  253. package/dist/esm/components/alert/CAlertLink.js.map +1 -1
  254. package/dist/esm/components/avatar/CAvatar.js.map +1 -1
  255. package/dist/esm/components/backdrop/CBackdrop.js +1 -1
  256. package/dist/esm/components/backdrop/CBackdrop.js.map +1 -1
  257. package/dist/esm/components/badge/CBadge.js.map +1 -1
  258. package/dist/esm/components/breadcrumb/CBreadcrumb.js.map +1 -1
  259. package/dist/esm/components/breadcrumb/CBreadcrumbItem.js.map +1 -1
  260. package/dist/esm/components/button/CButton.js.map +1 -1
  261. package/dist/esm/components/button-group/CButtonGroup.js.map +1 -1
  262. package/dist/esm/components/button-group/CButtonToolbar.js.map +1 -1
  263. package/dist/esm/components/calendar/CCalendar.js +1 -1
  264. package/dist/esm/components/calendar/CCalendar.js.map +1 -1
  265. package/dist/esm/components/calendar/utils.js +5 -0
  266. package/dist/esm/components/calendar/utils.js.map +1 -1
  267. package/dist/esm/components/callout/CCallout.js.map +1 -1
  268. package/dist/esm/components/card/CCard.js.map +1 -1
  269. package/dist/esm/components/card/CCardBody.js.map +1 -1
  270. package/dist/esm/components/card/CCardFooter.js.map +1 -1
  271. package/dist/esm/components/card/CCardGroup.js.map +1 -1
  272. package/dist/esm/components/card/CCardHeader.js.map +1 -1
  273. package/dist/esm/components/card/CCardImage.js.map +1 -1
  274. package/dist/esm/components/card/CCardImageOverlay.js.map +1 -1
  275. package/dist/esm/components/card/CCardLink.js.map +1 -1
  276. package/dist/esm/components/card/CCardSubtitle.js.map +1 -1
  277. package/dist/esm/components/card/CCardText.js.map +1 -1
  278. package/dist/esm/components/card/CCardTitle.js.map +1 -1
  279. package/dist/esm/components/carousel/CCarousel.js +1 -1
  280. package/dist/esm/components/carousel/CCarousel.js.map +1 -1
  281. package/dist/esm/components/carousel/CCarouselCaption.js.map +1 -1
  282. package/dist/esm/components/carousel/CCarouselItem.js +1 -1
  283. package/dist/esm/components/carousel/CCarouselItem.js.map +1 -1
  284. package/dist/esm/components/close-button/CCloseButton.js.map +1 -1
  285. package/dist/esm/components/collapse/CCollapse.js +1 -1
  286. package/dist/esm/components/collapse/CCollapse.js.map +1 -1
  287. package/dist/esm/components/conditional-portal/CConditionalPortal.js.map +1 -1
  288. package/dist/esm/components/date-picker/CDatePicker.js.map +1 -1
  289. package/dist/esm/components/date-range-picker/CDateRangePicker.js +23 -15
  290. package/dist/esm/components/date-range-picker/CDateRangePicker.js.map +1 -1
  291. package/dist/esm/components/date-range-picker/utils.js.map +1 -1
  292. package/dist/esm/components/dropdown/CDropdown.js +2 -2
  293. package/dist/esm/components/dropdown/CDropdown.js.map +1 -1
  294. package/dist/esm/components/dropdown/CDropdownDivider.js.map +1 -1
  295. package/dist/esm/components/dropdown/CDropdownHeader.js.map +1 -1
  296. package/dist/esm/components/dropdown/CDropdownItem.js.map +1 -1
  297. package/dist/esm/components/dropdown/CDropdownItemPlain.js.map +1 -1
  298. package/dist/esm/components/dropdown/CDropdownMenu.js +1 -1
  299. package/dist/esm/components/dropdown/CDropdownMenu.js.map +1 -1
  300. package/dist/esm/components/dropdown/CDropdownToggle.js.map +1 -1
  301. package/dist/esm/components/dropdown/utils.js.map +1 -1
  302. package/dist/esm/components/element-cover/CElementCover.js +1 -1
  303. package/dist/esm/components/element-cover/CElementCover.js.map +1 -1
  304. package/dist/esm/components/footer/CFooter.js.map +1 -1
  305. package/dist/esm/components/form/CForm.js.map +1 -1
  306. package/dist/esm/components/form/CFormCheck.js +1 -1
  307. package/dist/esm/components/form/CFormCheck.js.map +1 -1
  308. package/dist/esm/components/form/CFormControlValidation.js.map +1 -1
  309. package/dist/esm/components/form/CFormControlWrapper.js.map +1 -1
  310. package/dist/esm/components/form/CFormFeedback.js.map +1 -1
  311. package/dist/esm/components/form/CFormFloating.js.map +1 -1
  312. package/dist/esm/components/form/CFormInput.js.map +1 -1
  313. package/dist/esm/components/form/CFormLabel.js.map +1 -1
  314. package/dist/esm/components/form/CFormRange.js.map +1 -1
  315. package/dist/esm/components/form/CFormSelect.js.map +1 -1
  316. package/dist/esm/components/form/CFormSwitch.js.map +1 -1
  317. package/dist/esm/components/form/CFormText.js.map +1 -1
  318. package/dist/esm/components/form/CFormTextarea.js.map +1 -1
  319. package/dist/esm/components/form/CInputGroup.js.map +1 -1
  320. package/dist/esm/components/form/CInputGroupText.js.map +1 -1
  321. package/dist/esm/components/grid/CCol.js.map +1 -1
  322. package/dist/esm/components/grid/CContainer.js.map +1 -1
  323. package/dist/esm/components/grid/CRow.js.map +1 -1
  324. package/dist/esm/components/header/CHeader.js.map +1 -1
  325. package/dist/esm/components/header/CHeaderBrand.js.map +1 -1
  326. package/dist/esm/components/header/CHeaderDivider.js.map +1 -1
  327. package/dist/esm/components/header/CHeaderNav.js.map +1 -1
  328. package/dist/esm/components/header/CHeaderText.js.map +1 -1
  329. package/dist/esm/components/header/CHeaderToggler.js.map +1 -1
  330. package/dist/esm/components/image/CImage.js.map +1 -1
  331. package/dist/esm/components/index.d.ts +1 -0
  332. package/dist/esm/components/link/CLink.js.map +1 -1
  333. package/dist/esm/components/list-group/CListGroup.js +4 -3
  334. package/dist/esm/components/list-group/CListGroup.js.map +1 -1
  335. package/dist/esm/components/list-group/CListGroupItem.js.map +1 -1
  336. package/dist/esm/components/loading-button/CLoadingButton.js.map +1 -1
  337. package/dist/esm/components/modal/CModal.js +1 -1
  338. package/dist/esm/components/modal/CModal.js.map +1 -1
  339. package/dist/esm/components/modal/CModalBody.js.map +1 -1
  340. package/dist/esm/components/modal/CModalContent.js.map +1 -1
  341. package/dist/esm/components/modal/CModalDialog.js.map +1 -1
  342. package/dist/esm/components/modal/CModalFooter.js.map +1 -1
  343. package/dist/esm/components/modal/CModalHeader.js.map +1 -1
  344. package/dist/esm/components/modal/CModalTitle.js.map +1 -1
  345. package/dist/esm/components/multi-select/CMultiSelect.d.ts +26 -3
  346. package/dist/esm/components/multi-select/CMultiSelect.js +100 -87
  347. package/dist/esm/components/multi-select/CMultiSelect.js.map +1 -1
  348. package/dist/esm/components/multi-select/CMultiSelectNativeSelect.js.map +1 -1
  349. package/dist/esm/components/multi-select/CMultiSelectOptions.d.ts +1 -1
  350. package/dist/esm/components/multi-select/CMultiSelectOptions.js +5 -5
  351. package/dist/esm/components/multi-select/CMultiSelectOptions.js.map +1 -1
  352. package/dist/esm/components/multi-select/CMultiSelectSelection.d.ts +2 -2
  353. package/dist/esm/components/multi-select/CMultiSelectSelection.js +8 -1
  354. package/dist/esm/components/multi-select/CMultiSelectSelection.js.map +1 -1
  355. package/dist/esm/components/multi-select/types.d.ts +4 -0
  356. package/dist/esm/components/multi-select/utils.d.ts +5 -2
  357. package/dist/esm/components/multi-select/utils.js +16 -2
  358. package/dist/esm/components/multi-select/utils.js.map +1 -1
  359. package/dist/esm/components/nav/CNav.js.map +1 -1
  360. package/dist/esm/components/nav/CNavGroup.js +1 -1
  361. package/dist/esm/components/nav/CNavGroup.js.map +1 -1
  362. package/dist/esm/components/nav/CNavGroupItems.js.map +1 -1
  363. package/dist/esm/components/nav/CNavItem.js.map +1 -1
  364. package/dist/esm/components/nav/CNavLink.js +1 -1
  365. package/dist/esm/components/nav/CNavLink.js.map +1 -1
  366. package/dist/esm/components/nav/CNavTitle.js.map +1 -1
  367. package/dist/esm/components/navbar/CNavbar.js.map +1 -1
  368. package/dist/esm/components/navbar/CNavbarBrand.js.map +1 -1
  369. package/dist/esm/components/navbar/CNavbarNav.js.map +1 -1
  370. package/dist/esm/components/navbar/CNavbarText.js.map +1 -1
  371. package/dist/esm/components/navbar/CNavbarToggler.js.map +1 -1
  372. package/dist/esm/components/offcanvas/COffcanvas.js +1 -1
  373. package/dist/esm/components/offcanvas/COffcanvas.js.map +1 -1
  374. package/dist/esm/components/offcanvas/COffcanvasBody.js.map +1 -1
  375. package/dist/esm/components/offcanvas/COffcanvasHeader.js.map +1 -1
  376. package/dist/esm/components/offcanvas/COffcanvasTitle.js.map +1 -1
  377. package/dist/esm/components/pagination/CPagination.js.map +1 -1
  378. package/dist/esm/components/pagination/CPaginationItem.js.map +1 -1
  379. package/dist/esm/components/picker/CPicker.d.ts +6 -0
  380. package/dist/esm/components/picker/CPicker.js +16 -7
  381. package/dist/esm/components/picker/CPicker.js.map +1 -1
  382. package/dist/esm/components/placeholder/CPlaceholder.js.map +1 -1
  383. package/dist/esm/components/popover/CPopover.js +50 -45
  384. package/dist/esm/components/popover/CPopover.js.map +1 -1
  385. package/dist/esm/components/progress/CProgress.js.map +1 -1
  386. package/dist/esm/components/progress/CProgressBar.js.map +1 -1
  387. package/dist/esm/components/progress/CProgressStacked.js.map +1 -1
  388. package/dist/esm/components/range-slider/CRangeSlider.d.ts +79 -0
  389. package/dist/esm/components/range-slider/CRangeSlider.js +144 -0
  390. package/dist/esm/components/range-slider/CRangeSlider.js.map +1 -0
  391. package/dist/esm/components/range-slider/index.d.ts +2 -0
  392. package/dist/esm/components/range-slider/types.d.ts +11 -0
  393. package/dist/esm/components/range-slider/utils.d.ts +39 -0
  394. package/dist/esm/components/range-slider/utils.js +148 -0
  395. package/dist/esm/components/range-slider/utils.js.map +1 -0
  396. package/dist/esm/components/rating/CRating.js.map +1 -1
  397. package/dist/esm/components/sidebar/CSidebar.js +1 -1
  398. package/dist/esm/components/sidebar/CSidebar.js.map +1 -1
  399. package/dist/esm/components/sidebar/CSidebarBrand.js.map +1 -1
  400. package/dist/esm/components/sidebar/CSidebarFooter.js.map +1 -1
  401. package/dist/esm/components/sidebar/CSidebarHeader.js.map +1 -1
  402. package/dist/esm/components/sidebar/CSidebarNav.js.map +1 -1
  403. package/dist/esm/components/sidebar/CSidebarToggler.js.map +1 -1
  404. package/dist/esm/components/smart-pagination/CSmartPagination.js.map +1 -1
  405. package/dist/esm/components/smart-table/CSmartTable.js.map +1 -1
  406. package/dist/esm/components/smart-table/CSmartTableBody.js.map +1 -1
  407. package/dist/esm/components/smart-table/CSmartTableHead.js.map +1 -1
  408. package/dist/esm/components/smart-table/utils.js.map +1 -1
  409. package/dist/esm/components/spinner/CSpinner.js.map +1 -1
  410. package/dist/esm/components/table/CTable.js.map +1 -1
  411. package/dist/esm/components/table/CTableBody.js.map +1 -1
  412. package/dist/esm/components/table/CTableCaption.js.map +1 -1
  413. package/dist/esm/components/table/CTableDataCell.js.map +1 -1
  414. package/dist/esm/components/table/CTableFoot.js.map +1 -1
  415. package/dist/esm/components/table/CTableHead.js.map +1 -1
  416. package/dist/esm/components/table/CTableHeaderCell.js.map +1 -1
  417. package/dist/esm/components/table/CTableResponsiveWrapper.js.map +1 -1
  418. package/dist/esm/components/table/CTableRow.js.map +1 -1
  419. package/dist/esm/components/table/utils.js.map +1 -1
  420. package/dist/esm/components/tabs/CTab.js.map +1 -1
  421. package/dist/esm/components/tabs/CTabContent.js.map +1 -1
  422. package/dist/esm/components/tabs/CTabList.js +1 -1
  423. package/dist/esm/components/tabs/CTabList.js.map +1 -1
  424. package/dist/esm/components/tabs/CTabPane.js +1 -1
  425. package/dist/esm/components/tabs/CTabPane.js.map +1 -1
  426. package/dist/esm/components/tabs/CTabPanel.js +1 -1
  427. package/dist/esm/components/tabs/CTabPanel.js.map +1 -1
  428. package/dist/esm/components/tabs/CTabs.js.map +1 -1
  429. package/dist/esm/components/time-picker/CTimePicker.js +18 -10
  430. package/dist/esm/components/time-picker/CTimePicker.js.map +1 -1
  431. package/dist/esm/components/time-picker/CTimePickerRollCol.js +2 -1
  432. package/dist/esm/components/time-picker/CTimePickerRollCol.js.map +1 -1
  433. package/dist/esm/components/time-picker/utils.js.map +1 -1
  434. package/dist/esm/components/toast/CToast.js +1 -1
  435. package/dist/esm/components/toast/CToast.js.map +1 -1
  436. package/dist/esm/components/toast/CToastBody.js.map +1 -1
  437. package/dist/esm/components/toast/CToastClose.js.map +1 -1
  438. package/dist/esm/components/toast/CToastHeader.js.map +1 -1
  439. package/dist/esm/components/toast/CToaster.js.map +1 -1
  440. package/dist/esm/components/tooltip/CTooltip.js +50 -45
  441. package/dist/esm/components/tooltip/CTooltip.js.map +1 -1
  442. package/dist/esm/components/virtual-scroller/CVirtualScroller.js +6 -6
  443. package/dist/esm/components/virtual-scroller/CVirtualScroller.js.map +1 -1
  444. package/dist/esm/components/widgets/CWidgetStatsA.js.map +1 -1
  445. package/dist/esm/components/widgets/CWidgetStatsB.js.map +1 -1
  446. package/dist/esm/components/widgets/CWidgetStatsC.js.map +1 -1
  447. package/dist/esm/components/widgets/CWidgetStatsD.js.map +1 -1
  448. package/dist/esm/components/widgets/CWidgetStatsE.js.map +1 -1
  449. package/dist/esm/components/widgets/CWidgetStatsF.js.map +1 -1
  450. package/dist/esm/hooks/index.d.ts +2 -1
  451. package/dist/esm/hooks/useColorModes.js.map +1 -1
  452. package/dist/esm/hooks/useDebounce.js.map +1 -1
  453. package/dist/esm/hooks/useDebouncedCallback.js.map +1 -1
  454. package/dist/esm/hooks/useDropdownWithPopper.d.ts +10 -0
  455. package/dist/esm/hooks/useDropdownWithPopper.js +96 -0
  456. package/dist/esm/hooks/useDropdownWithPopper.js.map +1 -0
  457. package/dist/esm/hooks/useForkedRef.js.map +1 -1
  458. package/dist/esm/hooks/useIsVisible.js.map +1 -1
  459. package/dist/esm/hooks/usePopper.js.map +1 -1
  460. package/dist/esm/hooks/useStateWithCallback.js.map +1 -1
  461. package/dist/esm/index.js +2 -0
  462. package/dist/esm/index.js.map +1 -1
  463. package/dist/esm/node_modules/@babel/runtime/helpers/esm/extends.js.map +1 -1
  464. package/dist/esm/node_modules/@babel/runtime/helpers/esm/inheritsLoose.js.map +1 -1
  465. package/dist/esm/node_modules/@babel/runtime/helpers/esm/objectWithoutPropertiesLoose.js.map +1 -1
  466. package/dist/esm/node_modules/@babel/runtime/helpers/esm/setPrototypeOf.js.map +1 -1
  467. package/dist/esm/node_modules/@coreui/icons-react/dist/index.esm.js.map +1 -1
  468. package/dist/esm/node_modules/classnames/index.js.map +1 -1
  469. package/dist/esm/node_modules/dom-helpers/esm/addClass.js.map +1 -1
  470. package/dist/esm/node_modules/dom-helpers/esm/hasClass.js.map +1 -1
  471. package/dist/esm/node_modules/dom-helpers/esm/removeClass.js.map +1 -1
  472. package/dist/esm/node_modules/react-device-detect/dist/lib.js.map +1 -1
  473. package/dist/esm/node_modules/react-transition-group/esm/CSSTransition.js.map +1 -1
  474. package/dist/esm/node_modules/react-transition-group/esm/Transition.js.map +1 -1
  475. package/dist/esm/node_modules/react-transition-group/esm/config.js.map +1 -1
  476. package/dist/esm/node_modules/react-transition-group/esm/utils/PropTypes.js.map +1 -1
  477. package/dist/esm/node_modules/react-transition-group/esm/utils/reflow.js.map +1 -1
  478. package/dist/esm/packages/coreui-react-pro/node_modules/tslib/tslib.es6.js.map +1 -1
  479. package/dist/esm/props.js.map +1 -1
  480. package/dist/esm/utils/executeAfterTransition.js.map +1 -1
  481. package/dist/esm/utils/getNextActiveElement.js +1 -1
  482. package/dist/esm/utils/getNextActiveElement.js.map +1 -1
  483. package/dist/esm/utils/getRTLPlacement.js.map +1 -1
  484. package/dist/esm/utils/getTransitionDurationFromElement.js.map +1 -1
  485. package/dist/esm/utils/isInViewport.js.map +1 -1
  486. package/dist/esm/utils/isObjectInArray.js.map +1 -1
  487. package/dist/esm/utils/isRTL.js.map +1 -1
  488. package/package.json +11 -11
  489. package/src/components/calendar/utils.ts +6 -0
  490. package/src/components/date-range-picker/CDateRangePicker.tsx +18 -1
  491. package/src/components/index.ts +1 -0
  492. package/src/components/list-group/CListGroup.tsx +2 -1
  493. package/src/components/multi-select/CMultiSelect.tsx +196 -116
  494. package/src/components/multi-select/CMultiSelectOptions.tsx +8 -5
  495. package/src/components/multi-select/CMultiSelectSelection.tsx +10 -3
  496. package/src/components/multi-select/types.ts +9 -0
  497. package/src/components/multi-select/utils.ts +26 -1
  498. package/src/components/nav/CNavGroup.tsx +1 -1
  499. package/src/components/picker/CPicker.tsx +25 -4
  500. package/src/components/popover/CPopover.tsx +65 -46
  501. package/src/components/range-slider/CRangeSlider.tsx +377 -0
  502. package/src/components/range-slider/index.ts +3 -0
  503. package/src/components/range-slider/types.ts +16 -0
  504. package/src/components/range-slider/utils.ts +243 -0
  505. package/src/components/time-picker/CTimePicker.tsx +18 -1
  506. package/src/components/tooltip/CTooltip.tsx +65 -46
  507. package/src/components/virtual-scroller/CVirtualScroller.tsx +3 -2
  508. package/src/hooks/index.ts +2 -0
  509. package/src/hooks/useDropdownWithPopper.ts +123 -0
@@ -1,5 +1,4 @@
1
1
  import React, {
2
- FormEvent,
3
2
  forwardRef,
4
3
  HTMLAttributes,
5
4
  ReactNode,
@@ -12,18 +11,25 @@ import React, {
12
11
  import classNames from 'classnames'
13
12
  import PropTypes from 'prop-types'
14
13
 
15
- import type { Placement } from '@popperjs/core'
16
-
17
14
  import { CFormControlWrapper, CFormControlWrapperProps } from '../form/CFormControlWrapper'
18
15
 
16
+ import { CConditionalPortal } from '../conditional-portal'
19
17
  import { CMultiSelectNativeSelect } from './CMultiSelectNativeSelect'
20
18
  import { CMultiSelectOptions } from './CMultiSelectOptions'
21
19
  import { CMultiSelectSelection } from './CMultiSelectSelection'
22
20
 
23
- import { useForkedRef, usePopper } from '../../hooks'
24
- import { isRTL } from '../../utils'
25
- import { createOption, filterOptionsList, flattenOptionsArray, selectOptions } from './utils'
26
- import type { Option, OptionsGroup, SelectedOption } from './types'
21
+ import { useDropdownWithPopper } from '../../hooks'
22
+ import { getNextActiveElement } from '../../utils'
23
+ import {
24
+ createOption,
25
+ filterOptionsList,
26
+ flattenOptionsArray,
27
+ getOptionsList,
28
+ isExternalSearch,
29
+ isGlobalSearch,
30
+ selectOptions,
31
+ } from './utils'
32
+ import type { Option, OptionsGroup, Search, SelectedOption } from './types'
27
33
 
28
34
  export interface CMultiSelectProps
29
35
  extends Omit<CFormControlWrapperProps, 'floatingClassName' | 'floatingLabel'>,
@@ -34,6 +40,12 @@ export interface CMultiSelectProps
34
40
  * @since 4.11.0
35
41
  */
36
42
  allowCreateOptions?: boolean
43
+ /**
44
+ * A string that provides an accessible label for the cleaner button. This label is read by screen readers to describe the action associated with the button.
45
+ *
46
+ * @since 5.8.0
47
+ */
48
+ ariaCleanerLabel?: string
37
49
  /**
38
50
  * A string of all className you want applied to the base component.
39
51
  */
@@ -48,6 +60,12 @@ export interface CMultiSelectProps
48
60
  * @since 4.11.0
49
61
  */
50
62
  clearSearchOnSelect?: boolean
63
+ /**
64
+ * Appends the dropdown to a specific element. You can pass an HTML element or function that returns a single element.
65
+ *
66
+ * @since 5.8.0
67
+ */
68
+ container?: DocumentFragment | Element | (() => DocumentFragment | Element | null) | null
51
69
  /**
52
70
  * Toggle the disabled state for the component.
53
71
  */
@@ -121,6 +139,12 @@ export interface CMultiSelectProps
121
139
  * Specifies a short hint that is visible in the search input.
122
140
  */
123
141
  placeholder?: string
142
+ /**
143
+ * Generates dropdown menu using createPortal.
144
+ *
145
+ * @since 5.8.0
146
+ */
147
+ portal?: boolean
124
148
  /**
125
149
  * When it is present, it indicates that the user must choose a value before submitting the form.
126
150
  */
@@ -132,9 +156,14 @@ export interface CMultiSelectProps
132
156
  */
133
157
  resetSelectionOnOptionsChange?: boolean
134
158
  /**
135
- * Enables search input element.
159
+ * The `search` prop determines how the search input element is enabled and behaves. It accepts multiple types to provide flexibility in configuring search behavior:
160
+ *
161
+ * - `true` : Enables the default search input element with standard behavior.
162
+ * - `'external'`: Enables an external search mechanism, possibly integrating with external APIs or services.
163
+ * - `'global'`: When set, the user can perform searches across the entire component, regardless of where their focus is within the component.
164
+ * - `{ external?: boolean; global?: boolean }`: Allows for granular control over the search behavior by specifying individual properties. It is useful when you also want to use external and global search.
136
165
  */
137
- search?: boolean | 'external'
166
+ search?: Search
138
167
  /**
139
168
  * Sets the label for no results when filtering.
140
169
  */
@@ -181,9 +210,11 @@ export const CMultiSelect = forwardRef<HTMLDivElement, CMultiSelectProps>(
181
210
  (
182
211
  {
183
212
  allowCreateOptions,
213
+ ariaCleanerLabel = 'Clear all selections',
184
214
  className,
185
215
  cleaner = true,
186
216
  clearSearchOnSelect,
217
+ container,
187
218
  disabled,
188
219
  feedback,
189
220
  feedbackInvalid,
@@ -204,6 +235,7 @@ export const CMultiSelect = forwardRef<HTMLDivElement, CMultiSelectProps>(
204
235
  optionsTemplate,
205
236
  optionsGroupsTemplate,
206
237
  placeholder = 'Select...',
238
+ portal = false,
207
239
  required,
208
240
  resetSelectionOnOptionsChange = false,
209
241
  search = true,
@@ -223,19 +255,19 @@ export const CMultiSelect = forwardRef<HTMLDivElement, CMultiSelectProps>(
223
255
  },
224
256
  ref,
225
257
  ) => {
226
- const multiSelectRef = useRef<HTMLDivElement>(null)
227
- const multiSelectForkedRef = useForkedRef(ref, multiSelectRef)
228
-
229
- const dropdownRef = useRef<HTMLDivElement>(null)
258
+ const {
259
+ dropdownMenuElement,
260
+ dropdownRefElement,
261
+ isOpen,
262
+ closeDropdown,
263
+ openDropdown,
264
+ toggleDropdown,
265
+ updatePopper,
266
+ } = useDropdownWithPopper()
230
267
  const nativeSelectRef = useRef<HTMLSelectElement>(null)
231
- const togglerRef = useRef<HTMLDivElement>(null)
232
268
  const searchRef = useRef<HTMLInputElement>(null)
233
269
  const isInitialMount = useRef(true)
234
270
 
235
- const { popper, initPopper, destroyPopper } = usePopper()
236
-
237
- const [_options, setOptions] = useState<(Option | OptionsGroup)[]>(options)
238
- const [_visible, setVisible] = useState(visible)
239
271
  const [searchValue, setSearchValue] = useState('')
240
272
  const [selected, setSelected] = useState<SelectedOption[]>([])
241
273
  const [userOptions, setUserOptions] = useState<Option[]>([])
@@ -243,15 +275,15 @@ export const CMultiSelect = forwardRef<HTMLDivElement, CMultiSelectProps>(
243
275
  const filteredOptions = useMemo(
244
276
  () =>
245
277
  flattenOptionsArray(
246
- search === 'external'
247
- ? [..._options, ...filterOptionsList(searchValue, userOptions)]
248
- : filterOptionsList(searchValue, [..._options, ...userOptions]),
278
+ isExternalSearch(search)
279
+ ? [...options, ...filterOptionsList(searchValue, userOptions)]
280
+ : filterOptionsList(searchValue, [...options, ...userOptions]),
249
281
  true,
250
282
  ),
251
- [_options, searchValue, userOptions],
283
+ [options, searchValue, userOptions],
252
284
  )
253
285
 
254
- const flattenedOptions = useMemo(() => flattenOptionsArray(options), [JSON.stringify(options)])
286
+ const flattenedOptions = useMemo(() => flattenOptionsArray(options), [options])
255
287
 
256
288
  const userOption = useMemo(() => {
257
289
  if (
@@ -266,27 +298,7 @@ export const CMultiSelect = forwardRef<HTMLDivElement, CMultiSelectProps>(
266
298
  return searchRef.current && createOption(String(searchValue), flattenedOptions)
267
299
  }, [filteredOptions, searchValue])
268
300
 
269
- const popperConfig = {
270
- placement: (isRTL(multiSelectRef.current) ? 'bottom-end' : 'bottom-start') as Placement,
271
- modifiers: [
272
- {
273
- name: 'preventOverflow',
274
- options: {
275
- boundary: 'clippingParents',
276
- },
277
- },
278
- {
279
- name: 'offset',
280
- options: {
281
- offset: [0, 2],
282
- },
283
- },
284
- ],
285
- }
286
-
287
301
  useEffect(() => {
288
- setOptions(options)
289
-
290
302
  if (resetSelectionOnOptionsChange) {
291
303
  return setSelected([])
292
304
  }
@@ -296,8 +308,10 @@ export const CMultiSelect = forwardRef<HTMLDivElement, CMultiSelectProps>(
296
308
  (option: Option) => option.selected === false,
297
309
  ) as Option[]
298
310
 
299
- _selected && setSelected(selectOptions(_selected, selected, deselected))
300
- }, [JSON.stringify(options)])
311
+ if (_selected.length > 0) {
312
+ setSelected(selectOptions(multiple, _selected, selected, deselected))
313
+ }
314
+ }, [flattenedOptions])
301
315
 
302
316
  useEffect(() => {
303
317
  !isInitialMount.current && onFilterChange && onFilterChange(searchValue)
@@ -308,63 +322,67 @@ export const CMultiSelect = forwardRef<HTMLDivElement, CMultiSelectProps>(
308
322
  nativeSelectRef.current.dispatchEvent(new Event('change', { bubbles: true }))
309
323
  }
310
324
 
311
- if (popper) {
312
- popper.update()
313
- }
325
+ updatePopper()
314
326
  }, [JSON.stringify(selected)])
315
327
 
316
328
  useEffect(() => {
317
- if (_visible) {
318
- onShow && onShow()
329
+ visible ? openDropdown() : closeDropdown()
330
+ }, [visible])
331
+
332
+ useEffect(() => {
333
+ if (isOpen) {
334
+ if (onShow) onShow()
319
335
 
320
- window.addEventListener('mouseup', handleMouseUp)
321
- window.addEventListener('keyup', handleKeyUp)
336
+ if (portal && dropdownMenuElement.current && dropdownRefElement.current) {
337
+ dropdownMenuElement.current.style.minWidth = `${(dropdownRefElement.current as HTMLElement).offsetWidth}px`
338
+ }
322
339
 
323
- togglerRef.current &&
324
- dropdownRef.current &&
325
- initPopper(togglerRef.current, dropdownRef.current, popperConfig)
326
- searchRef.current && searchRef.current.focus()
340
+ searchRef.current?.focus()
327
341
  }
328
342
 
329
343
  return () => {
330
- onHide && onHide()
344
+ if (onHide) onHide()
331
345
 
332
346
  setSearchValue('')
333
347
  if (searchRef.current) {
334
348
  searchRef.current.value = ''
335
349
  }
336
-
337
- window.removeEventListener('mouseup', handleMouseUp)
338
- window.removeEventListener('keyup', handleKeyUp)
339
-
340
- destroyPopper()
341
350
  }
342
- }, [_visible])
351
+ }, [isOpen])
343
352
 
344
353
  useEffect(() => {
345
354
  isInitialMount.current = false
346
355
  }, [])
347
356
 
348
- const handleKeyUp = (event: KeyboardEvent) => {
349
- if (event.key === 'Escape') {
350
- setVisible(false)
351
- }
357
+ const handleSearchChange = (event: React.ChangeEvent<HTMLInputElement>) => {
358
+ setSearchValue(event.target.value)
352
359
  }
353
360
 
354
- const handleMouseUp = (event: Event) => {
355
- if (multiSelectRef.current && multiSelectRef.current.contains(event.target as HTMLElement)) {
356
- return
361
+ const handleSearchKeyDown = (event: React.KeyboardEvent<HTMLInputElement>) => {
362
+ if (!isOpen) {
363
+ openDropdown()
357
364
  }
358
365
 
359
- setVisible(false)
360
- }
366
+ if (
367
+ event.key === 'ArrowDown' &&
368
+ dropdownMenuElement.current &&
369
+ searchRef.current &&
370
+ searchRef.current.value.length === searchRef.current.selectionStart
371
+ ) {
372
+ event.preventDefault()
361
373
 
362
- const handleSearchChange = (event: FormEvent<HTMLInputElement>) => {
363
- const value = (event.target as HTMLInputElement).value
364
- setSearchValue(value)
365
- }
374
+ const items = getOptionsList(dropdownMenuElement.current)
375
+ const target = event.target as HTMLDivElement
376
+
377
+ getNextActiveElement(
378
+ items,
379
+ target,
380
+ event.key === 'ArrowDown',
381
+ !items.includes(target),
382
+ ).focus()
383
+ return
384
+ }
366
385
 
367
- const handleSearchKeyDown = (event: React.KeyboardEvent<HTMLInputElement>) => {
368
386
  if (event.key === 'Enter' && searchValue && allowCreateOptions) {
369
387
  event.preventDefault()
370
388
 
@@ -396,14 +414,48 @@ export const CMultiSelect = forwardRef<HTMLDivElement, CMultiSelectProps>(
396
414
 
397
415
  if (event.key === 'Backspace' || event.key === 'Delete') {
398
416
  const last = selected.filter((option: Option) => !option.disabled).pop()
399
- last && setSelected(selected.filter((option: Option) => option.value !== last.value))
417
+
418
+ if (last) {
419
+ setSelected(selected.filter((option: Option) => option.value !== last.value))
420
+ }
421
+ }
422
+ }
423
+
424
+ const handleTogglerKeyDown = (event: React.KeyboardEvent<HTMLInputElement>) => {
425
+ if (!isOpen && (event.key === 'Enter' || event.key === 'ArrowDown')) {
426
+ event.preventDefault()
427
+ openDropdown()
428
+ return
429
+ }
430
+
431
+ if (isOpen && dropdownMenuElement.current && event.key === 'ArrowDown') {
432
+ event.preventDefault()
433
+ const items = getOptionsList(dropdownMenuElement.current)
434
+ const target = event.target as HTMLDivElement
435
+
436
+ getNextActiveElement(
437
+ items,
438
+ target,
439
+ event.key === 'ArrowDown',
440
+ !items.includes(target),
441
+ ).focus()
400
442
  }
401
443
  }
402
444
 
403
- const handleOptionOnClick = (option: Option) => {
445
+ const handleGlobalSearch = (event: React.KeyboardEvent<HTMLDivElement>) => {
446
+ if (
447
+ isGlobalSearch(search) &&
448
+ searchRef.current &&
449
+ (event.key.length === 1 || event.key === 'Backspace' || event.key === 'Delete')
450
+ ) {
451
+ searchRef.current.focus()
452
+ }
453
+ }
454
+
455
+ const handleOnOptionClick = (option: Option) => {
404
456
  if (!multiple) {
405
457
  setSelected([option] as SelectedOption[])
406
- setVisible(false)
458
+ closeDropdown()
407
459
  setSearchValue('')
408
460
  if (searchRef.current) {
409
461
  searchRef.current.value = ''
@@ -434,6 +486,7 @@ export const CMultiSelect = forwardRef<HTMLDivElement, CMultiSelectProps>(
434
486
  const handleSelectAll = () => {
435
487
  setSelected(
436
488
  selectOptions(
489
+ multiple,
437
490
  [...flattenedOptions.filter((option: Option) => !option.disabled), ...userOptions],
438
491
  selected,
439
492
  ),
@@ -479,22 +532,25 @@ export const CMultiSelect = forwardRef<HTMLDivElement, CMultiSelectProps>(
479
532
  disabled,
480
533
  'is-invalid': invalid,
481
534
  'is-valid': valid,
482
- show: _visible,
535
+ show: isOpen,
483
536
  },
484
537
  className,
485
538
  )}
486
- aria-expanded={_visible}
487
- ref={multiSelectForkedRef}
539
+ onKeyDown={handleGlobalSearch}
540
+ aria-expanded={isOpen}
541
+ ref={ref}
488
542
  >
489
543
  <div
490
544
  className="form-multi-select-input-group"
491
- onClick={() => !disabled && setVisible(true)}
492
- ref={togglerRef}
545
+ {...(!search && !disabled && { tabIndex: 0 })}
546
+ onClick={() => !disabled && openDropdown()}
547
+ onKeyDown={handleTogglerKeyDown}
548
+ ref={dropdownRefElement}
493
549
  >
494
550
  <CMultiSelectSelection
495
551
  disabled={disabled}
496
552
  multiple={multiple}
497
- onRemove={(option) => !disabled && handleOptionOnClick(option)}
553
+ onRemove={(option) => !disabled && handleOnOptionClick(option)}
498
554
  placeholder={placeholder}
499
555
  search={search}
500
556
  selected={selected}
@@ -522,6 +578,9 @@ export const CMultiSelect = forwardRef<HTMLDivElement, CMultiSelectProps>(
522
578
  ref={searchRef}
523
579
  ></input>
524
580
  )}
581
+ {!search && selected.length === 0 && (
582
+ <span className="form-multi-select-placeholder">{placeholder}</span>
583
+ )}
525
584
  </CMultiSelectSelection>
526
585
  <div className="form-multi-select-buttons">
527
586
  {!disabled && cleaner && selected.length > 0 && (
@@ -529,6 +588,7 @@ export const CMultiSelect = forwardRef<HTMLDivElement, CMultiSelectProps>(
529
588
  type="button"
530
589
  className="form-multi-select-cleaner"
531
590
  onClick={() => handleDeselectAll()}
591
+ aria-label={ariaCleanerLabel}
532
592
  ></button>
533
593
  )}
534
594
  <button
@@ -539,41 +599,50 @@ export const CMultiSelect = forwardRef<HTMLDivElement, CMultiSelectProps>(
539
599
  event.stopPropagation()
540
600
 
541
601
  if (!disabled) {
542
- setVisible(!_visible)
602
+ toggleDropdown()
543
603
  }
544
604
  }}
545
605
  {...(disabled && { tabIndex: -1 })}
546
606
  ></button>
547
607
  </div>
548
608
  </div>
549
- <div className="form-multi-select-dropdown" role="menu" ref={dropdownRef}>
550
- {multiple && selectAll && (
551
- <button
552
- type="button"
553
- className="form-multi-select-all"
554
- onClick={() => handleSelectAll()}
555
- >
556
- {selectAllLabel}
557
- </button>
558
- )}
559
- <CMultiSelectOptions
560
- handleOptionOnClick={(option) => !disabled && handleOptionOnClick(option)}
561
- loading={loading}
562
- options={
563
- filteredOptions.length === 0 && allowCreateOptions
564
- ? userOption || []
565
- : filteredOptions
566
- }
567
- optionsMaxHeight={optionsMaxHeight}
568
- optionsStyle={optionsStyle}
569
- optionsTemplate={optionsTemplate}
570
- optionsGroupsTemplate={optionsGroupsTemplate}
571
- searchNoResultsLabel={searchNoResultsLabel}
572
- selected={selected}
573
- virtualScroller={virtualScroller}
574
- visibleItems={visibleItems}
575
- />
576
- </div>
609
+ <CConditionalPortal container={container} portal={portal}>
610
+ <div
611
+ className={classNames('form-multi-select-dropdown', {
612
+ show: portal && isOpen,
613
+ })}
614
+ onKeyDown={handleGlobalSearch}
615
+ role="menu"
616
+ ref={dropdownMenuElement}
617
+ >
618
+ {multiple && selectAll && (
619
+ <button
620
+ type="button"
621
+ className="form-multi-select-all"
622
+ onClick={() => handleSelectAll()}
623
+ >
624
+ {selectAllLabel}
625
+ </button>
626
+ )}
627
+ <CMultiSelectOptions
628
+ loading={loading}
629
+ onOptionOnClick={(option) => !disabled && handleOnOptionClick(option)}
630
+ options={
631
+ filteredOptions.length === 0 && allowCreateOptions
632
+ ? userOption || []
633
+ : filteredOptions
634
+ }
635
+ optionsMaxHeight={optionsMaxHeight}
636
+ optionsStyle={optionsStyle}
637
+ optionsTemplate={optionsTemplate}
638
+ optionsGroupsTemplate={optionsGroupsTemplate}
639
+ searchNoResultsLabel={searchNoResultsLabel}
640
+ selected={selected}
641
+ virtualScroller={virtualScroller}
642
+ visibleItems={visibleItems}
643
+ />
644
+ </div>
645
+ </CConditionalPortal>
577
646
  </div>
578
647
  </CFormControlWrapper>
579
648
  )
@@ -581,9 +650,12 @@ export const CMultiSelect = forwardRef<HTMLDivElement, CMultiSelectProps>(
581
650
  )
582
651
 
583
652
  CMultiSelect.propTypes = {
653
+ allowCreateOptions: PropTypes.bool,
654
+ ariaCleanerLabel: PropTypes.string,
584
655
  className: PropTypes.string,
585
656
  cleaner: PropTypes.bool,
586
657
  clearSearchOnSelect: PropTypes.bool,
658
+ container: PropTypes.any,
587
659
  disabled: PropTypes.bool,
588
660
  loading: PropTypes.bool,
589
661
  multiple: PropTypes.bool,
@@ -598,9 +670,17 @@ CMultiSelect.propTypes = {
598
670
  optionsTemplate: PropTypes.func,
599
671
  optionsGroupsTemplate: PropTypes.func,
600
672
  placeholder: PropTypes.string,
673
+ portal: PropTypes.bool,
601
674
  required: PropTypes.bool,
602
675
  resetSelectionOnOptionsChange: PropTypes.bool,
603
- search: PropTypes.oneOfType([PropTypes.bool, PropTypes.oneOf<'external'>(['external'])]),
676
+ search: PropTypes.oneOfType([
677
+ PropTypes.bool,
678
+ PropTypes.oneOf<'external' | 'global'>(['external', 'global']),
679
+ PropTypes.shape({
680
+ external: PropTypes.bool.isRequired,
681
+ global: PropTypes.bool.isRequired,
682
+ }),
683
+ ]),
604
684
  searchNoResultsLabel: PropTypes.oneOfType([PropTypes.string, PropTypes.node]),
605
685
  selectAll: PropTypes.bool,
606
686
  selectAllLabel: PropTypes.oneOfType([PropTypes.string, PropTypes.node]),
@@ -9,8 +9,8 @@ import { getNextSibling, getPreviousSibling } from './utils'
9
9
  import type { Option, OptionsGroup } from './types'
10
10
 
11
11
  export interface CMultiSelectOptionsProps extends HTMLAttributes<HTMLDivElement> {
12
- handleOptionOnClick?: (option: Option) => void
13
12
  loading?: boolean
13
+ onOptionOnClick?: (option: Option) => void
14
14
  options: (Option | OptionsGroup)[]
15
15
  optionsMaxHeight?: number | string
16
16
  optionsStyle?: 'checkbox' | 'text'
@@ -25,8 +25,9 @@ export interface CMultiSelectOptionsProps extends HTMLAttributes<HTMLDivElement>
25
25
  export const CMultiSelectOptions = forwardRef<HTMLDivElement, CMultiSelectOptionsProps>(
26
26
  (
27
27
  {
28
- handleOptionOnClick,
29
28
  loading,
29
+ onKeyDown,
30
+ onOptionOnClick,
30
31
  options,
31
32
  optionsMaxHeight,
32
33
  optionsStyle,
@@ -42,7 +43,7 @@ export const CMultiSelectOptions = forwardRef<HTMLDivElement, CMultiSelectOption
42
43
  const handleKeyDown = (event: React.KeyboardEvent<HTMLDivElement>, option: Option) => {
43
44
  if (event.code === 'Space' || event.key === 'Enter') {
44
45
  event.preventDefault()
45
- handleOptionOnClick && handleOptionOnClick(option)
46
+ onOptionOnClick && onOptionOnClick(option)
46
47
  }
47
48
 
48
49
  if (event.key === 'Down' || event.key === 'ArrowDown') {
@@ -73,7 +74,7 @@ export const CMultiSelectOptions = forwardRef<HTMLDivElement, CMultiSelectOption
73
74
  disabled: option.disabled,
74
75
  })}
75
76
  key={index}
76
- onClick={() => handleOptionOnClick && handleOptionOnClick(option as Option)}
77
+ onClick={() => onOptionOnClick && onOptionOnClick(option as Option)}
77
78
  onKeyDown={(event) => handleKeyDown(event, option as Option)}
78
79
  tabIndex={0}
79
80
  >
@@ -94,6 +95,7 @@ export const CMultiSelectOptions = forwardRef<HTMLDivElement, CMultiSelectOption
94
95
  {virtualScroller ? (
95
96
  <CVirtualScroller
96
97
  className="form-multi-select-options"
98
+ onKeyDown={onKeyDown}
97
99
  visibleItems={visibleItems}
98
100
  ref={ref}
99
101
  >
@@ -102,6 +104,7 @@ export const CMultiSelectOptions = forwardRef<HTMLDivElement, CMultiSelectOption
102
104
  ) : (
103
105
  <div
104
106
  className="form-multi-select-options"
107
+ onKeyDown={onKeyDown}
105
108
  {...(optionsMaxHeight !== 'auto' && {
106
109
  style: { maxHeight: optionsMaxHeight, overflow: 'scroll' },
107
110
  })}
@@ -117,8 +120,8 @@ export const CMultiSelectOptions = forwardRef<HTMLDivElement, CMultiSelectOption
117
120
  )
118
121
 
119
122
  CMultiSelectOptions.propTypes = {
120
- handleOptionOnClick: PropTypes.func,
121
123
  loading: PropTypes.bool,
124
+ onOptionOnClick: PropTypes.func,
122
125
  options: PropTypes.array.isRequired,
123
126
  optionsMaxHeight: PropTypes.oneOfType([PropTypes.number, PropTypes.string]),
124
127
  optionsStyle: PropTypes.oneOf(['checkbox', 'text']),
@@ -3,14 +3,14 @@ import React, { forwardRef, HTMLAttributes } from 'react'
3
3
  import classNames from 'classnames'
4
4
  import PropTypes from 'prop-types'
5
5
 
6
- import type { SelectedOption } from './types'
6
+ import type { Search, SelectedOption } from './types'
7
7
 
8
8
  export interface CMultiSelectSelectionProps extends HTMLAttributes<HTMLSpanElement> {
9
9
  disabled?: boolean
10
10
  multiple?: boolean
11
11
  onRemove?: (option: SelectedOption) => void
12
12
  placeholder?: string
13
- search?: boolean | 'external'
13
+ search?: Search
14
14
  selected?: SelectedOption[]
15
15
  selectionType?: 'counter' | 'tags' | 'text'
16
16
  selectionTypeCounterText?: string
@@ -85,7 +85,14 @@ CMultiSelectSelection.propTypes = {
85
85
  multiple: PropTypes.bool,
86
86
  onRemove: PropTypes.func,
87
87
  placeholder: PropTypes.string,
88
- search: PropTypes.oneOfType([PropTypes.bool, PropTypes.oneOf<'external'>(['external'])]),
88
+ search: PropTypes.oneOfType([
89
+ PropTypes.bool,
90
+ PropTypes.oneOf<'external' | 'global'>(['external', 'global']),
91
+ PropTypes.shape({
92
+ external: PropTypes.bool.isRequired,
93
+ global: PropTypes.bool.isRequired,
94
+ }),
95
+ ]),
89
96
  selected: PropTypes.array,
90
97
  selectionType: PropTypes.oneOf(['counter', 'tags', 'text']),
91
98
  selectionTypeCounterText: PropTypes.string,
@@ -13,6 +13,15 @@ export type OptionsGroup = {
13
13
  [key: string]: number | string | any
14
14
  }
15
15
 
16
+ export type Search =
17
+ | boolean
18
+ | 'external'
19
+ | 'global'
20
+ | {
21
+ external?: boolean
22
+ global?: boolean
23
+ }
24
+
16
25
  export type SelectedOption = {
17
26
  disabled?: boolean
18
27
  label: string
@@ -1,4 +1,4 @@
1
- import type { Option, OptionsGroup, SelectedOption } from './types'
1
+ import type { Option, OptionsGroup, Search, SelectedOption } from './types'
2
2
 
3
3
  export const createOption = (label: string, options: (Option | OptionsGroup)[]) => {
4
4
  const value = label.toLowerCase().replace(/\s/g, '-')
@@ -83,6 +83,12 @@ export const getNextSibling = (elem: HTMLElement, selector?: string) => {
83
83
  return
84
84
  }
85
85
 
86
+ export const getOptionsList = (container: HTMLElement): HTMLElement[] => {
87
+ return Array.from(
88
+ container.querySelectorAll('.form-multi-select-option:not(.disabled):not(:disabled)'),
89
+ )
90
+ }
91
+
86
92
  export const getPreviousSibling = (elem: HTMLElement, selector?: string) => {
87
93
  // Get the next sibling element
88
94
  let sibling = elem.previousElementSibling
@@ -100,11 +106,30 @@ export const getPreviousSibling = (elem: HTMLElement, selector?: string) => {
100
106
  return
101
107
  }
102
108
 
109
+ export const isExternalSearch = (search: Search): boolean => {
110
+ return (
111
+ (typeof search === 'string' && search === 'external') ||
112
+ (typeof search === 'object' && search.external === true)
113
+ )
114
+ }
115
+
116
+ export const isGlobalSearch = (search: Search): boolean => {
117
+ return (
118
+ (typeof search === 'string' && search === 'global') ||
119
+ (typeof search === 'object' && search.global === true)
120
+ )
121
+ }
122
+
103
123
  export const selectOptions = (
124
+ multiple: boolean,
104
125
  options: (Option | OptionsGroup)[],
105
126
  selected: SelectedOption[],
106
127
  deselected?: Option[],
107
128
  ) => {
129
+ if (!multiple) {
130
+ return [options[0]] as SelectedOption[]
131
+ }
132
+
108
133
  let _selected = [...selected, ...options]
109
134
 
110
135
  if (deselected) {