@coreui/react-pro 5.11.0 → 5.13.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 (280) 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 +2 -2
  4. package/dist/cjs/components/accordion/CAccordionBody.js.map +1 -1
  5. package/dist/cjs/components/accordion/CAccordionItem.d.ts +4 -0
  6. package/dist/cjs/components/accordion/CAccordionItem.js +4 -4
  7. package/dist/cjs/components/accordion/CAccordionItem.js.map +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/backdrop/CBackdrop.js.map +1 -1
  11. package/dist/cjs/components/badge/CBadge.js.map +1 -1
  12. package/dist/cjs/components/button/CButton.js.map +1 -1
  13. package/dist/cjs/components/calendar/CCalendar.js +53 -38
  14. package/dist/cjs/components/calendar/CCalendar.js.map +1 -1
  15. package/dist/cjs/components/calendar/CCalendarNavigation.js.map +1 -1
  16. package/dist/cjs/components/calendar/CCalendarPanel.js.map +1 -1
  17. package/dist/cjs/components/calendar/utils.d.ts +8 -0
  18. package/dist/cjs/components/calendar/utils.js +16 -0
  19. package/dist/cjs/components/calendar/utils.js.map +1 -1
  20. package/dist/cjs/components/card/CCardHeader.js.map +1 -1
  21. package/dist/cjs/components/card/CCardSubtitle.js.map +1 -1
  22. package/dist/cjs/components/card/CCardText.js.map +1 -1
  23. package/dist/cjs/components/card/CCardTitle.js.map +1 -1
  24. package/dist/cjs/components/carousel/CCarousel.js.map +1 -1
  25. package/dist/cjs/components/carousel/CCarouselItem.js.map +1 -1
  26. package/dist/cjs/components/date-picker/CDatePicker.js.map +1 -1
  27. package/dist/cjs/components/date-range-picker/CDateRangePicker.js +53 -33
  28. package/dist/cjs/components/date-range-picker/CDateRangePicker.js.map +1 -1
  29. package/dist/cjs/components/dropdown/CDropdown.d.ts +77 -20
  30. package/dist/cjs/components/dropdown/CDropdown.js +6 -3
  31. package/dist/cjs/components/dropdown/CDropdown.js.map +1 -1
  32. package/dist/cjs/components/dropdown/CDropdownHeader.js.map +1 -1
  33. package/dist/cjs/components/dropdown/CDropdownItem.js.map +1 -1
  34. package/dist/cjs/components/dropdown/CDropdownItemPlain.js.map +1 -1
  35. package/dist/cjs/components/dropdown/CDropdownMenu.js +1 -1
  36. package/dist/cjs/components/dropdown/CDropdownMenu.js.map +1 -1
  37. package/dist/cjs/components/dropdown/CDropdownToggle.js.map +1 -1
  38. package/dist/cjs/components/form/CFormCheck.js.map +1 -1
  39. package/dist/cjs/components/form/CFormFeedback.js.map +1 -1
  40. package/dist/cjs/components/form/CFormInput.js.map +1 -1
  41. package/dist/cjs/components/form/CFormLabel.js.map +1 -1
  42. package/dist/cjs/components/form/CFormText.js.map +1 -1
  43. package/dist/cjs/components/form/CInputGroupText.js.map +1 -1
  44. package/dist/cjs/components/header/CHeaderBrand.js.map +1 -1
  45. package/dist/cjs/components/header/CHeaderNav.js.map +1 -1
  46. package/dist/cjs/components/header/CHeaderToggler.js.map +1 -1
  47. package/dist/cjs/components/index.d.ts +1 -0
  48. package/dist/cjs/components/link/CLink.js.map +1 -1
  49. package/dist/cjs/components/list-group/CListGroup.js.map +1 -1
  50. package/dist/cjs/components/list-group/CListGroupItem.js.map +1 -1
  51. package/dist/cjs/components/loading-button/CLoadingButton.js.map +1 -1
  52. package/dist/cjs/components/modal/CModal.js.map +1 -1
  53. package/dist/cjs/components/modal/CModalHeader.js.map +1 -1
  54. package/dist/cjs/components/modal/CModalTitle.js.map +1 -1
  55. package/dist/cjs/components/multi-select/CMultiSelect.d.ts +6 -0
  56. package/dist/cjs/components/multi-select/CMultiSelect.js +21 -4
  57. package/dist/cjs/components/multi-select/CMultiSelect.js.map +1 -1
  58. package/dist/cjs/components/multi-select/CMultiSelectNativeSelect.js.map +1 -1
  59. package/dist/cjs/components/multi-select/CMultiSelectOptions.js.map +1 -1
  60. package/dist/cjs/components/multi-select/CMultiSelectSelection.js.map +1 -1
  61. package/dist/cjs/components/nav/CNav.js.map +1 -1
  62. package/dist/cjs/components/nav/CNavGroup.js.map +1 -1
  63. package/dist/cjs/components/nav/CNavGroupItems.js.map +1 -1
  64. package/dist/cjs/components/nav/CNavItem.js.map +1 -1
  65. package/dist/cjs/components/nav/CNavLink.js.map +1 -1
  66. package/dist/cjs/components/nav/CNavTitle.js.map +1 -1
  67. package/dist/cjs/components/navbar/CNavbar.js.map +1 -1
  68. package/dist/cjs/components/navbar/CNavbarBrand.js.map +1 -1
  69. package/dist/cjs/components/navbar/CNavbarNav.js.map +1 -1
  70. package/dist/cjs/components/navbar/CNavbarToggler.js.map +1 -1
  71. package/dist/cjs/components/offcanvas/COffcanvas.js.map +1 -1
  72. package/dist/cjs/components/offcanvas/COffcanvasTitle.js.map +1 -1
  73. package/dist/cjs/components/pagination/CPaginationItem.js.map +1 -1
  74. package/dist/cjs/components/password-input/CPasswordInput.d.ts +43 -0
  75. package/dist/cjs/components/password-input/CPasswordInput.js +35 -0
  76. package/dist/cjs/components/password-input/CPasswordInput.js.map +1 -0
  77. package/dist/cjs/components/password-input/index.d.ts +2 -0
  78. package/dist/cjs/components/picker/CPicker.js.map +1 -1
  79. package/dist/cjs/components/placeholder/CPlaceholder.js.map +1 -1
  80. package/dist/cjs/components/popover/CPopover.d.ts +75 -20
  81. package/dist/cjs/components/popover/CPopover.js +8 -21
  82. package/dist/cjs/components/popover/CPopover.js.map +1 -1
  83. package/dist/cjs/components/progress/CProgressBar.js.map +1 -1
  84. package/dist/cjs/components/range-slider/CRangeSlider.js.map +1 -1
  85. package/dist/cjs/components/rating/CRating.js.map +1 -1
  86. package/dist/cjs/components/sidebar/CSidebar.js.map +1 -1
  87. package/dist/cjs/components/sidebar/CSidebarBrand.js.map +1 -1
  88. package/dist/cjs/components/sidebar/CSidebarNav.js.map +1 -1
  89. package/dist/cjs/components/smart-pagination/CSmartPagination.js.map +1 -1
  90. package/dist/cjs/components/smart-table/CSmartTable.js.map +1 -1
  91. package/dist/cjs/components/smart-table/CSmartTableBody.js.map +1 -1
  92. package/dist/cjs/components/smart-table/CSmartTableHead.js +3 -1
  93. package/dist/cjs/components/smart-table/CSmartTableHead.js.map +1 -1
  94. package/dist/cjs/components/smart-table/types.d.ts +1 -1
  95. package/dist/cjs/components/smart-table/utils.js.map +1 -1
  96. package/dist/cjs/components/spinner/CSpinner.js.map +1 -1
  97. package/dist/cjs/components/tabs/CTab.js.map +1 -1
  98. package/dist/cjs/components/tabs/CTabList.js.map +1 -1
  99. package/dist/cjs/components/tabs/CTabPane.js.map +1 -1
  100. package/dist/cjs/components/tabs/CTabPanel.js.map +1 -1
  101. package/dist/cjs/components/time-picker/CTimePicker.js +13 -7
  102. package/dist/cjs/components/time-picker/CTimePicker.js.map +1 -1
  103. package/dist/cjs/components/time-picker/CTimePickerRollCol.js.map +1 -1
  104. package/dist/cjs/components/time-picker/utils.d.ts +10 -0
  105. package/dist/cjs/components/time-picker/utils.js +25 -9
  106. package/dist/cjs/components/time-picker/utils.js.map +1 -1
  107. package/dist/cjs/components/toast/CToast.js.map +1 -1
  108. package/dist/cjs/components/tooltip/CTooltip.d.ts +67 -15
  109. package/dist/cjs/components/tooltip/CTooltip.js +8 -21
  110. package/dist/cjs/components/tooltip/CTooltip.js.map +1 -1
  111. package/dist/cjs/components/widgets/CWidgetStatsF.js.map +1 -1
  112. package/dist/cjs/hooks/useClipboard.js.map +1 -1
  113. package/dist/cjs/hooks/useColorModes.js +5 -5
  114. package/dist/cjs/hooks/useColorModes.js.map +1 -1
  115. package/dist/cjs/hooks/useDebouncedCallback.js.map +1 -1
  116. package/dist/cjs/index.js +2 -0
  117. package/dist/cjs/index.js.map +1 -1
  118. package/dist/cjs/node_modules/@coreui/icons-react/dist/index.esm.js.map +1 -1
  119. package/dist/cjs/node_modules/dom-helpers/esm/hasClass.js.map +1 -1
  120. package/dist/cjs/node_modules/react-device-detect/dist/lib.js +1 -1
  121. package/dist/cjs/node_modules/react-device-detect/dist/lib.js.map +1 -1
  122. package/dist/cjs/node_modules/react-transition-group/esm/CSSTransition.js +9 -9
  123. package/dist/cjs/node_modules/react-transition-group/esm/CSSTransition.js.map +1 -1
  124. package/dist/cjs/node_modules/react-transition-group/esm/Transition.js.map +1 -1
  125. package/dist/cjs/node_modules/tslib/tslib.es6.js.map +1 -1
  126. package/dist/cjs/node_modules/ua-parser-js/dist/ua-parser.min.js.map +1 -1
  127. package/dist/cjs/utils/executeAfterTransition.js.map +1 -1
  128. package/dist/cjs/utils/getNextActiveElement.js.map +1 -1
  129. package/dist/cjs/utils/isObjectInArray.js.map +1 -1
  130. package/dist/esm/components/accordion/CAccordion.js.map +1 -1
  131. package/dist/esm/components/accordion/CAccordionBody.js +2 -2
  132. package/dist/esm/components/accordion/CAccordionBody.js.map +1 -1
  133. package/dist/esm/components/accordion/CAccordionItem.d.ts +4 -0
  134. package/dist/esm/components/accordion/CAccordionItem.js +4 -4
  135. package/dist/esm/components/accordion/CAccordionItem.js.map +1 -1
  136. package/dist/esm/components/alert/CAlert.js.map +1 -1
  137. package/dist/esm/components/alert/CAlertHeading.js.map +1 -1
  138. package/dist/esm/components/avatar/CAvatar.js +1 -1
  139. package/dist/esm/components/backdrop/CBackdrop.js.map +1 -1
  140. package/dist/esm/components/badge/CBadge.js +1 -1
  141. package/dist/esm/components/badge/CBadge.js.map +1 -1
  142. package/dist/esm/components/button/CButton.js.map +1 -1
  143. package/dist/esm/components/calendar/CCalendar.js +54 -39
  144. package/dist/esm/components/calendar/CCalendar.js.map +1 -1
  145. package/dist/esm/components/calendar/CCalendarNavigation.js.map +1 -1
  146. package/dist/esm/components/calendar/CCalendarPanel.js.map +1 -1
  147. package/dist/esm/components/calendar/utils.d.ts +8 -0
  148. package/dist/esm/components/calendar/utils.js +16 -1
  149. package/dist/esm/components/calendar/utils.js.map +1 -1
  150. package/dist/esm/components/card/CCardHeader.js.map +1 -1
  151. package/dist/esm/components/card/CCardSubtitle.js.map +1 -1
  152. package/dist/esm/components/card/CCardText.js.map +1 -1
  153. package/dist/esm/components/card/CCardTitle.js.map +1 -1
  154. package/dist/esm/components/carousel/CCarousel.js.map +1 -1
  155. package/dist/esm/components/carousel/CCarouselItem.js.map +1 -1
  156. package/dist/esm/components/date-picker/CDatePicker.js.map +1 -1
  157. package/dist/esm/components/date-range-picker/CDateRangePicker.js +47 -27
  158. package/dist/esm/components/date-range-picker/CDateRangePicker.js.map +1 -1
  159. package/dist/esm/components/dropdown/CDropdown.d.ts +77 -20
  160. package/dist/esm/components/dropdown/CDropdown.js +6 -3
  161. package/dist/esm/components/dropdown/CDropdown.js.map +1 -1
  162. package/dist/esm/components/dropdown/CDropdownHeader.js.map +1 -1
  163. package/dist/esm/components/dropdown/CDropdownItem.js.map +1 -1
  164. package/dist/esm/components/dropdown/CDropdownItemPlain.js.map +1 -1
  165. package/dist/esm/components/dropdown/CDropdownMenu.js +1 -1
  166. package/dist/esm/components/dropdown/CDropdownMenu.js.map +1 -1
  167. package/dist/esm/components/dropdown/CDropdownToggle.js.map +1 -1
  168. package/dist/esm/components/form/CFormCheck.js.map +1 -1
  169. package/dist/esm/components/form/CFormFeedback.js.map +1 -1
  170. package/dist/esm/components/form/CFormInput.js.map +1 -1
  171. package/dist/esm/components/form/CFormLabel.js.map +1 -1
  172. package/dist/esm/components/form/CFormText.js.map +1 -1
  173. package/dist/esm/components/form/CInputGroupText.js.map +1 -1
  174. package/dist/esm/components/header/CHeaderBrand.js.map +1 -1
  175. package/dist/esm/components/header/CHeaderNav.js.map +1 -1
  176. package/dist/esm/components/header/CHeaderToggler.js.map +1 -1
  177. package/dist/esm/components/index.d.ts +1 -0
  178. package/dist/esm/components/link/CLink.js.map +1 -1
  179. package/dist/esm/components/list-group/CListGroup.js.map +1 -1
  180. package/dist/esm/components/list-group/CListGroupItem.js.map +1 -1
  181. package/dist/esm/components/loading-button/CLoadingButton.js.map +1 -1
  182. package/dist/esm/components/modal/CModal.js.map +1 -1
  183. package/dist/esm/components/modal/CModalHeader.js.map +1 -1
  184. package/dist/esm/components/modal/CModalTitle.js.map +1 -1
  185. package/dist/esm/components/multi-select/CMultiSelect.d.ts +6 -0
  186. package/dist/esm/components/multi-select/CMultiSelect.js +22 -5
  187. package/dist/esm/components/multi-select/CMultiSelect.js.map +1 -1
  188. package/dist/esm/components/multi-select/CMultiSelectNativeSelect.js.map +1 -1
  189. package/dist/esm/components/multi-select/CMultiSelectOptions.js.map +1 -1
  190. package/dist/esm/components/multi-select/CMultiSelectSelection.js.map +1 -1
  191. package/dist/esm/components/nav/CNav.js.map +1 -1
  192. package/dist/esm/components/nav/CNavGroup.js.map +1 -1
  193. package/dist/esm/components/nav/CNavGroupItems.js.map +1 -1
  194. package/dist/esm/components/nav/CNavItem.js.map +1 -1
  195. package/dist/esm/components/nav/CNavLink.js.map +1 -1
  196. package/dist/esm/components/nav/CNavTitle.js.map +1 -1
  197. package/dist/esm/components/navbar/CNavbar.js.map +1 -1
  198. package/dist/esm/components/navbar/CNavbarBrand.js.map +1 -1
  199. package/dist/esm/components/navbar/CNavbarNav.js.map +1 -1
  200. package/dist/esm/components/navbar/CNavbarToggler.js.map +1 -1
  201. package/dist/esm/components/offcanvas/COffcanvas.js.map +1 -1
  202. package/dist/esm/components/offcanvas/COffcanvasTitle.js.map +1 -1
  203. package/dist/esm/components/pagination/CPaginationItem.js.map +1 -1
  204. package/dist/esm/components/password-input/CPasswordInput.d.ts +43 -0
  205. package/dist/esm/components/password-input/CPasswordInput.js +33 -0
  206. package/dist/esm/components/password-input/CPasswordInput.js.map +1 -0
  207. package/dist/esm/components/password-input/index.d.ts +2 -0
  208. package/dist/esm/components/picker/CPicker.js.map +1 -1
  209. package/dist/esm/components/placeholder/CPlaceholder.js.map +1 -1
  210. package/dist/esm/components/popover/CPopover.d.ts +75 -20
  211. package/dist/esm/components/popover/CPopover.js +9 -22
  212. package/dist/esm/components/popover/CPopover.js.map +1 -1
  213. package/dist/esm/components/progress/CProgressBar.js.map +1 -1
  214. package/dist/esm/components/range-slider/CRangeSlider.js.map +1 -1
  215. package/dist/esm/components/rating/CRating.js.map +1 -1
  216. package/dist/esm/components/sidebar/CSidebar.js.map +1 -1
  217. package/dist/esm/components/sidebar/CSidebarBrand.js.map +1 -1
  218. package/dist/esm/components/sidebar/CSidebarNav.js.map +1 -1
  219. package/dist/esm/components/smart-pagination/CSmartPagination.js.map +1 -1
  220. package/dist/esm/components/smart-table/CSmartTable.js.map +1 -1
  221. package/dist/esm/components/smart-table/CSmartTableBody.js.map +1 -1
  222. package/dist/esm/components/smart-table/CSmartTableHead.js +3 -1
  223. package/dist/esm/components/smart-table/CSmartTableHead.js.map +1 -1
  224. package/dist/esm/components/smart-table/types.d.ts +1 -1
  225. package/dist/esm/components/smart-table/utils.js +1 -1
  226. package/dist/esm/components/smart-table/utils.js.map +1 -1
  227. package/dist/esm/components/spinner/CSpinner.js.map +1 -1
  228. package/dist/esm/components/tabs/CTab.js.map +1 -1
  229. package/dist/esm/components/tabs/CTabList.js.map +1 -1
  230. package/dist/esm/components/tabs/CTabPane.js.map +1 -1
  231. package/dist/esm/components/tabs/CTabPanel.js.map +1 -1
  232. package/dist/esm/components/time-picker/CTimePicker.js +14 -8
  233. package/dist/esm/components/time-picker/CTimePicker.js.map +1 -1
  234. package/dist/esm/components/time-picker/CTimePickerRollCol.js.map +1 -1
  235. package/dist/esm/components/time-picker/utils.d.ts +10 -0
  236. package/dist/esm/components/time-picker/utils.js +25 -10
  237. package/dist/esm/components/time-picker/utils.js.map +1 -1
  238. package/dist/esm/components/toast/CToast.js.map +1 -1
  239. package/dist/esm/components/tooltip/CTooltip.d.ts +67 -15
  240. package/dist/esm/components/tooltip/CTooltip.js +9 -22
  241. package/dist/esm/components/tooltip/CTooltip.js.map +1 -1
  242. package/dist/esm/components/widgets/CWidgetStatsF.js.map +1 -1
  243. package/dist/esm/hooks/useClipboard.js.map +1 -1
  244. package/dist/esm/hooks/useColorModes.js +5 -5
  245. package/dist/esm/hooks/useColorModes.js.map +1 -1
  246. package/dist/esm/hooks/useDebouncedCallback.js.map +1 -1
  247. package/dist/esm/index.js +1 -0
  248. package/dist/esm/index.js.map +1 -1
  249. package/dist/esm/node_modules/@coreui/icons-react/dist/index.esm.js.map +1 -1
  250. package/dist/esm/node_modules/dom-helpers/esm/hasClass.js.map +1 -1
  251. package/dist/esm/node_modules/react-device-detect/dist/lib.js +1 -1
  252. package/dist/esm/node_modules/react-device-detect/dist/lib.js.map +1 -1
  253. package/dist/esm/node_modules/react-transition-group/esm/Transition.js.map +1 -1
  254. package/dist/esm/node_modules/tslib/tslib.es6.js.map +1 -1
  255. package/dist/esm/node_modules/ua-parser-js/dist/ua-parser.min.js.map +1 -1
  256. package/dist/esm/utils/executeAfterTransition.js.map +1 -1
  257. package/dist/esm/utils/getNextActiveElement.js.map +1 -1
  258. package/dist/esm/utils/isObjectInArray.js.map +1 -1
  259. package/package.json +9 -9
  260. package/src/components/accordion/CAccordionBody.tsx +3 -3
  261. package/src/components/accordion/CAccordionItem.tsx +9 -5
  262. package/src/components/calendar/CCalendar.tsx +74 -56
  263. package/src/components/calendar/CCalendarNavigation.tsx +2 -2
  264. package/src/components/calendar/CCalendarPanel.tsx +4 -4
  265. package/src/components/calendar/utils.ts +33 -10
  266. package/src/components/date-picker/CDatePicker.tsx +1 -1
  267. package/src/components/date-range-picker/CDateRangePicker.tsx +37 -21
  268. package/src/components/dropdown/CDropdown.tsx +106 -26
  269. package/src/components/dropdown/CDropdownMenu.tsx +0 -1
  270. package/src/components/index.ts +1 -0
  271. package/src/components/multi-select/CMultiSelect.tsx +49 -14
  272. package/src/components/password-input/CPasswordInput.tsx +164 -0
  273. package/src/components/password-input/index.ts +3 -0
  274. package/src/components/popover/CPopover.tsx +103 -43
  275. package/src/components/smart-table/CSmartTableHead.tsx +3 -0
  276. package/src/components/smart-table/types.ts +7 -1
  277. package/src/components/time-picker/CTimePicker.tsx +19 -12
  278. package/src/components/time-picker/utils.ts +30 -14
  279. package/src/components/tooltip/CTooltip.tsx +94 -38
  280. package/src/hooks/useColorModes.ts +5 -5
