@coreui/vue-pro 5.18.0 → 5.19.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 (422) hide show
  1. package/README.md +1 -1
  2. package/dist/cjs/components/carousel/CCarousel.d.ts +24 -2
  3. package/dist/cjs/components/carousel/CCarousel.js +51 -14
  4. package/dist/cjs/components/carousel/CCarousel.js.map +1 -1
  5. package/dist/cjs/components/carousel/CCarouselItem.js +3 -3
  6. package/dist/cjs/components/carousel/CCarouselItem.js.map +1 -1
  7. package/dist/cjs/components/chip/CChip.d.ts +97 -11
  8. package/dist/cjs/components/chip/CChip.js +107 -79
  9. package/dist/cjs/components/chip/CChip.js.map +1 -1
  10. package/dist/cjs/components/chip/const.d.ts +1 -0
  11. package/dist/cjs/components/chip/const.js +8 -0
  12. package/dist/cjs/components/chip/const.js.map +1 -0
  13. package/dist/cjs/components/chip-input/CChipInput.d.ts +30 -2
  14. package/dist/cjs/components/chip-input/CChipInput.js +108 -66
  15. package/dist/cjs/components/chip-input/CChipInput.js.map +1 -1
  16. package/dist/cjs/components/chip-set/CChipSet.d.ts +145 -0
  17. package/dist/cjs/components/chip-set/CChipSet.js +127 -0
  18. package/dist/cjs/components/chip-set/CChipSet.js.map +1 -0
  19. package/dist/cjs/components/chip-set/buildChips.d.ts +13 -0
  20. package/dist/cjs/components/chip-set/buildChips.js +19 -0
  21. package/dist/cjs/components/chip-set/buildChips.js.map +1 -0
  22. package/dist/cjs/components/chip-set/index.d.ts +2 -0
  23. package/dist/cjs/components/chip-set/useChipSet.d.ts +42 -0
  24. package/dist/cjs/components/chip-set/useChipSet.js +115 -0
  25. package/dist/cjs/components/chip-set/useChipSet.js.map +1 -0
  26. package/dist/cjs/components/collapse/CCollapse.js +2 -2
  27. package/dist/cjs/components/collapse/CCollapse.js.map +1 -1
  28. package/dist/cjs/components/dropdown/CDropdown.d.ts +24 -1
  29. package/dist/cjs/components/dropdown/CDropdown.js +34 -17
  30. package/dist/cjs/components/dropdown/CDropdown.js.map +1 -1
  31. package/dist/cjs/components/dropdown/CDropdownToggle.js +1 -1
  32. package/dist/cjs/components/dropdown/CDropdownToggle.js.map +1 -1
  33. package/dist/cjs/components/focus-trap/CFocusTrap.js +4 -1
  34. package/dist/cjs/components/focus-trap/CFocusTrap.js.map +1 -1
  35. package/dist/cjs/components/form/CFormInput.d.ts +3 -0
  36. package/dist/cjs/components/form/CFormRange.d.ts +2 -2
  37. package/dist/cjs/components/form/CFormRange.js +2 -2
  38. package/dist/cjs/components/form/CFormRange.js.map +1 -1
  39. package/dist/cjs/components/grid/CContainer.js +3 -1
  40. package/dist/cjs/components/grid/CContainer.js.map +1 -1
  41. package/dist/cjs/components/index.d.ts +2 -0
  42. package/dist/cjs/components/index.js +30 -24
  43. package/dist/cjs/components/index.js.map +1 -1
  44. package/dist/cjs/components/modal/CModal.js +3 -2
  45. package/dist/cjs/components/modal/CModal.js.map +1 -1
  46. package/dist/cjs/components/modal/CModalHeader.js +6 -3
  47. package/dist/cjs/components/modal/CModalHeader.js.map +1 -1
  48. package/dist/cjs/components/multi-select/CMultiSelect.d.ts +206 -3
  49. package/dist/cjs/components/multi-select/CMultiSelect.js +304 -28
  50. package/dist/cjs/components/multi-select/CMultiSelect.js.map +1 -1
  51. package/dist/cjs/components/multi-select/CMultiSelectNativeSelect.js +1 -2
  52. package/dist/cjs/components/multi-select/CMultiSelectNativeSelect.js.map +1 -1
  53. package/dist/cjs/components/multi-select/CMultiSelectOptions.d.ts +16 -1
  54. package/dist/cjs/components/multi-select/CMultiSelectOptions.js +59 -3
  55. package/dist/cjs/components/multi-select/CMultiSelectOptions.js.map +1 -1
  56. package/dist/cjs/components/multi-select/CMultiSelectSelection.d.ts +9 -0
  57. package/dist/cjs/components/multi-select/CMultiSelectSelection.js +6 -1
  58. package/dist/cjs/components/multi-select/CMultiSelectSelection.js.map +1 -1
  59. package/dist/cjs/components/multi-select/utils.js +0 -3
  60. package/dist/cjs/components/multi-select/utils.js.map +1 -1
  61. package/dist/cjs/components/nav/CNav.js +8 -1
  62. package/dist/cjs/components/nav/CNav.js.map +1 -1
  63. package/dist/cjs/components/nav/CNavGroup.d.ts +15 -7
  64. package/dist/cjs/components/nav/CNavGroup.js +113 -88
  65. package/dist/cjs/components/nav/CNavGroup.js.map +1 -1
  66. package/dist/cjs/components/nav/CNavLink.js +11 -0
  67. package/dist/cjs/components/nav/CNavLink.js.map +1 -1
  68. package/dist/cjs/components/popover/CPopover.d.ts +24 -1
  69. package/dist/cjs/components/popover/CPopover.js +18 -1
  70. package/dist/cjs/components/popover/CPopover.js.map +1 -1
  71. package/dist/cjs/components/range-slider/CRangeSlider.d.ts +1 -1
  72. package/dist/cjs/components/search-button/CSearchButton.d.ts +63 -0
  73. package/dist/cjs/components/search-button/CSearchButton.js +125 -0
  74. package/dist/cjs/components/search-button/CSearchButton.js.map +1 -0
  75. package/dist/cjs/components/search-button/index.d.ts +6 -0
  76. package/dist/cjs/components/search-button/index.js +13 -0
  77. package/dist/cjs/components/search-button/index.js.map +1 -0
  78. package/dist/cjs/components/search-button/types.d.ts +10 -0
  79. package/dist/cjs/components/search-button/utils.d.ts +11 -0
  80. package/dist/cjs/components/search-button/utils.js +114 -0
  81. package/dist/cjs/components/search-button/utils.js.map +1 -0
  82. package/dist/cjs/components/sidebar/CSidebar.js +4 -3
  83. package/dist/cjs/components/sidebar/CSidebar.js.map +1 -1
  84. package/dist/cjs/components/sidebar/CSidebarNav.d.ts +32 -0
  85. package/dist/cjs/components/sidebar/CSidebarNav.js +28 -24
  86. package/dist/cjs/components/sidebar/CSidebarNav.js.map +1 -1
  87. package/dist/cjs/components/spinner/CSpinner.d.ts +4 -4
  88. package/dist/cjs/components/spinner/CSpinner.js +2 -2
  89. package/dist/cjs/components/spinner/CSpinner.js.map +1 -1
  90. package/dist/cjs/components/table/utils.js +4 -4
  91. package/dist/cjs/components/table/utils.js.map +1 -1
  92. package/dist/cjs/components/tabs/CTabList.js +8 -2
  93. package/dist/cjs/components/tabs/CTabList.js.map +1 -1
  94. package/dist/cjs/components/tabs/CTabs.js +1 -1
  95. package/dist/cjs/components/tabs/CTabs.js.map +1 -1
  96. package/dist/cjs/components/toast/CToast.js +12 -2
  97. package/dist/cjs/components/toast/CToast.js.map +1 -1
  98. package/dist/cjs/components/toast/CToastClose.d.ts +3 -2
  99. package/dist/cjs/components/toast/CToastClose.js +2 -3
  100. package/dist/cjs/components/toast/CToastClose.js.map +1 -1
  101. package/dist/cjs/components/tooltip/CTooltip.d.ts +24 -1
  102. package/dist/cjs/components/tooltip/CTooltip.js +18 -1
  103. package/dist/cjs/components/tooltip/CTooltip.js.map +1 -1
  104. package/dist/cjs/directives/v-c-popover.js +6 -3
  105. package/dist/cjs/directives/v-c-popover.js.map +1 -1
  106. package/dist/cjs/directives/v-c-tooltip.js +6 -3
  107. package/dist/cjs/directives/v-c-tooltip.js.map +1 -1
  108. package/dist/cjs/directives/v-c-visible.js +1 -1
  109. package/dist/cjs/directives/v-c-visible.js.map +1 -1
  110. package/dist/cjs/index.js +36 -30
  111. package/dist/cjs/index.js.map +1 -1
  112. package/dist/cjs/node_modules/@coreui/icons/dist/esm/free/cil-arrow-bottom.js +1 -1
  113. package/dist/cjs/node_modules/@coreui/icons/dist/esm/free/cil-arrow-bottom.js.map +1 -1
  114. package/dist/cjs/node_modules/@coreui/icons/dist/esm/free/cil-arrow-top.js +1 -1
  115. package/dist/cjs/node_modules/@coreui/icons/dist/esm/free/cil-arrow-top.js.map +1 -1
  116. package/dist/cjs/node_modules/@coreui/icons/dist/esm/free/cil-filter-x.js +1 -1
  117. package/dist/cjs/node_modules/@coreui/icons/dist/esm/free/cil-filter-x.js.map +1 -1
  118. package/dist/cjs/node_modules/@coreui/icons/dist/esm/free/cil-swap-vertical.js +1 -1
  119. package/dist/cjs/node_modules/@coreui/icons/dist/esm/free/cil-swap-vertical.js.map +1 -1
  120. package/dist/cjs/utils/index.d.ts +2 -1
  121. package/dist/cjs/utils/swipe.d.ts +26 -0
  122. package/dist/cjs/utils/swipe.js +94 -0
  123. package/dist/cjs/utils/swipe.js.map +1 -0
  124. package/dist/cjs/utils/transition.js.map +1 -1
  125. package/dist/esm/components/carousel/CCarousel.d.ts +24 -2
  126. package/dist/esm/components/carousel/CCarousel.js +52 -15
  127. package/dist/esm/components/carousel/CCarousel.js.map +1 -1
  128. package/dist/esm/components/carousel/CCarouselItem.js +3 -3
  129. package/dist/esm/components/carousel/CCarouselItem.js.map +1 -1
  130. package/dist/esm/components/chip/CChip.d.ts +97 -11
  131. package/dist/esm/components/chip/CChip.js +108 -80
  132. package/dist/esm/components/chip/CChip.js.map +1 -1
  133. package/dist/esm/components/chip/const.d.ts +1 -0
  134. package/dist/esm/components/chip/const.js +6 -0
  135. package/dist/esm/components/chip/const.js.map +1 -0
  136. package/dist/esm/components/chip-input/CChipInput.d.ts +30 -2
  137. package/dist/esm/components/chip-input/CChipInput.js +109 -67
  138. package/dist/esm/components/chip-input/CChipInput.js.map +1 -1
  139. package/dist/esm/components/chip-set/CChipSet.d.ts +145 -0
  140. package/dist/esm/components/chip-set/CChipSet.js +125 -0
  141. package/dist/esm/components/chip-set/CChipSet.js.map +1 -0
  142. package/dist/esm/components/chip-set/buildChips.d.ts +13 -0
  143. package/dist/esm/components/chip-set/buildChips.js +17 -0
  144. package/dist/esm/components/chip-set/buildChips.js.map +1 -0
  145. package/dist/esm/components/chip-set/index.d.ts +2 -0
  146. package/dist/esm/components/chip-set/useChipSet.d.ts +42 -0
  147. package/dist/esm/components/chip-set/useChipSet.js +112 -0
  148. package/dist/esm/components/chip-set/useChipSet.js.map +1 -0
  149. package/dist/esm/components/collapse/CCollapse.js +2 -2
  150. package/dist/esm/components/collapse/CCollapse.js.map +1 -1
  151. package/dist/esm/components/dropdown/CDropdown.d.ts +24 -1
  152. package/dist/esm/components/dropdown/CDropdown.js +34 -17
  153. package/dist/esm/components/dropdown/CDropdown.js.map +1 -1
  154. package/dist/esm/components/dropdown/CDropdownToggle.js +1 -1
  155. package/dist/esm/components/dropdown/CDropdownToggle.js.map +1 -1
  156. package/dist/esm/components/focus-trap/CFocusTrap.js +4 -1
  157. package/dist/esm/components/focus-trap/CFocusTrap.js.map +1 -1
  158. package/dist/esm/components/form/CFormInput.d.ts +3 -0
  159. package/dist/esm/components/form/CFormRange.d.ts +2 -2
  160. package/dist/esm/components/form/CFormRange.js +2 -2
  161. package/dist/esm/components/form/CFormRange.js.map +1 -1
  162. package/dist/esm/components/grid/CContainer.js +3 -1
  163. package/dist/esm/components/grid/CContainer.js.map +1 -1
  164. package/dist/esm/components/index.d.ts +2 -0
  165. package/dist/esm/components/index.js +3 -0
  166. package/dist/esm/components/index.js.map +1 -1
  167. package/dist/esm/components/modal/CModal.js +3 -2
  168. package/dist/esm/components/modal/CModal.js.map +1 -1
  169. package/dist/esm/components/modal/CModalHeader.js +6 -3
  170. package/dist/esm/components/modal/CModalHeader.js.map +1 -1
  171. package/dist/esm/components/multi-select/CMultiSelect.d.ts +206 -3
  172. package/dist/esm/components/multi-select/CMultiSelect.js +305 -29
  173. package/dist/esm/components/multi-select/CMultiSelect.js.map +1 -1
  174. package/dist/esm/components/multi-select/CMultiSelectNativeSelect.js +1 -2
  175. package/dist/esm/components/multi-select/CMultiSelectNativeSelect.js.map +1 -1
  176. package/dist/esm/components/multi-select/CMultiSelectOptions.d.ts +16 -1
  177. package/dist/esm/components/multi-select/CMultiSelectOptions.js +59 -3
  178. package/dist/esm/components/multi-select/CMultiSelectOptions.js.map +1 -1
  179. package/dist/esm/components/multi-select/CMultiSelectSelection.d.ts +9 -0
  180. package/dist/esm/components/multi-select/CMultiSelectSelection.js +6 -1
  181. package/dist/esm/components/multi-select/CMultiSelectSelection.js.map +1 -1
  182. package/dist/esm/components/multi-select/utils.js +0 -3
  183. package/dist/esm/components/multi-select/utils.js.map +1 -1
  184. package/dist/esm/components/nav/CNav.js +8 -1
  185. package/dist/esm/components/nav/CNav.js.map +1 -1
  186. package/dist/esm/components/nav/CNavGroup.d.ts +15 -7
  187. package/dist/esm/components/nav/CNavGroup.js +114 -89
  188. package/dist/esm/components/nav/CNavGroup.js.map +1 -1
  189. package/dist/esm/components/nav/CNavLink.js +12 -1
  190. package/dist/esm/components/nav/CNavLink.js.map +1 -1
  191. package/dist/esm/components/popover/CPopover.d.ts +24 -1
  192. package/dist/esm/components/popover/CPopover.js +18 -1
  193. package/dist/esm/components/popover/CPopover.js.map +1 -1
  194. package/dist/esm/components/range-slider/CRangeSlider.d.ts +1 -1
  195. package/dist/esm/components/search-button/CSearchButton.d.ts +63 -0
  196. package/dist/esm/components/search-button/CSearchButton.js +123 -0
  197. package/dist/esm/components/search-button/CSearchButton.js.map +1 -0
  198. package/dist/esm/components/search-button/index.d.ts +6 -0
  199. package/dist/esm/components/search-button/index.js +10 -0
  200. package/dist/esm/components/search-button/index.js.map +1 -0
  201. package/dist/esm/components/search-button/types.d.ts +10 -0
  202. package/dist/esm/components/search-button/utils.d.ts +11 -0
  203. package/dist/esm/components/search-button/utils.js +103 -0
  204. package/dist/esm/components/search-button/utils.js.map +1 -0
  205. package/dist/esm/components/sidebar/CSidebar.js +4 -3
  206. package/dist/esm/components/sidebar/CSidebar.js.map +1 -1
  207. package/dist/esm/components/sidebar/CSidebarNav.d.ts +32 -0
  208. package/dist/esm/components/sidebar/CSidebarNav.js +29 -25
  209. package/dist/esm/components/sidebar/CSidebarNav.js.map +1 -1
  210. package/dist/esm/components/spinner/CSpinner.d.ts +4 -4
  211. package/dist/esm/components/spinner/CSpinner.js +2 -2
  212. package/dist/esm/components/spinner/CSpinner.js.map +1 -1
  213. package/dist/esm/components/table/utils.js +4 -4
  214. package/dist/esm/components/table/utils.js.map +1 -1
  215. package/dist/esm/components/tabs/CTabList.js +8 -2
  216. package/dist/esm/components/tabs/CTabList.js.map +1 -1
  217. package/dist/esm/components/tabs/CTabs.js +1 -1
  218. package/dist/esm/components/tabs/CTabs.js.map +1 -1
  219. package/dist/esm/components/toast/CToast.js +12 -2
  220. package/dist/esm/components/toast/CToast.js.map +1 -1
  221. package/dist/esm/components/toast/CToastClose.d.ts +3 -2
  222. package/dist/esm/components/toast/CToastClose.js +2 -3
  223. package/dist/esm/components/toast/CToastClose.js.map +1 -1
  224. package/dist/esm/components/tooltip/CTooltip.d.ts +24 -1
  225. package/dist/esm/components/tooltip/CTooltip.js +18 -1
  226. package/dist/esm/components/tooltip/CTooltip.js.map +1 -1
  227. package/dist/esm/directives/v-c-popover.js +6 -3
  228. package/dist/esm/directives/v-c-popover.js.map +1 -1
  229. package/dist/esm/directives/v-c-tooltip.js +6 -3
  230. package/dist/esm/directives/v-c-tooltip.js.map +1 -1
  231. package/dist/esm/directives/v-c-visible.js +1 -1
  232. package/dist/esm/directives/v-c-visible.js.map +1 -1
  233. package/dist/esm/index.js +3 -0
  234. package/dist/esm/index.js.map +1 -1
  235. package/dist/esm/node_modules/@coreui/icons/dist/esm/free/cil-arrow-bottom.js +1 -1
  236. package/dist/esm/node_modules/@coreui/icons/dist/esm/free/cil-arrow-bottom.js.map +1 -1
  237. package/dist/esm/node_modules/@coreui/icons/dist/esm/free/cil-arrow-top.js +1 -1
  238. package/dist/esm/node_modules/@coreui/icons/dist/esm/free/cil-arrow-top.js.map +1 -1
  239. package/dist/esm/node_modules/@coreui/icons/dist/esm/free/cil-filter-x.js +1 -1
  240. package/dist/esm/node_modules/@coreui/icons/dist/esm/free/cil-filter-x.js.map +1 -1
  241. package/dist/esm/node_modules/@coreui/icons/dist/esm/free/cil-swap-vertical.js +1 -1
  242. package/dist/esm/node_modules/@coreui/icons/dist/esm/free/cil-swap-vertical.js.map +1 -1
  243. package/dist/esm/utils/index.d.ts +2 -1
  244. package/dist/esm/utils/swipe.d.ts +26 -0
  245. package/dist/esm/utils/swipe.js +90 -0
  246. package/dist/esm/utils/swipe.js.map +1 -0
  247. package/dist/esm/utils/transition.js.map +1 -1
  248. package/package.json +6 -6
  249. package/src/components/accordion/CAccordion.ts +2 -2
  250. package/src/components/accordion/CAccordionBody.ts +1 -1
  251. package/src/components/accordion/CAccordionButton.ts +1 -1
  252. package/src/components/accordion/CAccordionHeader.ts +2 -2
  253. package/src/components/accordion/__tests__/__snapshots__/CAccordionButton.spec.ts.snap +1 -1
  254. package/src/components/accordion/__tests__/__snapshots__/CAccordionHeader.spec.ts.snap +1 -1
  255. package/src/components/alert/CAlert.ts +3 -3
  256. package/src/components/alert/CAlertHeading.ts +1 -1
  257. package/src/components/alert/CAlertLink.ts +1 -1
  258. package/src/components/autocomplete/__tests__/CAutocomplete.spec.ts +5 -1
  259. package/src/components/autocomplete/__tests__/CAutocompleteOptions.spec.ts +8 -5
  260. package/src/components/avatar/CAvatar.ts +1 -1
  261. package/src/components/backdrop/CBackdrop.ts +1 -1
  262. package/src/components/badge/CBadge.ts +1 -1
  263. package/src/components/breadcrumb/CBreadcrumb.ts +1 -1
  264. package/src/components/breadcrumb/CBreadcrumbItem.ts +1 -1
  265. package/src/components/button/CButton.ts +1 -1
  266. package/src/components/button/__tests__/CButton.spec.ts +0 -1
  267. package/src/components/button/__tests__/__snapshots__/CButton.spec.ts.snap +1 -1
  268. package/src/components/button-group/CButtonGroup.ts +1 -1
  269. package/src/components/callout/CCallout.ts +1 -1
  270. package/src/components/card/CCard.ts +1 -1
  271. package/src/components/card/CCardImage.ts +1 -1
  272. package/src/components/card/CCardLink.ts +1 -1
  273. package/src/components/carousel/CCarousel.ts +61 -22
  274. package/src/components/carousel/CCarouselCaption.ts +1 -1
  275. package/src/components/carousel/CCarouselItem.ts +5 -4
  276. package/src/components/carousel/__tests__/CCarousel.spec.ts +1 -1
  277. package/src/components/chip/CChip.ts +123 -101
  278. package/src/components/chip/__tests__/CChip.spec.ts +26 -0
  279. package/src/components/chip/const.ts +3 -0
  280. package/src/components/chip-input/CChipInput.ts +134 -82
  281. package/src/components/chip-input/__tests__/CChipInput.spec.ts +80 -4
  282. package/src/components/chip-input/__tests__/__snapshots__/CChipInput.spec.ts.snap +1 -1
  283. package/src/components/chip-set/CChipSet.ts +140 -0
  284. package/src/components/chip-set/__tests__/CChipSet.spec.ts +174 -0
  285. package/src/components/chip-set/buildChips.ts +29 -0
  286. package/src/components/chip-set/index.ts +3 -0
  287. package/src/components/chip-set/useChipSet.ts +168 -0
  288. package/src/components/collapse/CCollapse.ts +5 -5
  289. package/src/components/collapse/__tests__/CCollapse.spec.ts +48 -0
  290. package/src/components/collapse/__tests__/__snapshots__/CCollapse.spec.ts.snap +7 -0
  291. package/src/components/conditional-teleport/CConditionalTeleport.ts +3 -3
  292. package/src/components/conditional-teleport/__tests__/CConditionalTeleport.spec.ts +28 -0
  293. package/src/components/dropdown/CDropdown.ts +43 -23
  294. package/src/components/dropdown/CDropdownHeader.ts +1 -1
  295. package/src/components/dropdown/CDropdownItem.ts +1 -1
  296. package/src/components/dropdown/CDropdownMenu.ts +2 -2
  297. package/src/components/dropdown/CDropdownToggle.ts +4 -4
  298. package/src/components/dropdown/__tests__/CDropdown.spec.ts +1 -1
  299. package/src/components/dropdown/__tests__/CDropdownMenu.spec.ts +11 -7
  300. package/src/components/dropdown/__tests__/CDropdownPopperConfig.spec.ts +63 -0
  301. package/src/components/dropdown/__tests__/CDropdownToggle.spec.ts +0 -2
  302. package/src/components/dropdown/__tests__/__snapshots__/CDropdown.spec.ts.snap +1 -1
  303. package/src/components/dropdown/__tests__/__snapshots__/CDropdownMenu.spec.ts.snap +4 -0
  304. package/src/components/dropdown/utils.ts +2 -2
  305. package/src/components/focus-trap/CFocusTrap.ts +9 -6
  306. package/src/components/focus-trap/__tests__/CFocusTrap.spec.ts +42 -0
  307. package/src/components/footer/CFooter.ts +1 -1
  308. package/src/components/form/CForm.ts +1 -1
  309. package/src/components/form/CFormCheck.ts +5 -5
  310. package/src/components/form/CFormControlValidation.ts +3 -3
  311. package/src/components/form/CFormFeedback.ts +1 -1
  312. package/src/components/form/CFormFloating.ts +1 -1
  313. package/src/components/form/CFormInput.ts +2 -2
  314. package/src/components/form/CFormLabel.ts +1 -1
  315. package/src/components/form/CFormRange.ts +4 -4
  316. package/src/components/form/CFormSelect.ts +3 -3
  317. package/src/components/form/CFormSwitch.ts +2 -2
  318. package/src/components/form/CFormTextarea.ts +2 -2
  319. package/src/components/form/CInputGroup.ts +1 -1
  320. package/src/components/form/__tests__/CFormRange.spec.ts +2 -2
  321. package/src/components/form/__tests__/CFormText.spec.ts +1 -1
  322. package/src/components/form/__tests__/__snapshots__/CFormRange.spec.ts.snap +1 -1
  323. package/src/components/grid/CCol.ts +1 -1
  324. package/src/components/grid/CContainer.ts +4 -2
  325. package/src/components/grid/CRow.ts +1 -1
  326. package/src/components/header/CHeader.ts +2 -2
  327. package/src/components/header/CHeaderNav.ts +1 -1
  328. package/src/components/header/CHeaderToggler.ts +1 -1
  329. package/src/components/header/__tests__/CHeader.spec.ts +1 -2
  330. package/src/components/index.ts +2 -0
  331. package/src/components/link/CLink.ts +1 -1
  332. package/src/components/list-group/CListGroup.ts +1 -1
  333. package/src/components/list-group/CListGroupItem.ts +1 -1
  334. package/src/components/modal/CModal.ts +3 -2
  335. package/src/components/modal/CModalHeader.ts +10 -3
  336. package/src/components/modal/__tests__/__snapshots__/CModal.spec.ts.snap +9 -4
  337. package/src/components/multi-select/CMultiSelect.ts +380 -41
  338. package/src/components/multi-select/CMultiSelectNativeSelect.ts +1 -2
  339. package/src/components/multi-select/CMultiSelectOptions.ts +77 -3
  340. package/src/components/multi-select/CMultiSelectSelection.ts +6 -1
  341. package/src/components/nav/CNav.ts +9 -2
  342. package/src/components/nav/CNavGroup.ts +147 -99
  343. package/src/components/nav/CNavItem.ts +2 -2
  344. package/src/components/nav/CNavLink.ts +19 -2
  345. package/src/components/nav/__tests__/CNavGroup.spec.ts +188 -6
  346. package/src/components/nav/__tests__/CNavItem.spec.ts +6 -6
  347. package/src/components/nav/__tests__/__snapshots__/CNavGroup.spec.ts.snap +3 -7
  348. package/src/components/nav/__tests__/__snapshots__/CNavItem.spec.ts.snap +1 -5
  349. package/src/components/navbar/CNavbar.ts +2 -2
  350. package/src/components/navbar/CNavbarBrand.ts +1 -1
  351. package/src/components/navbar/CNavbarNav.ts +1 -1
  352. package/src/components/navbar/CNavbarToggler.ts +1 -1
  353. package/src/components/navbar/__tests__/CNavbar.spec.ts +1 -1
  354. package/src/components/pagination/CPagination.ts +2 -2
  355. package/src/components/pagination/CPaginationItem.ts +2 -2
  356. package/src/components/placeholder/CPlaceholder.ts +1 -1
  357. package/src/components/popover/CPopover.ts +27 -7
  358. package/src/components/popover/__tests__/CPopover.spec.ts +43 -0
  359. package/src/components/progress/CProgress.ts +2 -2
  360. package/src/components/progress/CProgressBar.ts +1 -1
  361. package/src/components/progress/CProgressStacked.ts +1 -1
  362. package/src/components/progress/__tests__/CProgressBar.spec.ts +0 -4
  363. package/src/components/search-button/CSearchButton.ts +163 -0
  364. package/src/components/search-button/__tests__/CSearchButton.spec.ts +128 -0
  365. package/src/components/search-button/__tests__/__snapshots__/CSearchButton.spec.ts.snap +13 -0
  366. package/src/components/search-button/index.ts +10 -0
  367. package/src/components/search-button/types.ts +10 -0
  368. package/src/components/search-button/utils.ts +140 -0
  369. package/src/components/sidebar/CSidebar.ts +9 -6
  370. package/src/components/sidebar/CSidebarBrand.ts +1 -1
  371. package/src/components/sidebar/CSidebarNav.ts +30 -28
  372. package/src/components/sidebar/__tests__/CSidebar.spec.ts +1 -1
  373. package/src/components/spinner/CSpinner.ts +6 -6
  374. package/src/components/spinner/__tests__/CSpinner.spec.ts +0 -1
  375. package/src/components/stepper/__tests__/CStepper.spec.ts +13 -8
  376. package/src/components/table/CTable.ts +16 -16
  377. package/src/components/table/CTableBody.ts +1 -1
  378. package/src/components/table/CTableDataCell.ts +1 -1
  379. package/src/components/table/CTableFoot.ts +1 -1
  380. package/src/components/table/CTableHead.ts +1 -1
  381. package/src/components/table/CTableHeaderCell.ts +1 -1
  382. package/src/components/table/CTableRow.ts +1 -1
  383. package/src/components/table/types.ts +1 -0
  384. package/src/components/table/utils.ts +4 -4
  385. package/src/components/tabs/CTab.ts +1 -1
  386. package/src/components/tabs/CTabList.ts +12 -5
  387. package/src/components/tabs/CTabPane.ts +3 -3
  388. package/src/components/tabs/CTabPanel.ts +5 -5
  389. package/src/components/tabs/CTabs.ts +2 -2
  390. package/src/components/tabs/__tests__/__snapshots__/CTabPane.spec.ts.snap +1 -1
  391. package/src/components/toast/CToast.ts +12 -4
  392. package/src/components/toast/CToastClose.ts +5 -6
  393. package/src/components/toast/CToaster.ts +1 -1
  394. package/src/components/toast/__tests__/CToaster.spec.ts +0 -2
  395. package/src/components/toast/__tests__/__snapshots__/CToastClose.spec.ts.snap +1 -1
  396. package/src/components/tooltip/CTooltip.ts +26 -6
  397. package/src/components/tooltip/__tests__/CTooltip.spec.ts +43 -0
  398. package/src/components/widgets/CWidgetStatsA.ts +4 -4
  399. package/src/components/widgets/CWidgetStatsB.ts +5 -5
  400. package/src/components/widgets/CWidgetStatsC.ts +5 -5
  401. package/src/components/widgets/CWidgetStatsD.ts +5 -5
  402. package/src/components/widgets/CWidgetStatsE.ts +4 -4
  403. package/src/components/widgets/CWidgetStatsF.ts +5 -5
  404. package/src/directives/__tests__/v-c-placeholder.spec.ts +33 -0
  405. package/src/directives/__tests__/v-c-popover.spec.ts +67 -0
  406. package/src/directives/__tests__/v-c-tooltip.spec.ts +66 -0
  407. package/src/directives/v-c-popover.ts +8 -5
  408. package/src/directives/v-c-tooltip.ts +8 -5
  409. package/src/directives/v-c-visible.ts +1 -1
  410. package/src/index.ts +1 -1
  411. package/src/utils/ComponentProps.ts +1 -0
  412. package/src/utils/__tests__/swipe.spec.ts +82 -0
  413. package/src/utils/getNextActiveElement.ts +1 -1
  414. package/src/utils/index.ts +2 -0
  415. package/src/utils/swipe.ts +114 -0
  416. package/src/utils/transition.ts +2 -2
  417. package/dist/cjs/components/collapse/__test__/CCollapse.spec.d.ts +0 -1
  418. package/dist/esm/components/collapse/__test__/CCollapse.spec.d.ts +0 -1
  419. package/src/components/accordion/__tests__/CAccordionCollapse.spec.ts +0 -28
  420. package/src/components/accordion/__tests__/__snapshots__/CAccordionCollapse.spec.ts.snap +0 -7
  421. package/src/components/collapse/__test__/CCollapse.spec.ts +0 -44
  422. package/src/components/collapse/__test__/__snapshots__/CCollapse.spec.ts.snap +0 -13
