@coreui/react 5.0.0-rc.3 → 5.1.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 (115) hide show
  1. package/README.md +1 -1
  2. package/dist/cjs/components/badge/CBadge.d.ts +1 -1
  3. package/dist/cjs/components/card/CCard.d.ts +1 -1
  4. package/dist/cjs/components/dropdown/CDropdown.js +2 -1
  5. package/dist/cjs/components/dropdown/CDropdown.js.map +1 -1
  6. package/dist/cjs/components/dropdown/CDropdownToggle.d.ts +1 -1
  7. package/dist/cjs/components/dropdown/utils.d.ts +0 -1
  8. package/dist/cjs/components/dropdown/utils.js +0 -13
  9. package/dist/cjs/components/dropdown/utils.js.map +1 -1
  10. package/dist/cjs/components/nav/CNavGroup.d.ts +1 -1
  11. package/dist/cjs/components/nav/CNavGroupItems.d.ts +1 -1
  12. package/dist/cjs/components/nav/CNavItem.d.ts +1 -1
  13. package/dist/cjs/components/popover/CPopover.js +41 -40
  14. package/dist/cjs/components/popover/CPopover.js.map +1 -1
  15. package/dist/cjs/components/sidebar/CSidebarBrand.d.ts +1 -1
  16. package/dist/cjs/components/sidebar/CSidebarNav.d.ts +1 -1
  17. package/dist/cjs/components/tabs/CTab.d.ts +12 -0
  18. package/dist/cjs/components/tabs/CTab.js +25 -0
  19. package/dist/cjs/components/tabs/CTab.js.map +1 -0
  20. package/dist/cjs/components/tabs/CTabList.d.ts +16 -0
  21. package/dist/cjs/components/tabs/CTabList.js +54 -0
  22. package/dist/cjs/components/tabs/CTabList.js.map +1 -0
  23. package/dist/cjs/components/tabs/CTabPane.d.ts +6 -0
  24. package/dist/cjs/components/tabs/CTabPane.js +4 -2
  25. package/dist/cjs/components/tabs/CTabPane.js.map +1 -1
  26. package/dist/cjs/components/tabs/CTabPanel.d.ts +28 -0
  27. package/dist/cjs/components/tabs/CTabPanel.js +43 -0
  28. package/dist/cjs/components/tabs/CTabPanel.js.map +1 -0
  29. package/dist/cjs/components/tabs/CTabs.d.ts +22 -0
  30. package/dist/cjs/components/tabs/CTabs.js +28 -0
  31. package/dist/cjs/components/tabs/CTabs.js.map +1 -0
  32. package/dist/cjs/components/tabs/index.d.ts +5 -1
  33. package/dist/cjs/components/tooltip/CTooltip.js +44 -40
  34. package/dist/cjs/components/tooltip/CTooltip.js.map +1 -1
  35. package/dist/cjs/hooks/usePopper.d.ts +1 -0
  36. package/dist/cjs/hooks/usePopper.js +11 -4
  37. package/dist/cjs/hooks/usePopper.js.map +1 -1
  38. package/dist/cjs/index.js +8 -0
  39. package/dist/cjs/index.js.map +1 -1
  40. package/dist/cjs/node_modules/react-transition-group/esm/CSSTransition.js +1 -2
  41. package/dist/cjs/node_modules/react-transition-group/esm/CSSTransition.js.map +1 -1
  42. package/dist/cjs/node_modules/react-transition-group/esm/Transition.js +1 -2
  43. package/dist/cjs/node_modules/react-transition-group/esm/Transition.js.map +1 -1
  44. package/dist/cjs/utils/getNextActiveElement.d.ts +2 -0
  45. package/dist/cjs/utils/getNextActiveElement.js +19 -0
  46. package/dist/cjs/utils/getNextActiveElement.js.map +1 -0
  47. package/dist/cjs/utils/index.d.ts +2 -1
  48. package/dist/esm/components/badge/CBadge.d.ts +1 -1
  49. package/dist/esm/components/card/CCard.d.ts +1 -1
  50. package/dist/esm/components/dropdown/CDropdown.js +2 -1
  51. package/dist/esm/components/dropdown/CDropdown.js.map +1 -1
  52. package/dist/esm/components/dropdown/CDropdownToggle.d.ts +1 -1
  53. package/dist/esm/components/dropdown/utils.d.ts +0 -1
  54. package/dist/esm/components/dropdown/utils.js +1 -13
  55. package/dist/esm/components/dropdown/utils.js.map +1 -1
  56. package/dist/esm/components/nav/CNavGroup.d.ts +1 -1
  57. package/dist/esm/components/nav/CNavGroupItems.d.ts +1 -1
  58. package/dist/esm/components/nav/CNavItem.d.ts +1 -1
  59. package/dist/esm/components/popover/CPopover.js +41 -40
  60. package/dist/esm/components/popover/CPopover.js.map +1 -1
  61. package/dist/esm/components/sidebar/CSidebarBrand.d.ts +1 -1
  62. package/dist/esm/components/sidebar/CSidebarNav.d.ts +1 -1
  63. package/dist/esm/components/tabs/CTab.d.ts +12 -0
  64. package/dist/esm/components/tabs/CTab.js +23 -0
  65. package/dist/esm/components/tabs/CTab.js.map +1 -0
  66. package/dist/esm/components/tabs/CTabList.d.ts +16 -0
  67. package/dist/esm/components/tabs/CTabList.js +52 -0
  68. package/dist/esm/components/tabs/CTabList.js.map +1 -0
  69. package/dist/esm/components/tabs/CTabPane.d.ts +6 -0
  70. package/dist/esm/components/tabs/CTabPane.js +4 -2
  71. package/dist/esm/components/tabs/CTabPane.js.map +1 -1
  72. package/dist/esm/components/tabs/CTabPanel.d.ts +28 -0
  73. package/dist/esm/components/tabs/CTabPanel.js +41 -0
  74. package/dist/esm/components/tabs/CTabPanel.js.map +1 -0
  75. package/dist/esm/components/tabs/CTabs.d.ts +22 -0
  76. package/dist/esm/components/tabs/CTabs.js +25 -0
  77. package/dist/esm/components/tabs/CTabs.js.map +1 -0
  78. package/dist/esm/components/tabs/index.d.ts +5 -1
  79. package/dist/esm/components/tooltip/CTooltip.js +44 -40
  80. package/dist/esm/components/tooltip/CTooltip.js.map +1 -1
  81. package/dist/esm/hooks/usePopper.d.ts +1 -0
  82. package/dist/esm/hooks/usePopper.js +11 -4
  83. package/dist/esm/hooks/usePopper.js.map +1 -1
  84. package/dist/esm/index.js +4 -0
  85. package/dist/esm/index.js.map +1 -1
  86. package/dist/esm/node_modules/react-transition-group/esm/CSSTransition.js +1 -2
  87. package/dist/esm/node_modules/react-transition-group/esm/CSSTransition.js.map +1 -1
  88. package/dist/esm/node_modules/react-transition-group/esm/Transition.js +1 -2
  89. package/dist/esm/node_modules/react-transition-group/esm/Transition.js.map +1 -1
  90. package/dist/esm/utils/getNextActiveElement.d.ts +2 -0
  91. package/dist/esm/utils/getNextActiveElement.js +15 -0
  92. package/dist/esm/utils/getNextActiveElement.js.map +1 -0
  93. package/dist/esm/utils/index.d.ts +2 -1
  94. package/package.json +12 -12
  95. package/src/components/badge/CBadge.tsx +1 -1
  96. package/src/components/card/CCard.tsx +1 -1
  97. package/src/components/dropdown/CDropdown.tsx +2 -2
  98. package/src/components/dropdown/CDropdownToggle.tsx +1 -1
  99. package/src/components/dropdown/utils.ts +0 -22
  100. package/src/components/nav/CNavGroup.tsx +1 -1
  101. package/src/components/nav/CNavGroupItems.tsx +1 -1
  102. package/src/components/nav/CNavItem.tsx +1 -1
  103. package/src/components/popover/CPopover.tsx +51 -66
  104. package/src/components/sidebar/CSidebarBrand.tsx +1 -1
  105. package/src/components/sidebar/CSidebarNav.tsx +1 -1
  106. package/src/components/tabs/CTab.tsx +56 -0
  107. package/src/components/tabs/CTabList.tsx +92 -0
  108. package/src/components/tabs/CTabPane.tsx +9 -2
  109. package/src/components/tabs/CTabPanel.tsx +98 -0
  110. package/src/components/tabs/CTabs.tsx +54 -0
  111. package/src/components/tabs/index.ts +5 -1
  112. package/src/components/tooltip/CTooltip.tsx +55 -66
  113. package/src/hooks/usePopper.ts +15 -5
  114. package/src/utils/getNextActiveElement.ts +23 -0
  115. package/src/utils/index.ts +2 -0