@@ -10,6 +10,7 @@ import React, {
10
10
  } from 'react'
11
11
  import PropTypes from 'prop-types'
12
12
  import classNames from 'classnames'
13
+ import type { Options } from '@popperjs/core'
13
14
 
14
15
  import { PolymorphicRefForwardingComponent } from '../../helpers'
15
16
  import { useForkedRef, usePopper } from '../../hooks'
@@ -22,77 +23,148 @@ import { getPlacement } from './utils'
22
23
 
23
24
  export interface CDropdownProps extends HTMLAttributes<HTMLDivElement | HTMLLIElement> {
24
25
  /**
25
- * Set aligment of dropdown menu.
26
+ * Specifies the alignment of the React Dropdown Menu within this React Dropdown.
27
+ *
28
+ * @example
29
+ * // Align dropdown menu to the end on large devices, otherwise start
30
+ * <CDropdown alignment={{ lg: 'end', xs: 'start' }}>
31
+ * <CDropdownToggle>Toggle dropdown</CDropdownToggle>
32
+ * <CDropdownMenu>
33
+ * <CDropdownItem>Action</CDropdownItem>
34
+ * <CDropdownItem>Another Action</CDropdownItem>
35
+ * </CDropdownMenu>
36
+ * </CDropdown>
26
37
  *
27
38
  * @type 'start' | 'end' | { xs: 'start' | 'end' } | { sm: 'start' | 'end' } | { md: 'start' | 'end' } | { lg: 'start' | 'end' } | { xl: 'start' | 'end'} | { xxl: 'start' | 'end'}
28
39
  */
29
40
  alignment?: Alignments
41
+
30
42
  /**
31
- * Component used for the root node. Either a string to use a HTML element or a component.
43
+ * Determines the root node component (native HTML element or a custom React component) for the React Dropdown.
32
44
  */
33
45
  as?: ElementType
46
+
34
47
  /**
35
- * Configure the auto close behavior of the dropdown:
36
- * - `true` - the dropdown will be closed by clicking outside or inside the dropdown menu.
37
- * - `false` - the dropdown will be closed by clicking the toggle button and manually calling hide or toggle method. (Also will not be closed by pressing esc key)
38
- * - `'inside'` - the dropdown will be closed (only) by clicking inside the dropdown menu.
39
- * - `'outside'` - the dropdown will be closed (only) by clicking outside the dropdown menu.
48
+ * Configures automatic closing behavior for the React Dropdown:
49
+ * - `true` - Close on clicks inside or outside of the React Dropdown Menu.
50
+ * - `false` - Disable auto-close; manually call `hide` or `toggle` (also not closed by `Escape`).
51
+ * - `'inside'` - Close only when clicking inside the React Dropdown Menu.
52
+ * - `'outside'` - Close only when clicking outside the React Dropdown Menu.
53
+ *
54
+ * @example
55
+ * // Close only when user clicks outside of the menu
56
+ * <CDropdown autoClose="outside" />
40
57
  */
41
58
  autoClose?: 'inside' | 'outside' | boolean
59
+
42
60
  /**
43
- * A string of all className you want applied to the base component.
61
+ * Adds custom classes to the React Dropdown root element.
44
62
  */
45
63
  className?: string
64
+
46
65
  /**
47
- * Appends the react dropdown menu to a specific element. You can pass an HTML element or function that returns a single element. By default `document.body`.
66
+ * Appends the React Dropdown Menu to a specific element. You can pass an HTML element or a function returning an element. Defaults to `document.body`.
67
+ *
68
+ * @example
69
+ * // Append the menu to a custom container
70
+ * const myContainer = document.getElementById('my-container')
71
+ *
72
+ * <CDropdown container={myContainer} />
48
73
  *
49
74
  * @since 4.11.0
50
75
  */
51
76
  container?: DocumentFragment | Element | (() => DocumentFragment | Element | null) | null
77
+
52
78
  /**
53
- * Sets a darker color scheme to match a dark navbar.
79
+ * Applies a darker color scheme to the React Dropdown Menu, often used within dark navbars.
54
80
  */
55
81
  dark?: boolean
82
+
56
83
  /**
57
- * Sets a specified direction and location of the dropdown menu.
84
+ * Specifies the direction of the React Dropdown.
58
85
  */
59
86
  direction?: 'center' | 'dropup' | 'dropup-center' | 'dropend' | 'dropstart'
87
+
60
88
  /**
61
- * Offset of the dropdown menu relative to its target.
89
+ * Defines x and y offsets ([x, y]) for the React Dropdown Menu relative to its target.
90
+ *
91
+ * @example
92
+ * // Offset the menu 10px in X and 5px in Y direction
93
+ * <CDropdown offset={[10, 5]}>
94
+ * ...
95
+ * </CDropdown>
62
96
  */
63
97
  offset?: [number, number]
98
+
64
99
  /**
65
- * Callback fired when the component requests to be hidden.
100
+ * Callback fired right before the React Dropdown becomes hidden.
66
101
  *
67
102
  * @since 4.9.0
68
103
  */
69
104
  onHide?: () => void
105
+
70
106
  /**
71
- * Callback fired when the component requests to be shown.
107
+ * Callback fired immediately after the React Dropdown is displayed.
72
108
  */
73
109
  onShow?: () => void
110
+
74
111
  /**
75
- * Describes the placement of your component after Popper.js has applied all the modifiers that may have flipped or altered the originally provided placement property.
112
+ * Determines the placement of the React Dropdown Menu after Popper.js modifiers.
76
113
  *
77
- * @type 'auto' | 'top-end' | 'top' | 'top-start' | 'bottom-end' | 'bottom' | 'bottom-start' | 'right-start' | 'right' | 'right-end' | 'left-start' | 'left' | 'left-end'
114
+ * @type 'auto' | 'auto-start' | 'auto-end' | 'top-end' | 'top' | 'top-start' | 'bottom-end' | 'bottom' | 'bottom-start' | 'right-start' | 'right' | 'right-end' | 'left-start' | 'left' | 'left-end'
78
115
  */
79
116
  placement?: Placements
117
+
80
118
  /**
81
- * If you want to disable dynamic positioning set this property to `true`.
119
+ * Enables or disables dynamic positioning via Popper.js for the React Dropdown Menu.
82
120
  */
83
121
  popper?: boolean
122
+
123
+ /**
124
+ * Provides a custom Popper.js configuration or a function that returns a modified Popper.js configuration for advanced positioning of the React Dropdown Menu. [Read more](https://popper.js.org/docs/v2/constructors/#options)
125
+ *
126
+ * @example
127
+ * // Providing a custom popper config
128
+ * <CDropdown
129
+ * popperConfig={{
130
+ * modifiers: [
131
+ * {
132
+ * name: 'flip',
133
+ * options: { fallbackPlacements: ['bottom', 'top'] },
134
+ * },
135
+ * ],
136
+ * }}
137
+ * >...</CDropdown>
138
+ *
139
+ * @since 5.5.0
140
+ */
141
+ popperConfig?: Partial<Options> | ((defaultPopperConfig: Partial<Options>) => Partial<Options>)
142
+
84
143
  /**
85
- * Generates dropdown menu using createPortal.
144
+ * Renders the React Dropdown Menu using a React Portal, allowing it to escape the DOM hierarchy for improved positioning.
86
145
  *
87
146
  * @since 4.8.0
88
147
  */
89
148
  portal?: boolean
149
+
90
150
  /**
91
- * Set the dropdown variant to an btn-group, dropdown, input-group, and nav-item.
151
+ * Defines the visual variant of the React Dropdown
92
152
  */
93
153
  variant?: 'btn-group' | 'dropdown' | 'input-group' | 'nav-item'
154
+
94
155
  /**
95
- * Toggle the visibility of dropdown menu component.
156
+ * Controls the visibility of the React Dropdown Menu:
157
+ * - `true` - Visible
158
+ * - `false` - Hidden
159
+ *
160
+ * @example
161
+ * // Programmatically manage the dropdown visibility
162
+ * const [visible, setVisible] = useState(false)
163
+ *
164
+ * <CDropdown visible={visible}>
165
+ * ...
166
+ * </CDropdown>
167
+ *
96
168
  */
97
169
  visible?: boolean
98
170
  }