@@ -1,5 +1,7 @@
1
1
  import { mount } from '@vue/test-utils'
2
- import { CNavGroup as Component } from '../../../index'
2
+ import { h, nextTick } from 'vue'
3
+ import { CNavGroup as Component, CNavGroup, CNavItem } from '../../../index'
4
+ import { CSidebarNav } from '../../sidebar/CSidebarNav'
3
5
 
4
6
  const ComponentName = 'CNavGroup'
5
7
 
@@ -38,14 +40,194 @@ describe(`Customize ${ComponentName} component`, () => {
38
40
  expect(customWrapper.find('a').text()).toContain('togglerContent')
39
41
  expect(customWrapper.find('a').classes('nav-link')).toBe(true)
40
42
  expect(customWrapper.find('a').classes('nav-group-toggle')).toBe(true)
43
+ expect(customWrapper.find('a').attributes('aria-expanded')).toBe('true')
41
44
  expect(customWrapper.find('ul').classes('nav-group-items')).toBe(true)
42
45
  expect(customWrapper.find('ul').classes('compact')).toBe(true)
43
46
  expect(customWrapper.classes('nav-group')).toBe(true)
47
+ expect(customWrapper.classes('show')).toBe(true)
44
48
  })
45
- it('emit event visible-change on click nav-group-toggle', () => {
46
- let incrementEvent = customWrapper.emitted('visible-change')
47
- customWrapper.find('.nav-group-toggle').trigger('click')
48
- incrementEvent = customWrapper.emitted('visible-change')
49
- expect(incrementEvent).toHaveLength(3)
49
+ })
50
+
51
+ describe(`${ComponentName} uncontrolled mode`, () => {
52
+ it('toggles its own visibility and emits on actual change', async () => {
53
+ const wrapper = mount(Component, {
54
+ slots: { togglerContent: 'togglerContent' },
55
+ })
56
+
57
+ expect(wrapper.classes('show')).toBe(false)
58
+ expect(wrapper.emitted('visible-change')).toBeUndefined()
59
+
60
+ await wrapper.find('.nav-group-toggle').trigger('click')
61
+
62
+ expect(wrapper.classes('show')).toBe(true)
63
+ expect(wrapper.emitted('update:visible')).toEqual([[true]])
64
+ expect(wrapper.emitted('visible-change')).toEqual([[true]])
65
+
66
+ await wrapper.find('.nav-group-toggle').trigger('click')
67
+
68
+ expect(wrapper.classes('show')).toBe(false)
69
+ })
70
+
71
+ it('does not emit visible-change on mount', () => {
72
+ const wrapper = mount(Component, {
73
+ slots: { togglerContent: 'togglerContent' },
74
+ })
75
+
76
+ expect(wrapper.emitted('visible-change')).toBeUndefined()
77
+ })
78
+
79
+ it('treats `visible` without a listener as default-open and stays toggleable', async () => {
80
+ const wrapper = mount(Component, {
81
+ propsData: { visible: true },
82
+ slots: { togglerContent: 'togglerContent' },
83
+ })
84
+
85
+ expect(wrapper.classes('show')).toBe(true)
86
+
87
+ await wrapper.find('.nav-group-toggle').trigger('click')
88
+
89
+ expect(wrapper.classes('show')).toBe(false)
90
+ })
91
+ })
92
+
93
+ const nested = () =>
94
+ mount(CSidebarNav, {
95
+ slots: {
96
+ default: () => [
97
+ h(
98
+ CNavGroup,
99
+ {},
100
+ {
101
+ togglerContent: () => 'A',
102
+ default: () => [
103
+ h(
104
+ CNavGroup,
105
+ {},
106
+ {
107
+ togglerContent: () => 'B',
108
+ default: () => [h(CNavItem, { href: '#' }, () => 'item')],
109
+ }
110
+ ),
111
+ ],
112
+ }
113
+ ),
114
+ ],
115
+ },
116
+ })
117
+
118
+ describe(`${ComponentName} nested groups`, () => {
119
+ it('renders and toggles per level', async () => {
120
+ const wrapper = nested()
121
+ const group = (index: number) => wrapper.findAll('.nav-group')[index]
122
+
123
+ expect(group(0).classes('show')).toBe(false)
124
+
125
+ await wrapper.findAll('.nav-group-toggle')[0].trigger('click')
126
+ expect(group(0).classes('show')).toBe(true)
127
+ expect(group(1).classes('show')).toBe(false)
128
+
129
+ await wrapper.findAll('.nav-group-toggle')[1].trigger('click')
130
+ expect(group(1).classes('show')).toBe(true)
131
+
132
+ await wrapper.findAll('.nav-group-toggle')[0].trigger('click')
133
+ expect(group(0).classes('show')).toBe(false)
134
+ })
135
+
136
+ it('opening one sibling closes the other (per-level accordion)', async () => {
137
+ const wrapper = mount(CSidebarNav, {
138
+ slots: {
139
+ default: () => [
140
+ h(
141
+ CNavGroup,
142
+ {},
143
+ {
144
+ togglerContent: () => 'A',
145
+ default: () => [h(CNavItem, { href: '#' }, () => 'itemA')],
146
+ }
147
+ ),
148
+ h(
149
+ CNavGroup,
150
+ {},
151
+ {
152
+ togglerContent: () => 'B',
153
+ default: () => [h(CNavItem, { href: '#' }, () => 'itemB')],
154
+ }
155
+ ),
156
+ ],
157
+ },
158
+ })
159
+ const group = (index: number) => wrapper.findAll('.nav-group')[index]
160
+
161
+ await wrapper.findAll('.nav-group-toggle')[0].trigger('click')
162
+ expect(group(0).classes('show')).toBe(true)
163
+ expect(group(1).classes('show')).toBe(false)
164
+
165
+ await wrapper.findAll('.nav-group-toggle')[1].trigger('click')
166
+ expect(group(1).classes('show')).toBe(true)
167
+ expect(group(0).classes('show')).toBe(false)
168
+ })
169
+
170
+ it('an active nav link opens its ancestor groups', async () => {
171
+ const wrapper = mount(CSidebarNav, {
172
+ slots: {
173
+ default: () => [
174
+ h(
175
+ CNavGroup,
176
+ {},
177
+ {
178
+ togglerContent: () => 'A',
179
+ default: () => [
180
+ h(
181
+ CNavGroup,
182
+ {},
183
+ {
184
+ togglerContent: () => 'B',
185
+ default: () => [h(CNavItem, { active: true, href: '#' }, () => 'item')],
186
+ }
187
+ ),
188
+ ],
189
+ }
190
+ ),
191
+ ],
192
+ },
193
+ })
194
+
195
+ await nextTick()
196
+
197
+ expect(wrapper.findAll('.nav-group')[0].classes('show')).toBe(true)
198
+ expect(wrapper.findAll('.nav-group')[1].classes('show')).toBe(true)
199
+ })
200
+ })
201
+
202
+ describe(`${ComponentName} controlled mode`, () => {
203
+ it('stays open when the parent rejects the collapse (#313)', async () => {
204
+ const onUpdate = jest.fn()
205
+ const wrapper = mount(Component, {
206
+ props: { visible: true, 'onUpdate:visible': onUpdate },
207
+ slots: { togglerContent: 'togglerContent' },
208
+ })
209
+
210
+ expect(wrapper.classes('show')).toBe(true)
211
+
212
+ await wrapper.find('.nav-group-toggle').trigger('click')
213
+
214
+ expect(onUpdate).toHaveBeenCalledWith(false)
215
+ expect(wrapper.classes('show')).toBe(true)
216
+ })
217
+
218
+ it('follows the prop when the parent accepts (v-model)', async () => {
219
+ const onUpdate = jest.fn()
220
+ const wrapper = mount(Component, {
221
+ props: { visible: true, 'onUpdate:visible': onUpdate },
222
+ slots: { togglerContent: 'togglerContent' },
223
+ })
224
+
225
+ await wrapper.find('.nav-group-toggle').trigger('click')
226
+ expect(onUpdate).toHaveBeenCalledWith(false)
227
+
228
+ await wrapper.setProps({ visible: false })
229
+
230
+ expect(wrapper.emitted('visible-change')).toContainEqual([false])
231
+ expect(wrapper.classes('show')).toBe(false)
50
232
  })
51
233
  })
