@coreui/react-pro 5.25.0 → 5.26.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (291) hide show
  1. package/dist/cjs/components/card/CCardImage.js.map +1 -1
  2. package/dist/cjs/components/carousel/CCarousel.js +44 -33
  3. package/dist/cjs/components/carousel/CCarousel.js.map +1 -1
  4. package/dist/cjs/components/carousel/CCarouselItem.js +19 -28
  5. package/dist/cjs/components/carousel/CCarouselItem.js.map +1 -1
  6. package/dist/cjs/components/chip/CChip.d.ts +12 -0
  7. package/dist/cjs/components/chip/CChip.js +16 -63
  8. package/dist/cjs/components/chip/CChip.js.map +1 -1
  9. package/dist/cjs/components/chip/const.d.ts +1 -0
  10. package/dist/cjs/components/chip/const.js +8 -0
  11. package/dist/cjs/components/chip/const.js.map +1 -0
  12. package/dist/cjs/components/chip-set/CChipSet.d.ts +73 -0
  13. package/dist/cjs/components/chip-set/CChipSet.js +66 -0
  14. package/dist/cjs/components/chip-set/CChipSet.js.map +1 -0
  15. package/dist/cjs/components/chip-set/index.d.ts +2 -0
  16. package/dist/cjs/components/chip-set/useChipSet.d.ts +48 -0
  17. package/dist/cjs/components/chip-set/useChipSet.js +163 -0
  18. package/dist/cjs/components/chip-set/useChipSet.js.map +1 -0
  19. package/dist/cjs/components/chip-set/utils.d.ts +7 -0
  20. package/dist/cjs/components/chip-set/utils.js +18 -0
  21. package/dist/cjs/components/chip-set/utils.js.map +1 -0
  22. package/dist/cjs/components/collapse/CCollapse.js +14 -6
  23. package/dist/cjs/components/collapse/CCollapse.js.map +1 -1
  24. package/dist/cjs/components/conditional-portal/CConditionalPortal.js +3 -1
  25. package/dist/cjs/components/conditional-portal/CConditionalPortal.js.map +1 -1
  26. package/dist/cjs/components/dropdown/CDropdown.js +22 -29
  27. package/dist/cjs/components/dropdown/CDropdown.js.map +1 -1
  28. package/dist/cjs/components/dropdown/CDropdownToggle.js.map +1 -1
  29. package/dist/cjs/components/form/CChipInput.d.ts +14 -2
  30. package/dist/cjs/components/form/CChipInput.js +77 -49
  31. package/dist/cjs/components/form/CChipInput.js.map +1 -1
  32. package/dist/cjs/components/form/CFormCheck.js.map +1 -1
  33. package/dist/cjs/components/form/CFormInput.js.map +1 -1
  34. package/dist/cjs/components/form/CFormSelect.js.map +1 -1
  35. package/dist/cjs/components/form/CFormTextarea.js.map +1 -1
  36. package/dist/cjs/components/form/CInputGroupText.js.map +1 -1
  37. package/dist/cjs/components/grid/CContainer.js +3 -1
  38. package/dist/cjs/components/grid/CContainer.js.map +1 -1
  39. package/dist/cjs/components/header/CHeaderBrand.js.map +1 -1
  40. package/dist/cjs/components/index.d.ts +1 -0
  41. package/dist/cjs/components/link/CLink.js +4 -2
  42. package/dist/cjs/components/link/CLink.js.map +1 -1
  43. package/dist/cjs/components/list-group/CListGroupItem.js.map +1 -1
  44. package/dist/cjs/components/modal/CModal.js +14 -2
  45. package/dist/cjs/components/modal/CModal.js.map +1 -1
  46. package/dist/cjs/components/multi-select/CMultiSelect.d.ts +73 -1
  47. package/dist/cjs/components/multi-select/CMultiSelect.js +157 -18
  48. package/dist/cjs/components/multi-select/CMultiSelect.js.map +1 -1
  49. package/dist/cjs/components/multi-select/CMultiSelectNativeSelect.js +1 -1
  50. package/dist/cjs/components/multi-select/CMultiSelectNativeSelect.js.map +1 -1
  51. package/dist/cjs/components/multi-select/CMultiSelectOptions.d.ts +3 -0
  52. package/dist/cjs/components/multi-select/CMultiSelectOptions.js +45 -2
  53. package/dist/cjs/components/multi-select/CMultiSelectOptions.js.map +1 -1
  54. package/dist/cjs/components/multi-select/CMultiSelectSelection.d.ts +1 -0
  55. package/dist/cjs/components/multi-select/CMultiSelectSelection.js +4 -3
  56. package/dist/cjs/components/multi-select/CMultiSelectSelection.js.map +1 -1
  57. package/dist/cjs/components/multi-select/types.d.ts +12 -0
  58. package/dist/cjs/components/multi-select/utils.js +1 -4
  59. package/dist/cjs/components/multi-select/utils.js.map +1 -1
  60. package/dist/cjs/components/nav/CNav.js.map +1 -1
  61. package/dist/cjs/components/nav/CNavGroup.d.ts +10 -5
  62. package/dist/cjs/components/nav/CNavGroup.js +83 -24
  63. package/dist/cjs/components/nav/CNavGroup.js.map +1 -1
  64. package/dist/cjs/components/nav/CNavGroupContext.d.ts +25 -0
  65. package/dist/cjs/components/nav/CNavGroupContext.js +13 -0
  66. package/dist/cjs/components/nav/CNavGroupContext.js.map +1 -0
  67. package/dist/cjs/components/nav/CNavLink.d.ts +1 -5
  68. package/dist/cjs/components/nav/CNavLink.js +21 -8
  69. package/dist/cjs/components/nav/CNavLink.js.map +1 -1
  70. package/dist/cjs/components/popover/CPopover.js +57 -9
  71. package/dist/cjs/components/popover/CPopover.js.map +1 -1
  72. package/dist/cjs/components/progress/CProgress.js.map +1 -1
  73. package/dist/cjs/components/rating/CRating.d.ts +1 -1
  74. package/dist/cjs/components/rating/CRating.js.map +1 -1
  75. package/dist/cjs/components/sidebar/CSidebar.js +40 -23
  76. package/dist/cjs/components/sidebar/CSidebar.js.map +1 -1
  77. package/dist/cjs/components/sidebar/CSidebarNav.js +6 -35
  78. package/dist/cjs/components/sidebar/CSidebarNav.js.map +1 -1
  79. package/dist/cjs/components/table/CTableDataCell.js.map +1 -1
  80. package/dist/cjs/components/table/types.d.ts +2 -1
  81. package/dist/cjs/components/table/utils.js +4 -4
  82. package/dist/cjs/components/table/utils.js.map +1 -1
  83. package/dist/cjs/components/tabs/CTabPanel.js +3 -1
  84. package/dist/cjs/components/tabs/CTabPanel.js.map +1 -1
  85. package/dist/cjs/components/tooltip/CTooltip.js +57 -9
  86. package/dist/cjs/components/tooltip/CTooltip.js.map +1 -1
  87. package/dist/cjs/helpers/polymorphicComponent.d.ts +1 -2
  88. package/dist/cjs/hooks/useForkedRef.d.ts +1 -1
  89. package/dist/cjs/hooks/useForkedRef.js +6 -3
  90. package/dist/cjs/hooks/useForkedRef.js.map +1 -1
  91. package/dist/cjs/hooks/usePopper.js +8 -6
  92. package/dist/cjs/hooks/usePopper.js.map +1 -1
  93. package/dist/cjs/index.js +2 -0
  94. package/dist/cjs/index.js.map +1 -1
  95. package/dist/cjs/node_modules/@babel/runtime/helpers/esm/objectWithoutPropertiesLoose.js +1 -1
  96. package/dist/cjs/node_modules/@babel/runtime/helpers/esm/objectWithoutPropertiesLoose.js.map +1 -1
  97. package/dist/cjs/node_modules/ua-parser-js/dist/ua-parser.min.js +3 -3
  98. package/dist/cjs/node_modules/ua-parser-js/dist/ua-parser.min.js.map +1 -1
  99. package/dist/cjs/utils/executeAfterTransition.js.map +1 -1
  100. package/dist/cjs/utils/index.d.ts +2 -1
  101. package/dist/cjs/utils/swipe.d.ts +26 -0
  102. package/dist/cjs/utils/swipe.js +94 -0
  103. package/dist/cjs/utils/swipe.js.map +1 -0
  104. package/dist/esm/components/card/CCardImage.js.map +1 -1
  105. package/dist/esm/components/carousel/CCarousel.js +44 -33
  106. package/dist/esm/components/carousel/CCarousel.js.map +1 -1
  107. package/dist/esm/components/carousel/CCarouselItem.js +19 -28
  108. package/dist/esm/components/carousel/CCarouselItem.js.map +1 -1
  109. package/dist/esm/components/chip/CChip.d.ts +12 -0
  110. package/dist/esm/components/chip/CChip.js +16 -63
  111. package/dist/esm/components/chip/CChip.js.map +1 -1
  112. package/dist/esm/components/chip/const.d.ts +1 -0
  113. package/dist/esm/components/chip/const.js +6 -0
  114. package/dist/esm/components/chip/const.js.map +1 -0
  115. package/dist/esm/components/chip-set/CChipSet.d.ts +73 -0
  116. package/dist/esm/components/chip-set/CChipSet.js +64 -0
  117. package/dist/esm/components/chip-set/CChipSet.js.map +1 -0
  118. package/dist/esm/components/chip-set/index.d.ts +2 -0
  119. package/dist/esm/components/chip-set/useChipSet.d.ts +48 -0
  120. package/dist/esm/components/chip-set/useChipSet.js +161 -0
  121. package/dist/esm/components/chip-set/useChipSet.js.map +1 -0
  122. package/dist/esm/components/chip-set/utils.d.ts +7 -0
  123. package/dist/esm/components/chip-set/utils.js +16 -0
  124. package/dist/esm/components/chip-set/utils.js.map +1 -0
  125. package/dist/esm/components/collapse/CCollapse.js +14 -6
  126. package/dist/esm/components/collapse/CCollapse.js.map +1 -1
  127. package/dist/esm/components/conditional-portal/CConditionalPortal.js +3 -1
  128. package/dist/esm/components/conditional-portal/CConditionalPortal.js.map +1 -1
  129. package/dist/esm/components/dropdown/CDropdown.js +22 -29
  130. package/dist/esm/components/dropdown/CDropdown.js.map +1 -1
  131. package/dist/esm/components/dropdown/CDropdownToggle.js.map +1 -1
  132. package/dist/esm/components/form/CChipInput.d.ts +14 -2
  133. package/dist/esm/components/form/CChipInput.js +78 -50
  134. package/dist/esm/components/form/CChipInput.js.map +1 -1
  135. package/dist/esm/components/form/CFormCheck.js.map +1 -1
  136. package/dist/esm/components/form/CFormInput.js.map +1 -1
  137. package/dist/esm/components/form/CFormSelect.js.map +1 -1
  138. package/dist/esm/components/form/CFormTextarea.js.map +1 -1
  139. package/dist/esm/components/form/CInputGroupText.js.map +1 -1
  140. package/dist/esm/components/grid/CContainer.js +3 -1
  141. package/dist/esm/components/grid/CContainer.js.map +1 -1
  142. package/dist/esm/components/header/CHeaderBrand.js.map +1 -1
  143. package/dist/esm/components/index.d.ts +1 -0
  144. package/dist/esm/components/link/CLink.js +4 -2
  145. package/dist/esm/components/link/CLink.js.map +1 -1
  146. package/dist/esm/components/list-group/CListGroupItem.js.map +1 -1
  147. package/dist/esm/components/modal/CModal.js +14 -2
  148. package/dist/esm/components/modal/CModal.js.map +1 -1
  149. package/dist/esm/components/multi-select/CMultiSelect.d.ts +73 -1
  150. package/dist/esm/components/multi-select/CMultiSelect.js +158 -19
  151. package/dist/esm/components/multi-select/CMultiSelect.js.map +1 -1
  152. package/dist/esm/components/multi-select/CMultiSelectNativeSelect.js +1 -1
  153. package/dist/esm/components/multi-select/CMultiSelectNativeSelect.js.map +1 -1
  154. package/dist/esm/components/multi-select/CMultiSelectOptions.d.ts +3 -0
  155. package/dist/esm/components/multi-select/CMultiSelectOptions.js +45 -2
  156. package/dist/esm/components/multi-select/CMultiSelectOptions.js.map +1 -1
  157. package/dist/esm/components/multi-select/CMultiSelectSelection.d.ts +1 -0
  158. package/dist/esm/components/multi-select/CMultiSelectSelection.js +4 -3
  159. package/dist/esm/components/multi-select/CMultiSelectSelection.js.map +1 -1
  160. package/dist/esm/components/multi-select/types.d.ts +12 -0
  161. package/dist/esm/components/multi-select/utils.js +1 -4
  162. package/dist/esm/components/multi-select/utils.js.map +1 -1
  163. package/dist/esm/components/nav/CNav.js.map +1 -1
  164. package/dist/esm/components/nav/CNavGroup.d.ts +10 -5
  165. package/dist/esm/components/nav/CNavGroup.js +84 -25
  166. package/dist/esm/components/nav/CNavGroup.js.map +1 -1
  167. package/dist/esm/components/nav/CNavGroupContext.d.ts +25 -0
  168. package/dist/esm/components/nav/CNavGroupContext.js +11 -0
  169. package/dist/esm/components/nav/CNavGroupContext.js.map +1 -0
  170. package/dist/esm/components/nav/CNavLink.d.ts +1 -5
  171. package/dist/esm/components/nav/CNavLink.js +21 -8
  172. package/dist/esm/components/nav/CNavLink.js.map +1 -1
  173. package/dist/esm/components/popover/CPopover.js +57 -9
  174. package/dist/esm/components/popover/CPopover.js.map +1 -1
  175. package/dist/esm/components/progress/CProgress.js.map +1 -1
  176. package/dist/esm/components/rating/CRating.d.ts +1 -1
  177. package/dist/esm/components/rating/CRating.js.map +1 -1
  178. package/dist/esm/components/sidebar/CSidebar.js +40 -23
  179. package/dist/esm/components/sidebar/CSidebar.js.map +1 -1
  180. package/dist/esm/components/sidebar/CSidebarNav.js +7 -36
  181. package/dist/esm/components/sidebar/CSidebarNav.js.map +1 -1
  182. package/dist/esm/components/table/CTableDataCell.js.map +1 -1
  183. package/dist/esm/components/table/types.d.ts +2 -1
  184. package/dist/esm/components/table/utils.js +4 -4
  185. package/dist/esm/components/table/utils.js.map +1 -1
  186. package/dist/esm/components/tabs/CTabPanel.js +3 -1
  187. package/dist/esm/components/tabs/CTabPanel.js.map +1 -1
  188. package/dist/esm/components/tooltip/CTooltip.js +57 -9
  189. package/dist/esm/components/tooltip/CTooltip.js.map +1 -1
  190. package/dist/esm/helpers/polymorphicComponent.d.ts +1 -2
  191. package/dist/esm/hooks/useForkedRef.d.ts +1 -1
  192. package/dist/esm/hooks/useForkedRef.js +6 -3
  193. package/dist/esm/hooks/useForkedRef.js.map +1 -1
  194. package/dist/esm/hooks/usePopper.js +9 -7
  195. package/dist/esm/hooks/usePopper.js.map +1 -1
  196. package/dist/esm/index.js +1 -0
  197. package/dist/esm/index.js.map +1 -1
  198. package/dist/esm/node_modules/@babel/runtime/helpers/esm/objectWithoutPropertiesLoose.js +1 -1
  199. package/dist/esm/node_modules/@babel/runtime/helpers/esm/objectWithoutPropertiesLoose.js.map +1 -1
  200. package/dist/esm/node_modules/ua-parser-js/dist/ua-parser.min.js +3 -3
  201. package/dist/esm/node_modules/ua-parser-js/dist/ua-parser.min.js.map +1 -1
  202. package/dist/esm/utils/executeAfterTransition.js.map +1 -1
  203. package/dist/esm/utils/index.d.ts +2 -1
  204. package/dist/esm/utils/swipe.d.ts +26 -0
  205. package/dist/esm/utils/swipe.js +90 -0
  206. package/dist/esm/utils/swipe.js.map +1 -0
  207. package/package.json +6 -6
  208. package/src/components/autocomplete/CAutocompleteOptions.tsx +1 -1
  209. package/src/components/card/CCardImage.tsx +3 -2
  210. package/src/components/carousel/CCarousel.tsx +48 -51
  211. package/src/components/carousel/CCarouselContext.ts +1 -1
  212. package/src/components/carousel/CCarouselItem.tsx +25 -26
  213. package/src/components/carousel/__tests__/CCarousel.spec.tsx +47 -4
  214. package/src/components/carousel/__tests__/CCarouselItem.spec.tsx +37 -0
  215. package/src/components/chip/CChip.tsx +45 -78
  216. package/src/components/chip/__tests__/CChip.spec.tsx +26 -19
  217. package/src/components/chip/const.ts +3 -0
  218. package/src/components/chip-set/CChipSet.tsx +183 -0
  219. package/src/components/chip-set/__tests__/CChipSet.spec.tsx +215 -0
  220. package/src/components/chip-set/__tests__/__snapshots__/CChipSet.spec.tsx.snap +22 -0
  221. package/src/components/chip-set/index.ts +3 -0
  222. package/src/components/chip-set/useChipSet.ts +243 -0
  223. package/src/components/chip-set/utils.ts +19 -0
  224. package/src/components/collapse/CCollapse.tsx +18 -6
  225. package/src/components/conditional-portal/CConditionalPortal.tsx +4 -2
  226. package/src/components/dropdown/CDropdown.tsx +28 -33
  227. package/src/components/dropdown/CDropdownToggle.tsx +1 -1
  228. package/src/components/dropdown/__tests__/CDropdown.spec.tsx +55 -0
  229. package/src/components/focus-trap/__tests__/CFocusTrap.spec.tsx +1 -1
  230. package/src/components/form/CChipInput.tsx +105 -67
  231. package/src/components/form/CFormCheck.tsx +1 -2
  232. package/src/components/form/CFormInput.tsx +1 -2
  233. package/src/components/form/CFormSelect.tsx +1 -2
  234. package/src/components/form/CFormTextarea.tsx +1 -2
  235. package/src/components/form/CInputGroupText.tsx +3 -2
  236. package/src/components/form/__tests__/CChipInput.spec.tsx +67 -1
  237. package/src/components/form/__tests__/__snapshots__/CChipInput.spec.tsx.snap +7 -0
  238. package/src/components/grid/CContainer.tsx +3 -1
  239. package/src/components/header/CHeaderBrand.tsx +3 -2
  240. package/src/components/index.ts +1 -0
  241. package/src/components/link/CLink.tsx +7 -4
  242. package/src/components/list-group/CListGroupItem.tsx +3 -2
  243. package/src/components/modal/CModal.tsx +19 -2
  244. package/src/components/modal/__tests__/CModal.spec.tsx +43 -0
  245. package/src/components/multi-select/CMultiSelect.tsx +341 -46
  246. package/src/components/multi-select/CMultiSelectNativeSelect.tsx +1 -1
  247. package/src/components/multi-select/CMultiSelectOptions.tsx +74 -3
  248. package/src/components/multi-select/CMultiSelectSelection.tsx +5 -1
  249. package/src/components/multi-select/__tests__/CMultiSelect.spec.tsx +12 -8
  250. package/src/components/multi-select/__tests__/__snapshots__/CMultiSelect.spec.tsx.snap +62 -45
  251. package/src/components/multi-select/__tests__/__snapshots__/CMultiSelectNativeSelect.spec.tsx.snap +2 -2
  252. package/src/components/multi-select/__tests__/__snapshots__/CMultiSelectOptions.spec.tsx.snap +1 -0
  253. package/src/components/multi-select/__tests__/__snapshots__/CMultiSelectSelection.spec.tsx.snap +5 -1
  254. package/src/components/multi-select/types.ts +14 -0
  255. package/src/components/nav/CNav.tsx +3 -2
  256. package/src/components/nav/CNavGroup.tsx +193 -107
  257. package/src/components/nav/CNavGroupContext.ts +27 -0
  258. package/src/components/nav/CNavLink.tsx +26 -12
  259. package/src/components/nav/__tests__/CNavGroup.spec.tsx +195 -20
  260. package/src/components/nav/__tests__/__snapshots__/CNavGroup.spec.tsx.snap +2 -0
  261. package/src/components/popover/CPopover.tsx +59 -9
  262. package/src/components/popover/__tests__/CPopover.spec.tsx +76 -1
  263. package/src/components/progress/CProgress.tsx +1 -2
  264. package/src/components/rating/CRating.tsx +1 -0
  265. package/src/components/search-button/__tests__/CSearchButton.spec.tsx +2 -2
  266. package/src/components/sidebar/CSidebar.tsx +51 -26
  267. package/src/components/sidebar/CSidebarNav.tsx +12 -51
  268. package/src/components/sidebar/__tests__/CSidebar.spec.tsx +26 -0
  269. package/src/components/table/CTableDataCell.tsx +2 -1
  270. package/src/components/table/types.ts +3 -1
  271. package/src/components/table/utils.ts +4 -4
  272. package/src/components/tabs/CTabPanel.tsx +3 -1
  273. package/src/components/tabs/CTabsContext.ts +1 -1
  274. package/src/components/tooltip/CTooltip.tsx +59 -9
  275. package/src/components/tooltip/__tests__/CTooltip.spec.tsx +96 -1
  276. package/src/helpers/polymorphicComponent.ts +1 -1
  277. package/src/hooks/useColorModes.ts +2 -2
  278. package/src/hooks/useForkedRef.ts +20 -15
  279. package/src/hooks/usePopper.ts +13 -9
  280. package/src/utils/__tests__/swipe.spec.ts +82 -0
  281. package/src/utils/executeAfterTransition.ts +1 -1
  282. package/src/utils/index.ts +2 -0
  283. package/src/utils/mergeClassNames.ts +1 -1
  284. package/src/utils/swipe.ts +114 -0
  285. package/dist/cjs/components/sidebar/CSidebarNavContext.d.ts +0 -5
  286. package/dist/cjs/components/sidebar/CSidebarNavContext.js +0 -8
  287. package/dist/cjs/components/sidebar/CSidebarNavContext.js.map +0 -1
  288. package/dist/esm/components/sidebar/CSidebarNavContext.d.ts +0 -5
  289. package/dist/esm/components/sidebar/CSidebarNavContext.js +0 -6
  290. package/dist/esm/components/sidebar/CSidebarNavContext.js.map +0 -1
  291. package/src/components/sidebar/CSidebarNavContext.ts +0 -8