@@ -126,12 +198,13 @@ export const CDropdown: PolymorphicRefForwardingComponent<'div', CDropdownProps>
126
198
  onShow,
127
199
  placement = 'bottom-start',
128
200
  popper = true,
201
+ popperConfig,
129
202
  portal = false,
130
203
  variant = 'btn-group',
131
204
  visible = false,
132
205
  ...rest
133
206
  },
134
- ref,
207
+ ref
135
208
  ) => {
136
209
  const dropdownRef = useRef<HTMLDivElement>(null)
137
210
  // eslint-disable-next-line @typescript-eslint/no-explicit-any
@@ -161,7 +234,7 @@ export const CDropdown: PolymorphicRefForwardingComponent<'div', CDropdownProps>
161
234
  setVisible,
162
235
  }
163
236
 
164
- const popperConfig = {
237
+ const defaultPopperConfig = {
165
238
  modifiers: [
166
239
  {
167
240
  name: 'offset',
@@ -173,6 +246,11 @@ export const CDropdown: PolymorphicRefForwardingComponent<'div', CDropdownProps>
173
246
  placement: getPlacement(placement, direction, alignment, isRTL(dropdownMenuRef.current)),
174
247
  }
175
248
 
249
+ const computedPopperConfig: Partial<Options> = {
250
+ ...defaultPopperConfig,
251
+ ...(typeof popperConfig === 'function' ? popperConfig(defaultPopperConfig) : popperConfig),
252
+ }
253
+
176
254
  useEffect(() => {
177
255
  setVisible(visible)
178
256
  }, [visible])
@@ -180,7 +258,8 @@ export const CDropdown: PolymorphicRefForwardingComponent<'div', CDropdownProps>
180
258
  useEffect(() => {
181
259
  if (_visible && dropdownToggleRef.current && dropdownMenuRef.current) {
182
260
  dropdownToggleRef.current.focus()
183
- popper && initPopper(dropdownToggleRef.current, dropdownMenuRef.current, popperConfig)
261
+ popper &&
262
+ initPopper(dropdownToggleRef.current, dropdownMenuRef.current, computedPopperConfig)
184
263
  window.addEventListener('mouseup', handleMouseUp)
185
264
  window.addEventListener('keyup', handleKeyup)
186
265
  dropdownToggleRef.current.addEventListener('keydown', handleKeydown)
@@ -209,7 +288,7 @@ export const CDropdown: PolymorphicRefForwardingComponent<'div', CDropdownProps>
209
288
  event.preventDefault()
210
289
  const target = event.target as HTMLElement
211
290
  const items: HTMLElement[] = Array.from(
212
- dropdownMenuRef.current.querySelectorAll('.dropdown-item:not(.disabled):not(:disabled)'),
291
+ dropdownMenuRef.current.querySelectorAll('.dropdown-item:not(.disabled):not(:disabled)')
213
292
  )
214
293
  getNextActiveElement(items, target, event.key === 'ArrowDown', true).focus()
215
294
  }
@@ -258,7 +337,7 @@ export const CDropdown: PolymorphicRefForwardingComponent<'div', CDropdownProps>
258
337
  [`${direction}`]:
259
338
  direction && direction !== 'center' && direction !== 'dropup-center',
260
339
  },
261
- className,
340
+ className
262
341
  )}
263
342
  {...rest}
264
343
  ref={forkedRef}
@@ -268,7 +347,7 @@ export const CDropdown: PolymorphicRefForwardingComponent<'div', CDropdownProps>
268
347
  )}