@@ -40,12 +40,12 @@ describe(`Customize ${ComponentName} component`, () => {
40
40
  expect(customWrapper.html()).toMatchSnapshot()
41
41
  })
42
42
  it('contain slots and classes', () => {
43
- expect(customWrapper.find('div').text()).toContain('Default slot')
43
+ expect(customWrapper.find('a').text()).toContain('Default slot')
44
44
  expect(customWrapper.classes('nav-item')).toBe(true)
45
- expect(customWrapper.find('div').classes('nav-link')).toBe(true)
46
- expect(customWrapper.find('div').classes('active')).toBe(true)
47
- expect(customWrapper.find('div').classes('disabled')).toBe(true)
48
- expect(customWrapper.find('div').attributes('href')).toBe('/bazinga')
49
- expect(customWrapper.find('div').attributes('aria-current')).toBe('page')
45
+ expect(customWrapper.find('a').classes('nav-link')).toBe(true)
46
+ expect(customWrapper.find('a').classes('active')).toBe(true)
47
+ expect(customWrapper.find('a').classes('disabled')).toBe(true)
48
+ expect(customWrapper.find('a').attributes('href')).toBe('/bazinga')
49
+ expect(customWrapper.find('a').attributes('aria-current')).toBe('page')
50
50
  })
51
51
  })