@@ -1,4 +1,8 @@
1
+ import { CTab } from './CTab'
1
2
  import { CTabContent } from './CTabContent'
2
3
  import { CTabPane } from './CTabPane'
4
+ import { CTabPanel } from './CTabPanel'
5
+ import { CTabList } from './CTabList'
6
+ import { CTabs } from './CTabs'
3
7
 
4
- export { CTabContent, CTabPane }
8
+ export { CTab, CTabContent, CTabList, CTabPane, CTabPanel, CTabs }
@@ -1,13 +1,12 @@
1
1
  import React, { forwardRef, HTMLAttributes, ReactNode, useRef, useEffect, useState } from 'react'
2
2
  import classNames from 'classnames'
3
3
  import PropTypes from 'prop-types'
4
- import { Transition } from 'react-transition-group'
5
4
 
6
5
  import { CConditionalPortal } from '../conditional-portal'
7
6
  import { useForkedRef, usePopper } from '../../hooks'
8
7
  import { fallbackPlacementsPropType, triggerPropType } from '../../props'
9
8
  import type { Placements, Triggers } from '../../types'
10
- import { getRTLPlacement, getTransitionDurationFromElement } from '../../utils'
9
+ import { executeAfterTransition, getRTLPlacement } from '../../utils'
11
10
 