269
348
  </CDropdownContext.Provider>
270
349
  )
271
- },
350
+ }
272
351
  )
273
352
 
274
353
  const alignmentDirection = PropTypes.oneOf<Directions>(['start', 'end'])
@@ -297,6 +376,7 @@ CDropdown.propTypes = {
297
376
  onShow: PropTypes.func,
298
377
  placement: placementPropType,
299
378
  popper: PropTypes.bool,
379
+ popperConfig: PropTypes.oneOfType([PropTypes.func, PropTypes.object]),
300
380
  portal: PropTypes.bool,
301
381
  variant: PropTypes.oneOf(['btn-group', 'dropdown', 'input-group', 'nav-item']),
302
382
  visible: PropTypes.bool,
@@ -42,7 +42,6 @@ export const CDropdownMenu: PolymorphicRefForwardingComponent<'ul', CDropdownMen
42
42
  )}
43
43
  ref={forkedRef}
44
44
  role="menu"
45
- aria-hidden={!visible}
46
45
  {...(!popper && { 'data-coreui-popper': 'static' })}
47
46
  {...(dark && { 'data-coreui-theme': 'dark' })}
48
47
  {...rest}
@@ -30,6 +30,7 @@ export * from './multi-select'
30
30
  export * from './nav'
31
31
  export * from './navbar'