@@ -1,18 +1,14 @@
1
1
  // Jest Snapshot v1, https://goo.gl/fbAQLP
2
2
 
3
3
  exports[`Customize CNavGroup component renders correctly 1`] = `
4
- "<li class="nav-group show"><a class="nav-link nav-group-toggle">togglerContent</a>
5
- <transition-stub appear="false" persisted="false" css="false">
6
- <ul class="nav-group-items compact"></ul>
7
- </transition-stub>
4
+ "<li class="nav-group show"><a aria-expanded="true" class="nav-link nav-group-toggle" href="#">togglerContent</a>
5
+ <ul class="nav-group-items compact"></ul>
8
6
  </li>"
9
7
  `;
10
8
 
11
9
  exports[`Loads and display CNavGroup component renders correctly 1`] = `
12
10
  "<li class="nav-group">
13
11
  <!---->
14
- <transition-stub appear="false" persisted="false" css="false">
15
- <!---->
16
- </transition-stub>
12
+ <ul class="nav-group-items"></ul>
17
13
  </li>"
18
14
  `;
@@ -1,9 +1,5 @@
1
1
  // Jest Snapshot v1, https://goo.gl/fbAQLP
2
2
 
3
- exports[`Customize CNavItem component renders correctly 1`] = `
4
- "<li class="nav-item">
5
- <div class="active disabled nav-link" aria-current="page" href="/bazinga">Default slot</div>
6
- </li>"
7
- `;
3
+ exports[`Customize CNavItem component renders correctly 1`] = `"<div class="nav-item"><a class="active disabled nav-link" aria-current="page" aria-disabled="true" tabindex="-1" href="/bazinga">Default slot</a></div>"`;
8
4
 