12
11
  export interface CTooltipProps extends Omit<HTMLAttributes<HTMLDivElement>, 'content'> {
13
12
  /**
@@ -95,7 +94,8 @@ export const CTooltip = forwardRef<HTMLDivElement, CTooltipProps>(
95
94
  const forkedRef = useForkedRef(ref, tooltipRef)
96
95
  const uID = useRef(`tooltip${Math.floor(Math.random() * 1_000_000)}`)
97
96
 
98
- const { initPopper, destroyPopper } = usePopper()
97
+ const { initPopper, destroyPopper, updatePopper } = usePopper()
98
+ const [mounted, setMounted] = useState(false)
99
99
  const [_visible, setVisible] = useState(visible)
100
100
 
101
101
  const _delay = typeof delay === 'number' ? { show: delay, hide: delay } : delay
@@ -128,14 +128,43 @@ export const CTooltip = forwardRef<HTMLDivElement, CTooltipProps>(
128
128
  setVisible(visible)
129
129
  }, [visible])
130
130
 
131
- const toggleVisible = (visible: boolean) => {
132
- if (visible) {
133
- setTimeout(() => setVisible(true), _delay.show)
134
- return
131
+ useEffect(() => {
132
+ if (_visible) {
133
+ setMounted(true)
134
+
135
+ if (tooltipRef.current) {
136
+ tooltipRef.current.classList.remove('fade', 'show')
137
+ destroyPopper()
138
+ }
139
+
140
+ setTimeout(() => {
141
+ if (togglerRef.current && tooltipRef.current) {
142
+ if (animation) {
143
+ tooltipRef.current.classList.add('fade')
144
+ }
145
+
146
+ initPopper(togglerRef.current, tooltipRef.current, popperConfig)
147
+ tooltipRef.current.classList.add('show')
148
+ onShow && onShow()
149
+ }
150
+ }, _delay.show)
135
151
  }
136
152
 
137
- setTimeout(() => setVisible(false), _delay.hide)
138
- }
153
+ return () => {
154
+ if (tooltipRef.current) {
155
+ tooltipRef.current.classList.remove('show')
156
+ onHide && onHide()
157
+ executeAfterTransition(() => {
158
+ destroyPopper()
159
+ setMounted(false)
160
+ }, tooltipRef.current)
161
+ }
162
+ }
163
+ }, [_visible])
164
+
165
+ useEffect(() => {
166
+ updatePopper()
167
+ }, [content])
139
168
 
140
169
  return (
141
170
  <>
@@ -145,70 +174,30 @@ export const CTooltip = forwardRef<HTMLDivElement, CTooltipProps>(
145
174
  }),
146
175
  ref: togglerRef,
147
176
  ...((trigger === 'click' || trigger.includes('click')) && {
148
- onClick: () => toggleVisible(!_visible),
177
+ onClick: () => setVisible(!_visible),
149
178
  }),
150
179
  ...((trigger === 'focus' || trigger.includes('focus')) && {
151
- onFocus: () => toggleVisible(true),
152
- onBlur: () => toggleVisible(false),
180
+ onFocus: () => setVisible(true),
181
+ onBlur: () => setVisible(false),
153
182
  }),
154
183
  ...((trigger === 'hover' || trigger.includes('hover')) && {
155
- onMouseEnter: () => toggleVisible(true),
156
- onMouseLeave: () => toggleVisible(false),
184
+ onMouseEnter: () => setVisible(true),
185
+ onMouseLeave: () => setVisible(false),
157
186
  }),
158
187
  })}
159
188
  <CConditionalPortal container={container} portal={true}>
160
- <Transition
161
- in={_visible}
162
- mountOnEnter
163
- nodeRef={tooltipRef}
164
- onEnter={() => {
165
- if (togglerRef.current && tooltipRef.current) {
166
- initPopper(togglerRef.current, tooltipRef.current, popperConfig)
167
- }
168
-
169
- onShow
170
- }}
171
- onEntering={() => {
172
- if (togglerRef.current && tooltipRef.current) {
173
- tooltipRef.current.style.display = 'initial'
174
- }
175
- }}
176
- onExit={onHide}
177
- onExited={() => {
178
- destroyPopper()
179
- }}
180
- timeout={{
181
- enter: 0,
182
- exit: tooltipRef.current
183
- ? getTransitionDurationFromElement(tooltipRef.current) + 50
184
- : 200,
185
- }}
186
- unmountOnExit
187
- >
188
- {(state) => (
189
- <div
190
- className={classNames(
191
- 'tooltip',
192
- 'bs-tooltip-auto',
193
- {
194
- fade: animation,
195
- show: state === 'entered',
196
- },
197
- className,
198
- )}
199
- id={uID.current}
200
- ref={forkedRef}
201
- role="tooltip"
202
- style={{
203
- display: 'none',
204
- }}
205
- {...rest}
206
- >
207
- <div className="tooltip-arrow"></div>
208
- <div className="tooltip-inner">{content}</div>
209
- </div>
210
- )}
211
- </Transition>
189
+ {mounted && (
190
+ <div
191
+ className={classNames('tooltip', 'bs-tooltip-auto', className)}
192
+ id={uID.current}
193
+ ref={forkedRef}
194
+ role="tooltip"
195
+ {...rest}
196
+ >
197
+ <div className="tooltip-arrow"></div>
198
+ <div className="tooltip-inner">{content}</div>
199
+ </div>
200
+ )}
212
201
  </CConditionalPortal>
213
202
  </>
214
203
  )
@@ -2,12 +2,11 @@ import { useRef } from 'react'
2
2
  import { createPopper } from '@popperjs/core'
3
3
  import type { Instance, Options } from '@popperjs/core'
4
4
 
5
- import { executeAfterTransition } from '../utils'
6
-
7
5
  interface UsePopperOutput {
8
6
  popper: Instance | undefined
9
7
  initPopper: (reference: HTMLElement, popper: HTMLElement, options: Partial<Options>) => void
10
8
  destroyPopper: () => void
9
+ updatePopper: (options?: Partial<Options>) => void
11
10
  }
12
11
 
13
12
  export const usePopper = (): UsePopperOutput => {
@@ -23,17 +22,28 @@ export const usePopper = (): UsePopperOutput => {
23
22
  const popperInstance = _popper.current
24
23
 
25
24
  if (popperInstance && el.current) {
26
- executeAfterTransition(() => {
27
- popperInstance.destroy()
28
- }, el.current)
25
+ popperInstance.destroy()
29
26
  }
30
27
 
31
28
  _popper.current = undefined
32
29
  }
33
30
 
31
+ const updatePopper = (options?: Partial<Options>) => {
32
+ const popperInstance = _popper.current
33
+
34
+ if (popperInstance && options) {
35
+ popperInstance.setOptions(options)
36
+ }
37
+
38
+ if (popperInstance) {
39
+ popperInstance.update()
40
+ }
41
+ }
42
+
34
43
  return {
35
44
  popper: _popper.current,
36
45
  initPopper,
37
46
  destroyPopper,
47
+ updatePopper,
38
48
  }
39
49
  }
@@ -0,0 +1,23 @@
1
+ const getNextActiveElement = (
2
+ list: HTMLElement[],
3
+ activeElement: HTMLElement,
4
+ shouldGetNext: boolean,
5
+ isCycleAllowed: boolean,
6
+ ) => {
7
+ const listLength = list.length
8
+ let index = list.indexOf(activeElement)
9
+
10
+ if (index === -1) {
11
+ return !shouldGetNext && isCycleAllowed ? list[listLength - 1] : list[0]
12
+ }
13
+
14
+ index += shouldGetNext ? 1 : -1
15
+
16
+ if (isCycleAllowed) {
17
+ index = (index + listLength) % listLength
18
+ }
19
+
20
+ return list[Math.max(0, Math.min(index, listLength - 1))]
21
+ }
22
+
23
+ export default getNextActiveElement
@@ -1,4 +1,5 @@
1
1
  import executeAfterTransition from './executeAfterTransition'
2
+ import getNextActiveElement from './getNextActiveElement'
2
3
  import getRTLPlacement from './getRTLPlacement'
3
4
  import getTransitionDurationFromElement from './getTransitionDurationFromElement'
4
5
  import isInViewport from './isInViewport'
@@ -6,6 +7,7 @@ import isRTL from './isRTL'
6
7
 
7
8
  export {
8
9
  executeAfterTransition,
10
+ getNextActiveElement,
9
11
  getRTLPlacement,
10
12
  getTransitionDurationFromElement,
11
13
  isInViewport,