32
32
  export * from './offcanvas'
33
+ export * from './password-input'
33
34
  export * from './pagination'
34
35
  export * from './placeholder'
35
36
  export * from './progress'
@@ -188,6 +188,12 @@ export interface CMultiSelectProps
188
188
  * Size the component small or large.
189
189
  */
190
190
  size?: 'sm' | 'lg'
191
+ /**
192
+ * Sets the initially selected values for the multi-select component.
193
+ *
194
+ * @since 5.13.0
195
+ */
196
+ value?: string | number | (string | number)[]
191
197
  /**
192
198
  * Enable virtual scroller for the options list.
193
199
  *
@@ -248,12 +254,13 @@ export const CMultiSelect = forwardRef<HTMLDivElement, CMultiSelectProps>(
248
254
  text,
249
255
  tooltipFeedback,
250
256
  valid,
257
+ value,
251
258
  virtualScroller,
252
259
  visible = false,
253
260
  visibleItems = 10,
254
261
  ...rest
255
262
  },
256
- ref,
263
+ ref
257
264
  ) => {
258
265
  const {
259
266
  dropdownMenuElement,
@@ -278,18 +285,38 @@ export const CMultiSelect = forwardRef<HTMLDivElement, CMultiSelectProps>(
278
285
  isExternalSearch(search)
279
286
  ? [...options, ...filterOptionsList(searchValue, userOptions)]
280
287
  : filterOptionsList(searchValue, [...options, ...userOptions]),
281
- true,
288
+ true
282
289
  ),
283
- [options, searchValue, userOptions],
290
+ [options, searchValue, userOptions]
284
291
  )
285
292
 
286
- const flattenedOptions = useMemo(() => flattenOptionsArray(options), [options])
293
+ const flattenedOptions = useMemo(
294
+ () =>
295
+ flattenOptionsArray(options).map((option) => {
296
+ if (value && Array.isArray(value)) {
297
+ return {
298
+ ...option,
299
+ selected: value.includes(option.value),
300
+ }
301
+ }
302
+
303
+ if (value === option.value) {
304
+ return {
305
+ ...option,
306
+ selected: true,
307
+ }
308
+ }
309
+
310
+ return option
311
+ }),
312
+ [options, value]
313
+ )
287
314
 
288
315
  const userOption = useMemo(() => {
289
316
  if (
290
317
  allowCreateOptions &&
291
318
  filteredOptions.some(
292
- (option) => option.label && option.label.toLowerCase() === searchValue.toLowerCase(),
319
+ (option) => option.label && option.label.toLowerCase() === searchValue.toLowerCase()
293
320
  )
294
321
  ) {
295
322
  return false
@@ -305,7 +332,7 @@ export const CMultiSelect = forwardRef<HTMLDivElement, CMultiSelectProps>(
305
332
 
306
333
  const _selected = flattenedOptions.filter((option: Option) => option.selected === true)
307
334
  const deselected = flattenedOptions.filter(
308
- (option: Option) => option.selected === false,
335
+ (option: Option) => option.selected === false
309
336
  ) as Option[]
310
337
 
311
338
  if (_selected.length > 0) {
@@ -314,7 +341,9 @@ export const CMultiSelect = forwardRef<HTMLDivElement, CMultiSelectProps>(
314
341
  }, [flattenedOptions])
315
342
 
316
343
  useEffect(() => {
317
- !isInitialMount.current && onFilterChange && onFilterChange(searchValue)
344
+ if (!isInitialMount.current && onFilterChange) {
345
+ onFilterChange(searchValue)
346
+ }
318
347
  }, [searchValue])
319
348
 
320
349
  useEffect(() => {
@@ -378,7 +407,7 @@ export const CMultiSelect = forwardRef<HTMLDivElement, CMultiSelectProps>(
378
407
  items,
379
408
  target,
380
409
  event.key === 'ArrowDown',
381
- !items.includes(target),
410
+ !items.includes(target)
382
411
  ).focus()
383
412
  return
384
413
  }
@@ -395,7 +424,7 @@ export const CMultiSelect = forwardRef<HTMLDivElement, CMultiSelectProps>(
395
424
  setSelected([
396
425
  ...selected,
397
426
  filteredOptions.find(
398
- (option) => String(option.label).toLowerCase() === searchValue.toLowerCase(),
427
+ (option) => String(option.label).toLowerCase() === searchValue.toLowerCase()
399
428
  ) as Option,
400
429
  ])
401
430
  }
@@ -437,7 +466,7 @@ export const CMultiSelect = forwardRef<HTMLDivElement, CMultiSelectProps>(
437
466
  items,
438
467
  target,
439
468
  event.key === 'ArrowDown',
440
- !items.includes(target),
469
+ !items.includes(target)
441
470
  ).focus()
442
471
  }
443
472
  }
@@ -488,8 +517,8 @@ export const CMultiSelect = forwardRef<HTMLDivElement, CMultiSelectProps>(
488
517
  selectOptions(
489
518
  multiple,
490
519
  [...flattenedOptions.filter((option: Option) => !option.disabled), ...userOptions],
491
- selected,
492
- ),
520
+ selected
521
+ )
493
522
  )
494
523
  }
495
524
 
@@ -534,7 +563,7 @@ export const CMultiSelect = forwardRef<HTMLDivElement, CMultiSelectProps>(
534
563
  'is-valid': valid,
535
564
  show: isOpen,
536
565
  },
537
- className,
566
+ className
538
567
  )}
539
568
  onKeyDown={handleGlobalSearch}
540
569
  aria-expanded={isOpen}
@@ -646,7 +675,7 @@ export const CMultiSelect = forwardRef<HTMLDivElement, CMultiSelectProps>(
646
675
  </div>
647
676
  </CFormControlWrapper>
648
677
  )
649
- },
678
+ }
650
679
  )
651
680
 
652
681
  CMultiSelect.propTypes = {
@@ -687,6 +716,12 @@ CMultiSelect.propTypes = {
687
716
  selectionType: PropTypes.oneOf(['counter', 'tags', 'text']),
688
717
  selectionTypeCounterText: PropTypes.string,
689
718
  size: PropTypes.oneOf(['sm', 'lg']),
719
+ value: PropTypes.oneOfType([
720
+ PropTypes.number,
721
+ PropTypes.string,
722
+ PropTypes.arrayOf(PropTypes.number),
723
+ PropTypes.arrayOf(PropTypes.string),
724
+ ]),
690
725
  virtualScroller: PropTypes.bool,
691
726
  visible: PropTypes.bool,
692
727
  visibleItems: PropTypes.number,
@@ -0,0 +1,164 @@
1
+ import React, {
2
+ ChangeEventHandler,
3
+ forwardRef,
4
+ InputHTMLAttributes,
5
+ useEffect,
6
+ useState,
7
+ } from 'react'
8
+ import PropTypes from 'prop-types'
9
+ import classNames from 'classnames'
10
+
11
+ import { CFormControlWrapper, CFormControlWrapperProps } from '../form/CFormControlWrapper'
12
+
13
+ export interface CPasswordInputProps
14
+ extends CFormControlWrapperProps,
15
+ Omit<InputHTMLAttributes<HTMLInputElement>, 'size'> {
16
+ /**
17
+ * Sets the accessible label (`aria-label`) for the toggle password visibility button. This improves accessibility for screen readers and should describe the action, e.g. `"Show password"` or `"Hide password"`.
18
+ */
19
+ ariaLabelToggler?: string
20
+
21
+ /**
22
+ * A string of all className you want applied to the component.
23
+ */
24
+ className?: string
25
+
26
+ /**
27
+ * Enables delayed `onChange` execution for improved performance in React password inputs.
28
+ * - `true` delays the `onChange` callback by 500ms.
29
+ * - You can also pass a custom delay (in milliseconds) as a number.
30
+ */
31
+ delay?: boolean | number
32
+
33
+ /**
34
+ * Disables the password input field. When `true`, the user cannot interact with the field.
35
+ */
36
+ disabled?: boolean
37
+
38
+ /**
39
+ * Callback triggered when the value of the password input changes. If `delay` is set, the callback is called after the specified timeout.
40
+ */
41
+ onChange?: ChangeEventHandler<HTMLInputElement>
42
+
43
+ /**
44
+ * Makes the React password input read-only. Prevents user input but allows text selection.
45
+ */
46
+ readOnly?: boolean
47
+
48
+ /**
49
+ * Controls the initial visibility of the password. When `true`, the input type is set to `"text"` instead of `"password"`. This allows **toggling password visibility** in React forms.
50
+ */
51
+ showPassword?: boolean
52
+
53
+ /**
54
+ * Sets the visual size of the password input. Use `'sm'` for small or `'lg'` for large input fields.
55
+ */
56
+ size?: 'sm' | 'lg'
57
+
58
+ /**
59
+ * The value of the password input field. To make the input controlled, pair this with the `onChange` handler.
60
+ */
61
+ value?: string | string[] | number
62
+ }
63
+
64
+ export const CPasswordInput = forwardRef<HTMLInputElement, CPasswordInputProps>(
65
+ (
66
+ {
67
+ children,
68
+ ariaLabelToggler = 'Toggle password visibility',
69
+ className,
70
+ delay = false,
71
+ feedback,
72
+ feedbackInvalid,
73
+ feedbackValid,
74
+ floatingClassName,
75
+ floatingLabel,
76
+ id,
77
+ invalid,
78
+ label,
79
+ onChange,
80
+ showPassword: showPasswordProp = false,
81
+ size,
82
+ text,
83
+ tooltipFeedback,
84
+ valid,
85
+ ...rest
86
+ },
87
+ ref
88
+ ) => {
89
+ const [value, setValue] = useState<React.ChangeEvent<HTMLInputElement>>()
90
+ const [showPassword, setShowPassword] = useState<boolean>(showPasswordProp)
91
+
92
+ useEffect(() => {
93
+ const timeOutId = setTimeout(
94
+ () => value && onChange && onChange(value),
95
+ typeof delay === 'number' ? delay : 500
96
+ )
97
+
98
+ return () => clearTimeout(timeOutId)
99
+ }, [value])
100
+
101
+ useEffect(() => {
102
+ setShowPassword(showPasswordProp)
103
+ }, [showPasswordProp])
104
+
105
+ return (
106
+ <CFormControlWrapper
107
+ describedby={rest['aria-describedby']}
108
+ feedback={feedback}
109
+ feedbackInvalid={feedbackInvalid}
110
+ feedbackValid={feedbackValid}
111
+ floatingClassName={floatingClassName}
112
+ floatingLabel={floatingLabel}
113
+ id={id}
114
+ invalid={invalid}
115
+ label={label}
116
+ text={text}
117
+ tooltipFeedback={tooltipFeedback}
118
+ valid={valid}
119
+ >
120
+ <div className="form-password">
121
+ <input
122
+ className={classNames(
123
+ 'form-control',
124
+ {
125
+ [`form-control-${size}`]: size,
126
+ 'is-invalid': invalid,
127
+ 'is-valid': valid,
128
+ },
129
+ className
130
+ )}
131
+ id={id}
132
+ type={showPassword ? 'text' : 'password'}
133
+ onChange={(event) => (delay ? setValue(event) : onChange && onChange(event))}
134
+ {...rest}
135
+ ref={ref}
136
+ >
137
+ {children}
138
+ </input>
139
+ <button
140
+ type="button"
141
+ className="form-password-action"
142
+ data-coreui-toggle="password"
143
+ aria-label={ariaLabelToggler}
144
+ onClick={() => setShowPassword((prev) => !prev)}
145
+ >
146
+ <span className="form-password-action-icon"></span>
147
+ </button>
148
+ </div>
149
+ </CFormControlWrapper>
150
+ )
151
+ }
152
+ )
153
+
154
+ CPasswordInput.propTypes = {
155
+ ariaLabelToggler: PropTypes.string,
156
+ className: PropTypes.string,
157
+ id: PropTypes.string,
158
+ delay: PropTypes.oneOfType([PropTypes.bool, PropTypes.number]),
159
+ showPassword: PropTypes.bool,
160
+ size: PropTypes.oneOf(['sm', 'lg']),
161
+ ...CFormControlWrapper.propTypes,
162
+ }
163
+
164
+ CPasswordInput.displayName = 'CPasswordInput'
@@ -0,0 +1,3 @@
1
+ import { CPasswordInput } from './CPasswordInput'
2
+
3
+ export { CPasswordInput }