9
5
  exports[`Loads and display CNavItem component renders correctly 1`] = `"<li class="nav-item">Default slot</li>"`;
@@ -86,9 +86,9 @@ const CNavbar = defineComponent({
86
86
  ? h(
87
87
  'div',
88
88
  { class: [`container${props.container === true ? '' : '-' + props.container}`] },
89
- slots.default && slots.default(),
89
+ slots.default && slots.default()
90
90
  )
91
- : slots.default && slots.default(),
91
+ : slots.default && slots.default()
92
92
  )
93
93
  },
94
94
  })
@@ -24,7 +24,7 @@ const CNavbarBrand = defineComponent({
24
24
  class: 'navbar-brand',
25
25
  href: props.href,
26
26
  },
27
- slots.default && slots.default(),
27
+ slots.default && slots.default()
28
28
  )
29
29
  },
30
30
  })
@@ -19,7 +19,7 @@ const CNavbarNav = defineComponent({
19
19
  class: 'navbar-nav',
20
20
  role: 'navigation',
21
21
  },
22
- slots.default && slots.default(),
22
+ slots.default && slots.default()
23
23
  )
24
24
  },
25
25
  })
@@ -9,7 +9,7 @@ const CNavbarToggler = defineComponent({
9
9
  {
10
10
  class: 'navbar-toggler',
11
11
  },
12
- slots.default ? slots.default() : h('span', { class: ['navbar-toggler-icon'] }),
12
+ slots.default ? slots.default() : h('span', { class: ['navbar-toggler-icon'] })
13
13
  )
14
14
  },