@@ -1,8 +1,8 @@
1
1
  import * as React from 'react'
2
2
  import { fireEvent, render, screen } from '@testing-library/react'
3
3
  import '@testing-library/jest-dom'
4
- import { CNavGroup } from '../index'
5
- import { CSidebarNavContext } from '../../sidebar/CSidebarNavContext'
4
+ import { CNavGroup, CNavItem } from '../index'
5
+ import { CSidebarNav } from '../../sidebar/CSidebarNav'
6
6
 
7
7
  test('loads and displays CNavGroup component', async () => {
8
8
  const { container } = render(<CNavGroup toggler="anchorText" />)
@@ -11,43 +11,218 @@ test('loads and displays CNavGroup component', async () => {
11
11
 
12
12
  test('CNavGroup customize', async () => {
13
13
  const { container } = render(
14
- <CNavGroup className="bazinga" toggler="anchorText" visible={true} idx="1" />
14
+ <CNavGroup className="bazinga" toggler="anchorText" visible={true} />
15
15
  )
16
16
  expect(container).toMatchSnapshot()
17
17
  expect(container.firstChild).toHaveClass('nav-group')
18
18
  expect(container.firstChild).toHaveClass('bazinga')
19
19
  const arr = container.getElementsByClassName('nav-link')
20
20
  if (arr.length > 0) {
21
- //expect(arr[0].innerText).toHaveTextContent('anchorText')
22
21
  expect(arr[0].innerHTML).toBe('anchorText')
23
22
  } else {
24
23
  expect(true).toBe(false)
25
24
  }
26
25
  })
27
26
 
28
- test('CNavGroup stays expanded when visible prop is set', async () => {
29
- render(
30
- <CSidebarNavContext.Provider value={{ visibleGroup: '', setVisibleGroup: jest.fn() }}>
31
- <CNavGroup idx="1" toggler="anchorText" visible={true} />
32
- </CSidebarNavContext.Provider>
27
+ test('CNavGroup toggles its own visibility when uncontrolled', async () => {
28
+ const { container } = render(
29
+ <CSidebarNav>
30
+ <CNavGroup toggler="anchorText">
31
+ <CNavItem href="#">Item</CNavItem>
32
+ </CNavGroup>
33
+ </CSidebarNav>
33
34
  )
34
35
 
35
- expect(screen.getByRole('listitem')).toHaveClass('show')
36
+ const group = container.querySelector('.nav-group') as HTMLElement
37
+ expect(group).not.toHaveClass('show')
38
+
39
+ fireEvent.click(container.querySelector('.nav-group-toggle') as HTMLElement)
40
+ expect(group).toHaveClass('show')
41
+
42
+ fireEvent.click(container.querySelector('.nav-group-toggle') as HTMLElement)
43
+ expect(group).not.toHaveClass('show')
36
44
  })
37
45
 
38
- test('CNavGroup toggler render function receives visible state', async () => {
39
- render(
40
- <CSidebarNavContext.Provider value={{ visibleGroup: '1', setVisibleGroup: jest.fn() }}>
41
- <CNavGroup
42
- idx="1"
43
- toggler={({ visible }) => <span>{visible ? 'expanded' : 'collapsed'}</span>}
44
- />
45
- </CSidebarNavContext.Provider>
46
+ test('CNavGroup follows the visible prop in controlled mode', async () => {
47
+ const { container, rerender } = render(<CNavGroup toggler="anchorText" visible={true} />)
48
+ expect(container.querySelector('.nav-group')).toHaveClass('show')
49
+
50
+ rerender(<CNavGroup toggler="anchorText" visible={false} />)
51
+ expect(container.querySelector('.nav-group')).not.toHaveClass('show')
52
+ })
53
+
54
+ test('CNavGroup stays open when the parent rejects the collapse (controlled)', async () => {
55
+ const onVisibleChange = jest.fn()
56
+ const { container } = render(
57
+ <CNavGroup toggler="anchorText" visible={true} onVisibleChange={onVisibleChange} />
46
58
  )
47
59
 
48
- expect(screen.getByText('expanded')).toBeInTheDocument()
60
+ expect(container.querySelector('.nav-group')).toHaveClass('show')
49
61
 
50
- fireEvent.click(screen.getByRole('link'))
62
+ // Parent keeps `visible` at `true` (rejects the collapse).
63
+ fireEvent.click(container.querySelector('.nav-group-toggle') as HTMLElement)
64
+
65
+ expect(onVisibleChange).toHaveBeenCalledWith(false)
66
+ expect(container.querySelector('.nav-group')).toHaveClass('show')
67
+ })
68
+
69
+ test('CNavGroup toggler render function receives visible state', async () => {
70
+ render(<CNavGroup toggler={({ visible }) => <span>{visible ? 'expanded' : 'collapsed'}</span>} />)
51
71
 
52
72
  expect(screen.getByText('collapsed')).toBeInTheDocument()
73
+
74
+ fireEvent.click(screen.getByRole('link'))
75
+
76
+ expect(screen.getByText('expanded')).toBeInTheDocument()
77
+ })
78
+
79
+ test('an active nav link opens its parent group', async () => {
80
+ const { container } = render(
81
+ <CSidebarNav>
82
+ <CNavGroup toggler="anchorText">
83
+ <CNavItem href="#" active>
84
+ Item
85
+ </CNavItem>
86
+ </CNavGroup>
87
+ </CSidebarNav>
88
+ )
89
+
90
+ expect(container.querySelector('.nav-group')).toHaveClass('show')
91
+ })
92
+
93
+ test('opening another group closes a controlled group when the parent accepts', async () => {
94
+ const Wrapper = () => {
95
+ const [visible, setVisible] = React.useState(true)
96
+ return (
97
+ <CSidebarNav>
98
+ <CNavGroup toggler="Controlled" visible={visible} onVisibleChange={setVisible}>
99
+ <CNavItem href="#">A</CNavItem>
100
+ </CNavGroup>
101
+ <CNavGroup toggler="Other">
102
+ <CNavItem href="#">B</CNavItem>
103
+ </CNavGroup>
104
+ </CSidebarNav>
105
+ )
106
+ }
107
+
108
+ const { container } = render(<Wrapper />)
109
+ const [controlled, other] = Array.from(container.querySelectorAll('.nav-group'))
110
+ expect(controlled).toHaveClass('show')
111
+
112
+ fireEvent.click(container.querySelectorAll('.nav-group-toggle')[1] as HTMLElement)
113
+
114
+ expect(other).toHaveClass('show')
115
+ expect(controlled).not.toHaveClass('show')
116
+ })
117
+
118
+ test('a locked controlled group stays open when another group opens', async () => {
119
+ const Wrapper = () => {
120
+ const [visible, setVisible] = React.useState(true)
121
+ const onVisibleChange = (value: boolean) => {
122
+ if (value) {
123
+ setVisible(true)
124
+ }
125
+ }
126
+ return (
127
+ <CSidebarNav>
128
+ <CNavGroup toggler="Locked" visible={visible} onVisibleChange={onVisibleChange}>
129
+ <CNavItem href="#">A</CNavItem>
130
+ </CNavGroup>
131
+ <CNavGroup toggler="Other">
132
+ <CNavItem href="#">B</CNavItem>
133
+ </CNavGroup>
134
+ </CSidebarNav>
135
+ )
136
+ }
137
+
138
+ const { container } = render(<Wrapper />)
139
+ const [locked, other] = Array.from(container.querySelectorAll('.nav-group'))
140
+ expect(locked).toHaveClass('show')
141
+
142
+ fireEvent.click(container.querySelectorAll('.nav-group-toggle')[1] as HTMLElement)
143
+
144
+ expect(other).toHaveClass('show')
145
+ expect(locked).toHaveClass('show')
146
+ })
147
+
148
+ test('opening an uncontrolled group collapses its sibling', async () => {
149
+ const { container } = render(
150
+ <CSidebarNav>
151
+ <CNavGroup toggler="A">
152
+ <CNavItem href="#">Item</CNavItem>
153
+ </CNavGroup>
154
+ <CNavGroup toggler="B">
155
+ <CNavItem href="#">Item</CNavItem>
156
+ </CNavGroup>
157
+ </CSidebarNav>
158
+ )
159
+
160
+ const [groupA, groupB] = Array.from(container.querySelectorAll('.nav-group'))
161
+ const [togglerA, togglerB] = Array.from(container.querySelectorAll('.nav-group-toggle'))
162
+
163
+ fireEvent.click(togglerA as HTMLElement)
164
+ expect(groupA).toHaveClass('show')
165
+ expect(groupB).not.toHaveClass('show')
166
+
167
+ fireEvent.click(togglerB as HTMLElement)
168
+ expect(groupA).not.toHaveClass('show')
169
+ expect(groupB).toHaveClass('show')
170
+ })
171
+
172
+ test('reopening a parent restores the open state of its nested subgroups', async () => {
173
+ const { container } = render(
174
+ <CSidebarNav>
175
+ <CNavGroup toggler="A" visible>
176
+ <CNavGroup toggler="B" visible>
177
+ <CNavGroup toggler="C" visible>
178
+ <CNavItem href="#">Item</CNavItem>
179
+ </CNavGroup>
180
+ </CNavGroup>
181
+ </CNavGroup>
182
+ </CSidebarNav>
183
+ )
184
+
185
+ const [groupA, groupB, groupC] = Array.from(container.querySelectorAll('.nav-group'))
186
+ expect(groupA).toHaveClass('show')
187
+ expect(groupB).toHaveClass('show')
188
+ expect(groupC).toHaveClass('show')
189
+
190
+ const outerToggler = container.querySelectorAll('.nav-group-toggle')[0] as HTMLElement
191
+
192
+ // Collapse the parent: the whole branch is hidden.
193
+ fireEvent.click(outerToggler)
194
+ expect(groupA).not.toHaveClass('show')
195
+
196
+ // Reopen the parent: nested subgroups come back open (matches vanilla/Vue).
197
+ fireEvent.click(outerToggler)
198
+ expect(groupA).toHaveClass('show')
199
+ expect(groupB).toHaveClass('show')
200
+ expect(groupC).toHaveClass('show')
201
+ })
202
+
203
+ test('nested default-open groups render open and stay independently toggleable', async () => {
204
+ const { container } = render(
205
+ <CSidebarNav>
206
+ <CNavGroup toggler="Group A" visible>
207
+ <CNavGroup toggler="Group B" visible>
208
+ <CNavItem href="#">Item</CNavItem>
209
+ </CNavGroup>
210
+ </CNavGroup>
211
+ </CSidebarNav>
212
+ )
213
+
214
+ const [groupA, groupB] = Array.from(container.querySelectorAll('.nav-group'))
215
+ expect(groupA).toHaveClass('show')
216
+ expect(groupB).toHaveClass('show')
217
+
218
+ // Collapsing the inner group keeps the outer one open.
219
+ const innerToggler = container.querySelectorAll('.nav-group-toggle')[1] as HTMLElement
220
+ fireEvent.click(innerToggler)
221
+ expect(groupA).toHaveClass('show')
222
+ expect(groupB).not.toHaveClass('show')
223
+
224
+ // Collapsing the outer group closes the whole branch.
225
+ const outerToggler = container.querySelectorAll('.nav-group-toggle')[0] as HTMLElement
226
+ fireEvent.click(outerToggler)
227
+ expect(groupA).not.toHaveClass('show')
53
228
  })
@@ -6,6 +6,7 @@ exports[`CNavGroup customize 1`] = `
6
6
  class="nav-group show bazinga"
7
7
  >
8
8
  <a
9
+ aria-expanded="true"
9
10
  class="nav-link nav-group-toggle"
10
11
  href="#"
11
12
  >
@@ -25,6 +26,7 @@ exports[`loads and displays CNavGroup component 1`] = `
25
26
  class="nav-group"
26
27
  >
27
28
  <a
29
+ aria-expanded="false"
28
30
  class="nav-link nav-group-toggle"
29
31
  href="#"
30
32
  >
@@ -182,6 +182,14 @@ export const CPopover = forwardRef<HTMLDivElement, CPopoverProps>(
182
182
  const { initPopper, destroyPopper } = usePopper()
183
183
 
184
184
  const _delay = typeof delay === 'number' ? { show: delay, hide: delay } : delay
185
+ const timer = useRef<ReturnType<typeof setTimeout>>(undefined)
186
+
187
+ const clearTimer = () => {
188
+ if (timer.current) {
189
+ clearTimeout(timer.current)
190
+ timer.current = undefined
191
+ }
192
+ }
185
193
 
186
194
  const defaultPopperConfig: Partial<Options> = {
187
195
  modifiers: [
@@ -198,12 +206,23 @@ export const CPopover = forwardRef<HTMLDivElement, CPopoverProps>(
198
206
  }
199
207
 
200
208
  const handleShow = () => {
201
- setMounted(true)
209
+ clearTimer()
210
+
211
+ if (mounted) {
212
+ timer.current = setTimeout(() => {
213
+ setVisible(true)
214
+ }, _delay.show)
215
+ } else {
216
+ setMounted(true)
217
+ }
218
+
202
219
  onShow?.()
203
220
  }
204
221
 
205
222
  const handleHide = () => {
206
- setTimeout(() => {
223
+ clearTimer()
224
+
225
+ timer.current = setTimeout(() => {
207
226
  setVisible(false)
208
227
  onHide?.()
209
228
  }, _delay.hide)
@@ -220,7 +239,7 @@ export const CPopover = forwardRef<HTMLDivElement, CPopoverProps>(
220
239
  useEffect(() => {
221
240
  if (mounted && togglerRef.current && popoverRef.current) {
222
241
  initPopper(togglerRef.current, popoverRef.current, computedPopperConfig)
223
- setTimeout(() => {
242
+ timer.current = setTimeout(() => {
224
243
  setVisible(true)
225
244
  }, _delay.show)
226
245
 
@@ -232,6 +251,13 @@ export const CPopover = forwardRef<HTMLDivElement, CPopoverProps>(
232
251
  }
233
252
  }, [mounted])
234
253
 
254
+ useEffect(() => {
255
+ return () => {
256
+ clearTimer()
257
+ destroyPopper()
258
+ }
259
+ }, [])
260
+
235
261
  useEffect(() => {
236
262
  if (!_visible && togglerRef.current && popoverRef.current) {
237
263
  executeAfterTransition(() => {
@@ -240,23 +266,47 @@ export const CPopover = forwardRef<HTMLDivElement, CPopoverProps>(
240
266
  }
241
267
  }, [_visible])
242
268
 
269
+ const child = children as React.ReactElement<
270
+ React.HTMLAttributes<HTMLElement> & { ref?: React.Ref<HTMLElement> }
271
+ >
272
+
243
273
  return (
244
274
  <>
245
- {React.cloneElement(children as React.ReactElement<any>, {
275
+ {React.cloneElement(child, {
246
276
  ...(_visible && {
247
277
  'aria-describedby': id,
248
278
  }),
249
279
  ref: togglerRef,
250
280
  ...((trigger === 'click' || trigger.includes('click')) && {
251
- onClick: () => (_visible ? handleHide() : handleShow()),
281
+ onClick: (event: React.MouseEvent<HTMLElement>) => {
282
+ child.props.onClick?.(event)
283
+
284
+ if (_visible) {
285
+ handleHide()
286
+ } else {
287
+ handleShow()
288
+ }
289
+ },
252
290
  }),
253
291
  ...((trigger === 'focus' || trigger.includes('focus')) && {
254
- onFocus: () => handleShow(),
255
- onBlur: () => handleHide(),
292
+ onFocus: (event: React.FocusEvent<HTMLElement>) => {
293
+ child.props.onFocus?.(event)
294
+ handleShow()
295
+ },
296
+ onBlur: (event: React.FocusEvent<HTMLElement>) => {
297
+ child.props.onBlur?.(event)
298
+ handleHide()
299
+ },
256
300
  }),
257
301
  ...((trigger === 'hover' || trigger.includes('hover')) && {
258
- onMouseEnter: () => handleShow(),
259
- onMouseLeave: () => handleHide(),
302
+ onMouseEnter: (event: React.MouseEvent<HTMLElement>) => {
303
+ child.props.onMouseEnter?.(event)
304
+ handleShow()
305
+ },
306
+ onMouseLeave: (event: React.MouseEvent<HTMLElement>) => {
307
+ child.props.onMouseLeave?.(event)
308
+ handleHide()
309
+ },
260
310
  }),
261
311
  })}
262
312
  <CConditionalPortal container={container} portal={true}>
@@ -16,6 +16,74 @@ afterEach(() => {
16
16
  cleanup()
17
17
  })
18
18
 
19
+ test('CPopover stays visible when re-hovered during the hide delay', async () => {
20
+ jest.useFakeTimers()
21
+
22
+ render(
23
+ <CPopover trigger="hover" delay={{ show: 0, hide: 300 }} content="content">
24
+ <CButton color="primary">Test</CButton>
25
+ </CPopover>
26
+ )
27
+
28
+ const btn = screen.getByRole('button', { name: /test/i })
29
+
30
+ act(() => {
31
+ fireEvent.mouseOver(btn)
32
+ })
33
+
34
+ act(() => {
35
+ jest.runAllTimers()
36
+ })
37
+
38
+ expect(document.querySelector('.popover')).toHaveClass('show')
39
+
40
+ act(() => {
41
+ fireEvent.mouseOut(btn)
42
+ jest.advanceTimersByTime(100)
43
+ })
44
+
45
+ act(() => {
46
+ fireEvent.mouseOver(btn)
47
+ jest.advanceTimersByTime(1000)
48
+ })
49
+
50
+ expect(document.querySelector('.popover')).toHaveClass('show')
51
+
52
+ jest.useRealTimers()
53
+ })
54
+
55
+ test('CPopover preserves event handlers of the child element', async () => {
56
+ jest.useFakeTimers()
57
+
58
+ const onClick = jest.fn()
59
+ const onMouseEnter = jest.fn()
60
+
61
+ render(
62
+ <CPopover trigger={['hover', 'click']} content="content">
63
+ <CButton color="primary" onClick={onClick} onMouseEnter={onMouseEnter}>
64
+ Test
65
+ </CButton>
66
+ </CPopover>
67
+ )
68
+
69
+ const btn = screen.getByRole('button', { name: /test/i })
70
+
71
+ act(() => {
72
+ fireEvent.mouseOver(btn)
73
+ jest.runAllTimers()
74
+ })
75
+
76
+ act(() => {
77
+ fireEvent.click(btn)
78
+ jest.runAllTimers()
79
+ })
80
+
81
+ expect(onMouseEnter).toHaveBeenCalledTimes(1)
82
+ expect(onClick).toHaveBeenCalledTimes(1)
83
+
84
+ jest.useRealTimers()
85
+ })
86
+
19
87
  test('loads and displays CPopover component', async () => {
20
88
  const { container } = render(
21
89
  <CPopover content="A">
@@ -61,7 +129,14 @@ test('CPopover onShow and onHide', async () => {
61
129
  const onHide = jest.fn()
62
130
 
63
131
  render(
64
- <CPopover content="content" title="title" trigger="click" placement="right" onShow={onShow} onHide={onHide}>
132
+ <CPopover
133
+ content="content"
134
+ title="title"
135
+ trigger="click"
136
+ placement="right"
137
+ onShow={onShow}
138
+ onHide={onHide}
139
+ >
65
140
  <CButton color="primary">Test</CButton>
66
141
  </CPopover>,
67
142
  { container: container! }
@@ -6,8 +6,7 @@ import { CProgressStackedContext } from './CProgressStackedContext'
6
6
  import { CProgressBar, CProgressBarProps } from './CProgressBar'
7
7
 
8
8
  export interface CProgressProps
9
- extends Omit<HTMLAttributes<HTMLDivElement>, 'color'>,
10
- CProgressBarProps {
9
+ extends Omit<HTMLAttributes<HTMLDivElement>, 'color'>, CProgressBarProps {
11
10
  /**
12
11
  * A string of all className you want applied to the component.
13
12
  */
@@ -2,6 +2,7 @@ import React, {
2
2
  forwardRef,
3
3
  Fragment,
4
4
  HTMLAttributes,
5
+ JSX,
5
6
  ReactNode,
6
7
  useEffect,
7
8
  useId,
@@ -26,7 +26,7 @@ test('loads and displays CSearchButton component', async () => {
26
26
 
27
27
  test('CSearchButton customize', async () => {
28
28
  const { container } = render(
29
- <CSearchButton className="bazinga" placeholder="Command palette" shortcut="meta+k,ctrl+k" />,
29
+ <CSearchButton className="bazinga" placeholder="Command palette" shortcut="meta+k,ctrl+k" />
30
30
  )
31
31
 
32
32
  expect(container).toMatchSnapshot()
@@ -56,7 +56,7 @@ test('CSearchButton ignores plain typing in editable fields', async () => {
56
56
  <>
57
57
  <input aria-label="Search input" />
58
58
  <CSearchButton onClick={onClick} shortcut="k" />
59
- </>,
59
+ </>
60
60
  )
61
61
 
62
62
  fireEvent.keyDown(screen.getByLabelText('Search input'), { key: 'k' })
@@ -92,7 +92,7 @@ export const CSidebar: PolymorphicRefForwardingComponent<'div', CSidebarProps> =
92
92
  visible,
93
93
  ...rest
94
94
  },
95
- ref,
95
+ ref
96
96
  ) => {
97
97
  const sidebarRef = useRef<HTMLDivElement>(null)
98
98
  const forkedRef = useForkedRef(ref, sidebarRef)
@@ -101,46 +101,65 @@ export const CSidebar: PolymorphicRefForwardingComponent<'div', CSidebarProps> =
101
101
  const [mobile, setMobile] = useState(false)
102
102
  const [visibleMobile, setVisibleMobile] = useState<boolean>(false)
103
103
  const [visibleDesktop, setVisibleDesktop] = useState<boolean>(
104
- visible !== undefined ? visible : overlaid ? false : true,
104
+ visible === undefined ? !overlaid : visible
105
105
  )
106
106
 
107
107
  useEffect(() => {
108
- sidebarRef.current && setMobile(isOnMobile(sidebarRef.current))
109
- visible !== undefined && handleVisibleChange(visible)
108
+ if (sidebarRef.current) {
109
+ setMobile(isOnMobile(sidebarRef.current))
110
+ }
111
+
112
+ if (visible !== undefined) {
113
+ handleVisibleChange(visible)
114
+ }
110
115
  }, [visible])
111
116
 
112
117
  useEffect(() => {
113
- inViewport !== undefined && onVisibleChange && onVisibleChange(inViewport)
114
- !inViewport && onHide && onHide()
115
- inViewport && onShow && onShow()
118
+ if (inViewport !== undefined) {
119
+ onVisibleChange?.(inViewport)
120
+ }
121
+
122
+ if (inViewport) {
123
+ onShow?.()
124
+ } else {
125
+ onHide?.()
126
+ }
116
127
  }, [inViewport])
117
128
 
118
129
  useEffect(() => {
119
- mobile && setVisibleMobile(false)
130
+ if (mobile) {
131
+ setVisibleMobile(false)
132
+ }
120
133
  }, [mobile])
121
134
 
122
135
  useEffect(() => {
123
- sidebarRef.current && setMobile(isOnMobile(sidebarRef.current))
124
- sidebarRef.current && setInViewport(isInViewport(sidebarRef.current))
136
+ const element = sidebarRef.current
137
+
138
+ if (element) {
139
+ setMobile(isOnMobile(element))
140
+ setInViewport(isInViewport(element))
141
+ }
142
+
143
+ const handleTransitionEnd = () => {
144
+ if (element) {
145
+ setInViewport(isInViewport(element))
146
+ }
147
+ }
125
148
 
126
149
  window.addEventListener('resize', handleResize)
127
150
  window.addEventListener('mouseup', handleClickOutside)
128
151
  window.addEventListener('keyup', handleKeyup)
129
152
 
130
- sidebarRef.current?.addEventListener('mouseup', handleOnClick)
131
- sidebarRef.current?.addEventListener('transitionend', () => {
132
- sidebarRef.current && setInViewport(isInViewport(sidebarRef.current))
133
- })
153
+ element?.addEventListener('mouseup', handleOnClick)
154
+ element?.addEventListener('transitionend', handleTransitionEnd)
134
155
 
135
156
  return () => {
136
157
  window.removeEventListener('resize', handleResize)
137
158
  window.removeEventListener('mouseup', handleClickOutside)
138
159
  window.removeEventListener('keyup', handleKeyup)
139
160
 
140
- sidebarRef.current?.removeEventListener('mouseup', handleOnClick)
141
- sidebarRef.current?.removeEventListener('transitionend', () => {
142
- sidebarRef.current && setInViewport(isInViewport(sidebarRef.current))
143
- })
161
+ element?.removeEventListener('mouseup', handleOnClick)
162
+ element?.removeEventListener('transitionend', handleTransitionEnd)
144
163
  }
145
164
  })
146
165
 
@@ -158,8 +177,10 @@ export const CSidebar: PolymorphicRefForwardingComponent<'div', CSidebarProps> =
158
177
  }
159
178
 
160
179
  const handleResize = () => {
161
- sidebarRef.current && setMobile(isOnMobile(sidebarRef.current))
162
- sidebarRef.current && setInViewport(isInViewport(sidebarRef.current))
180
+ if (sidebarRef.current) {
181
+ setMobile(isOnMobile(sidebarRef.current))
182
+ setInViewport(isInViewport(sidebarRef.current))
183
+ }
163
184
  }
164
185
 
165
186
  const handleKeyup = (event: Event) => {
@@ -183,11 +204,15 @@ export const CSidebar: PolymorphicRefForwardingComponent<'div', CSidebarProps> =
183
204
 
184
205
  const handleOnClick = (event: Event) => {
185
206
  const target = event.target as HTMLAnchorElement
186
- target &&
207
+
208
+ if (
209
+ target &&
187
210
  target.classList.contains('nav-link') &&
188
211
  !target.classList.contains('nav-group-toggle') &&
189
- mobile &&
212
+ mobile
213
+ ) {
190
214
  handleHide()
215
+ }
191
216
  }
192
217
 
193
218
  return (
@@ -206,7 +231,7 @@ export const CSidebar: PolymorphicRefForwardingComponent<'div', CSidebarProps> =
206
231
  show: (mobile && visibleMobile) || (overlaid && visibleDesktop),
207
232
  hide: visibleDesktop === false && !mobile && !overlaid,
208
233
  },
209
- className,
234
+ className
210
235
  )}
211
236
  {...rest}
212
237
  ref={forkedRef}
@@ -217,11 +242,11 @@ export const CSidebar: PolymorphicRefForwardingComponent<'div', CSidebarProps> =
217
242
  mobile &&
218
243
  createPortal(
219
244
  <CBackdrop className="sidebar-backdrop" visible={mobile && visibleMobile} />,
220
- document.body,
245
+ document.body
221
246
  )}
222
247
  </>
223
248
  )
224
- },
249
+ }
225
250
  )
226
251
 
227
252
  CSidebar.propTypes = {
@@ -241,4 +266,4 @@ CSidebar.propTypes = {
241
266
  visible: PropTypes.bool,
242
267
  }
243
268
 
244
- CSidebar.displayName = 'CSidebar'
269
+ CSidebar.displayName = 'CSidebar'