15
15
  })
@@ -44,7 +44,7 @@ describe(`Customize ${ComponentName} component`, () => {
44
44
  it('contain slots and classes', () => {
45
45
  expect(customWrapper.classes('navbar')).toBe(true)
46
46
  expect(customWrapper.classes('bg-warning')).toBe(true)
47
- expect(customWrapper.classes('navbar-light')).toBe(true)
47
+ expect(customWrapper.attributes('data-coreui-theme')).toBe('light')
48
48
  expect(customWrapper.classes('navbar-expand-xl')).toBe(true)
49
49
  expect(customWrapper.classes('fixed-bottom')).toBe(true)
50
50
  expect(customWrapper.find('.container-lg').classes('container-lg')).toBe(true)
@@ -42,8 +42,8 @@ const CPagination = defineComponent({
42
42
  },
43
43
  ],
44
44
  },
45
- slots.default && slots.default(),
46
- ),
45
+ slots.default && slots.default()
46
+ )
47
47
  )
48
48
  },
49
49
  })
@@ -47,9 +47,9 @@ const CPaginationItem = defineComponent({
47
47
  },
48
48
  {
49
49
  default: () => slots.default && slots.default(),
50
- },
50
+ }
51
51
  )
52
- : h(component, { class: ['page-link'] }, slots.default && slots.default()),
52
+ : h(component, { class: ['page-link'] }, slots.default && slots.default())
53
53
  )
54
54
  }
55
55
  },
@@ -104,7 +104,7 @@ export const CPlaceholder = defineComponent({
104
104
  repsonsiveClassNames,
105
105
  ],
106
106
  },
107
- slots.default && slots.default(),
107
+ slots.default && slots.default()
108
108
  )
109
109
  },
110
110
  })
@@ -1,5 +1,5 @@
1
1
  import { defineComponent, h, PropType, ref, RendererElement, Transition, useId } from 'vue'
2
- import type { Placement } from '@popperjs/core'
2
+ import type { Options, Placement } from '@popperjs/core'
3
3
 
4
4
  import { CConditionalTeleport } from '../conditional-teleport'
5
5
  import { usePopper } from '../../composables'
@@ -77,6 +77,19 @@ const CPopover = defineComponent({
77
77
  return ['top', 'right', 'bottom', 'left'].includes(value)
78
78
  },
79
79
  },
80
+ /**
81
+ * A Popper.js configuration object, or a function that receives the default
82
+ * configuration and returns a modified one, used to customize the
83
+ * positioning of the popover.
84
+ *
85
+ * @since 5.10.0
86
+ */
87
+ popperConfig: {
88
+ type: [Object, Function] as PropType<
89
+ Partial<Options> | ((defaultPopperConfig: Partial<Options>) => Partial<Options>)
90
+ >,
91
+ default: undefined,
92
+ },
80
93
  /**
81
94
  * Title for your component. If you want to pass non-string value please use dedicated slot `<template #title>...</template>`
82
95
  */
@@ -125,7 +138,7 @@ const CPopover = defineComponent({
125
138
  const delay =
126
139
  typeof props.delay === 'number' ? { show: props.delay, hide: props.delay } : props.delay
127
140
 
128
- const popperConfig = {
141
+ const defaultPopperConfig = {
129
142
  modifiers: [
130
143
  {
131
144
  name: 'arrow',
@@ -149,6 +162,13 @@ const CPopover = defineComponent({
149
162
  placement: getRTLPlacement(props.placement, togglerRef.value),
150
163
  }
151
164
 
165
+ const popperConfig = {
166
+ ...defaultPopperConfig,
167
+ ...(typeof props.popperConfig === 'function'
168
+ ? props.popperConfig(defaultPopperConfig)
169
+ : props.popperConfig),
170
+ }
171
+
152
172
  const handleEnter = (el: RendererElement, done: () => void) => {
153
173
  emit('show')
154
174
  initPopper(togglerRef.value, popoverRef.value, popperConfig)
@@ -220,7 +240,7 @@ const CPopover = defineComponent({
220
240
  { class: 'popover-header' },
221
241
  {
222
242
  default: () => (slots.title && slots.title()) || props.title,
223
- },
243
+ }
224
244
  ),
225
245
  (props.content || slots.content) &&
226
246
  h(
@@ -228,12 +248,12 @@ const CPopover = defineComponent({
228
248
  { class: 'popover-body' },
229
249
  {
230
250
  default: () => (slots.content && slots.content()) || props.content,
231
- },
251
+ }
232
252
  ),
233
- ],
234
- ),
253
+ ]
254
+ )
235
255
  ),
236
- },
256
+ }
237
257
  ),
238
258
  slots.toggler &&
239
259
  slots.toggler({
@@ -0,0 +1,43 @@
1
+ import { mount } from '@vue/test-utils'
2
+ import { h } from 'vue'
3
+ import { CPopover as Component } from '../../../index'
4
+
5
+ const ComponentName = 'CPopover'
6
+
7
+ describe(`Loads and display ${ComponentName} component`, () => {
8
+ it('has a name', () => {
9
+ expect(Component.name).toMatch(ComponentName)
10
+ })
11
+
12
+ it('renders the toggler slot', () => {
13
+ const wrapper = mount(Component, {
14
+ slots: { toggler: () => h('button', 'Toggle') },
15
+ })
16
+ expect(wrapper.find('button').exists()).toBe(true)
17
+ expect(wrapper.text()).toContain('Toggle')
18
+ })
19
+
20
+ it('does not render the popover when hidden', () => {
21
+ mount(Component, {
22
+ props: { content: 'Body', title: 'Title' },
23
+ slots: { toggler: () => h('button', 'Toggle') },
24
+ attachTo: document.body,
25
+ })
26
+ expect(document.body.querySelector('.popover')).toBeNull()
27
+ })
28
+
29
+ it('renders the popover with title and content when visible', () => {
30
+ const wrapper = mount(Component, {
31
+ props: { content: 'Body', title: 'Title', visible: true },
32
+ slots: { toggler: () => h('button', 'Toggle') },
33
+ attachTo: document.body,
34
+ })
35
+
36
+ const popover = document.body.querySelector('.popover')
37
+ expect(popover).not.toBeNull()
38
+ expect(popover?.querySelector('.popover-header')?.textContent).toBe('Title')
39
+ expect(popover?.querySelector('.popover-body')?.textContent).toBe('Body')
40
+
41
+ wrapper.unmount()
42
+ })
43
+ })
@@ -101,8 +101,8 @@ const CProgress = defineComponent({
101
101
  value: props.value,
102
102
  variant: props.variant,
103
103
  },
104
- () => slots.default && slots.default(),
105
- ),
104
+ () => slots.default && slots.default()
105
+ )
106
106
  )
107
107
  },
108
108
  })
@@ -51,7 +51,7 @@ const CProgressBar = defineComponent({
51
51
  ],
52
52
  ...(!stacked && { style: { width: `${props.value}%` } }),
53
53
  },
54
- slots.default && slots.default(),
54
+ slots.default && slots.default()
55
55
  )
56
56
  },
57
57
  })
@@ -11,7 +11,7 @@ const CProgressStacked = defineComponent({
11
11
  {
12
12
  class: 'progress-stacked',
13
13
  },
14
- slots.default && slots.default(),
14
+ slots.default && slots.default()
15
15
  )
16
16
  },
17
17
  })
@@ -45,10 +45,6 @@ describe(`Customize ${ComponentName} component`, () => {
45
45
  expect(customWrapper.classes('progress-bar-striped')).toBe(true)
46
46
  expect(customWrapper.classes('progress-bar-animated')).toBe(true)
47
47
  expect(customWrapper.classes('bg-warning')).toBe(true)
48
- expect(customWrapper.attributes('role')).toBe('progressbar')
49
48
  expect(customWrapper.attributes('style')).toBe('width: 75%;')
50
- expect(customWrapper.attributes('aria-valuenow')).toBe('75')
51
- expect(customWrapper.attributes('aria-valuemin')).toBe('0')
52
- expect(customWrapper.attributes('aria-valuemax')).toBe('100')
53
49
  })
54
50
  })
@@ -0,0 +1,163 @@
1
+ import { computed, defineComponent, h, onBeforeUnmount, onMounted, ref } from 'vue'
2
+
3
+ import {
4
+ formatShortcutTokens,
5
+ getPreferredShortcut,
6
+ getPressedKeys,
7
+ matchesShortcut,
8
+ parseShortcut,
9
+ shouldIgnoreShortcut,
10
+ } from './utils'
11
+
12
+ export const CSearchButton = defineComponent({
13
+ name: 'CSearchButton',
14
+ props: {
15
+ /**
16
+ * Toggle the disabled state for the component.
17
+ */
18
+ disabled: Boolean,
19
+ /**
20
+ * Placeholder content rendered inside `.search-button-placeholder`.
21
+ */
22
+ placeholder: {
23
+ type: String,
24
+ default: 'Search',
25
+ },
26
+ /**
27
+ * Prevent the browser's default behavior when the configured shortcut matches.
28
+ */
29
+ preventDefault: {
30
+ type: Boolean,
31
+ default: true,
32
+ },
33
+ /**
34
+ * Comma-separated shortcut list. The component matches all configured shortcuts and renders the platform-preferred one.
35
+ */
36
+ shortcut: {
37
+ type: String,
38
+ default: 'meta+/,ctrl+/',
39
+ },
40
+ },
41
+ emits: [
42
+ /**
43
+ * Event called when the user clicks on the component.
44
+ */
45
+ 'click',
46
+ /**
47
+ * Event called when the component is activated by click or keyboard shortcut.
48
+ */
49
+ 'trigger',
50
+ ],
51
+ setup(props, { emit, slots }) {
52
+ const activeKeys = ref<string[]>([])
53
+ const shortcuts = computed(() => parseShortcut(props.shortcut))
54
+ const preferredShortcut = computed(() => getPreferredShortcut(shortcuts.value))
55
+ const shortcutTokens = computed(() =>
56
+ formatShortcutTokens(preferredShortcut.value?.shortcut || '')
57
+ )
58
+
59
+ const handleShortcut = (event: KeyboardEvent) => {
60
+ if (props.disabled || event.defaultPrevented || event.repeat || shouldIgnoreShortcut(event)) {
61
+ return
62
+ }
63
+
64
+ const matchedShortcut = shortcuts.value.find((shortcut) => matchesShortcut(shortcut, event))
65
+
66
+ if (!matchedShortcut) {
67
+ return
68
+ }
69
+
70
+ if (props.preventDefault) {
71
+ event.preventDefault()
72
+ }
73
+
74
+ emit('trigger')
75
+ }
76
+
77
+ const handleDocumentKeydown = (event: KeyboardEvent) => {
78
+ activeKeys.value = Array.from(getPressedKeys(event))
79
+ handleShortcut(event)
80
+ }
81
+
82
+ const handleDocumentKeyup = (event: KeyboardEvent) => {
83
+ activeKeys.value = Array.from(getPressedKeys(event))
84
+ }
85
+
86
+ const handleWindowBlur = () => {
87
+ activeKeys.value = []
88
+ }
89
+
90
+ const handleClick = (event: MouseEvent) => {
91
+ emit('click', event)
92
+ emit('trigger')
93
+ }
94
+
95
+ onMounted(() => {
96
+ if (typeof document === 'undefined' || typeof window === 'undefined') {
97
+ return
98
+ }
99
+
100
+ document.addEventListener('keydown', handleDocumentKeydown)
101
+ document.addEventListener('keyup', handleDocumentKeyup)
102
+ window.addEventListener('blur', handleWindowBlur)
103
+ })
104
+
105
+ onBeforeUnmount(() => {
106
+ if (typeof document === 'undefined' || typeof window === 'undefined') {
107
+ return
108
+ }
109
+
110
+ document.removeEventListener('keydown', handleDocumentKeydown)
111
+ document.removeEventListener('keyup', handleDocumentKeyup)
112
+ window.removeEventListener('blur', handleWindowBlur)
113
+ })
114
+
115
+ return () =>
116
+ h(
117
+ 'button',
118
+ {
119
+ type: 'button',
120
+ class: 'search-button',
121
+ disabled: props.disabled,
122
+ onClick: handleClick,
123
+ },
124
+ [
125
+ slots.default
126
+ ? slots.default()
127
+ : [
128
+ slots.icon
129
+ ? slots.icon()
130
+ : h(
131
+ 'svg',
132
+ {
133
+ class: 'search-button-icon',
134
+ xmlns: 'http://www.w3.org/2000/svg',
135
+ viewBox: '0 0 512 512',
136
+ 'aria-hidden': 'true',
137
+ },
138
+ h('path', {
139
+ fill: 'currentColor',
140
+ d: 'm479.6 399.716-81.084-81.084-62.368-25.767A175 175 0 0 0 368 192c0-97.047-78.953-176-176-176S16 94.953 16 192s78.953 176 176 176a175.03 175.03 0 0 0 101.619-32.377l25.7 62.2 81.081 81.088a56 56 0 1 0 79.2-79.195M48 192c0-79.4 64.6-144 144-144s144 64.6 144 144-64.6 144-144 144S48 271.4 48 192m408.971 264.284a24.03 24.03 0 0 1-33.942 0l-76.572-76.572-23.894-57.835 57.837 23.894 76.573 76.572a24.03 24.03 0 0 1-.002 33.941',
141
+ })
142
+ ),
143
+ h('span', { class: 'search-button-placeholder' }, props.placeholder),
144
+ ],
145
+ h(
146
+ 'span',
147
+ { class: 'search-button-keys', 'aria-hidden': 'true' },
148
+ shortcutTokens.value.map((key) =>
149
+ h(
150
+ 'span',
151
+ {
152
+ class: ['search-button-key', { active: activeKeys.value.includes(key) }],
153
+ 'data-coreui-search-button-key': key,
154
+ key,
155
+ },
156
+ key
157
+ )
158
+ )
159
+ ),
160
+ ]
161
+ )
162
+ },
163
+ })