@coreui/react 5.0.0-alpha.0 → 5.0.0-alpha.2

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 (66) hide show
  1. package/README.md +1 -1
  2. package/dist/components/avatar/CAvatar.d.ts +1 -1
  3. package/dist/components/badge/CBadge.d.ts +1 -1
  4. package/dist/components/card/CCard.d.ts +1 -1
  5. package/dist/components/close-button/CCloseButton.d.ts +6 -0
  6. package/dist/components/dropdown/CDropdown.d.ts +1 -0
  7. package/dist/components/modal/CModal.d.ts +6 -0
  8. package/dist/components/nav/CNav.d.ts +1 -1
  9. package/dist/components/navbar/CNavbar.d.ts +1 -1
  10. package/dist/components/offcanvas/COffcanvas.d.ts +4 -0
  11. package/dist/index.es.js +177 -81
  12. package/dist/index.es.js.map +1 -1
  13. package/dist/index.js +177 -81
  14. package/dist/index.js.map +1 -1
  15. package/dist/types.d.ts +1 -1
  16. package/dist/utils/executeAfterTransition.d.ts +2 -0
  17. package/dist/utils/getTransitionDurationFromElement.d.ts +2 -0
  18. package/dist/utils/index.d.ts +3 -1
  19. package/package.json +2 -2
  20. package/src/components/avatar/CAvatar.tsx +1 -1
  21. package/src/components/badge/CBadge.tsx +1 -1
  22. package/src/components/button/CButton.tsx +1 -1
  23. package/src/components/button/__tests__/__snapshots__/CButton.spec.tsx.snap +0 -1
  24. package/src/components/card/CCard.tsx +1 -1
  25. package/src/components/carousel/CCarousel.tsx +9 -5
  26. package/src/components/carousel/__tests__/__snapshots__/CCarousel.spec.tsx.snap +9 -5
  27. package/src/components/close-button/CCloseButton.tsx +9 -1
  28. package/src/components/dropdown/CDropdown.tsx +43 -1
  29. package/src/components/dropdown/CDropdownMenu.tsx +1 -1
  30. package/src/components/dropdown/CDropdownToggle.tsx +3 -12
  31. package/src/components/modal/CModal.tsx +25 -9
  32. package/src/components/nav/CNav.tsx +2 -2
  33. package/src/components/nav/CNavGroup.tsx +9 -2
  34. package/src/components/nav/__tests__/__snapshots__/CNav.spec.tsx.snap +5 -4
  35. package/src/components/navbar/CNavbar.tsx +2 -2
  36. package/src/components/navbar/__tests__/CNavbar.spec.tsx +1 -1
  37. package/src/components/navbar/__tests__/__snapshots__/CNavbar.spec.tsx.snap +2 -1
  38. package/src/components/offcanvas/COffcanvas.tsx +8 -1
  39. package/src/components/popover/CPopover.tsx +2 -2
  40. package/src/components/progress/__tests__/__snapshots__/CProgress.spec.tsx.snap +10 -5
  41. package/src/components/progress/__tests__/__snapshots__/CProgressBar.spec.tsx.snap +0 -8
  42. package/src/components/sidebar/CSidebar.tsx +1 -1
  43. package/src/components/tooltip/CTooltip.tsx +2 -2
  44. package/src/components/widgets/CWidgetStatsA.tsx +1 -1
  45. package/src/components/widgets/CWidgetStatsB.tsx +2 -2
  46. package/src/components/widgets/CWidgetStatsC.tsx +4 -12
  47. package/src/components/widgets/CWidgetStatsD.tsx +1 -1
  48. package/src/components/widgets/CWidgetStatsE.tsx +1 -1
  49. package/src/components/widgets/CWidgetStatsF.tsx +1 -1
  50. package/src/components/widgets/__tests__/CWidgetStatsA.spec.tsx +1 -1
  51. package/src/components/widgets/__tests__/CWidgetStatsB.spec.tsx +1 -1
  52. package/src/components/widgets/__tests__/CWidgetStatsC.spec.tsx +1 -1
  53. package/src/components/widgets/__tests__/CWidgetStatsD.spec.tsx +1 -1
  54. package/src/components/widgets/__tests__/CWidgetStatsE.spec.tsx +1 -1
  55. package/src/components/widgets/__tests__/CWidgetStatsF.spec.tsx +1 -1
  56. package/src/components/widgets/__tests__/__snapshots__/CWidgetStatsA.spec.tsx.snap +1 -1
  57. package/src/components/widgets/__tests__/__snapshots__/CWidgetStatsB.spec.tsx.snap +12 -7
  58. package/src/components/widgets/__tests__/__snapshots__/CWidgetStatsC.spec.tsx.snap +14 -9
  59. package/src/components/widgets/__tests__/__snapshots__/CWidgetStatsD.spec.tsx.snap +2 -2
  60. package/src/components/widgets/__tests__/__snapshots__/CWidgetStatsE.spec.tsx.snap +1 -1
  61. package/src/components/widgets/__tests__/__snapshots__/CWidgetStatsF.spec.tsx.snap +2 -2
  62. package/src/hooks/usePopper.ts +10 -2
  63. package/src/types.ts +14 -7
  64. package/src/utils/executeAfterTransition.ts +46 -0
  65. package/src/utils/getTransitionDurationFromElement.ts +24 -0
  66. package/src/utils/index.ts +9 -1
@@ -3,15 +3,15 @@
3
3
  exports[`CProgress customize 1`] = `
4
4
  <div>
5
5
  <div
6
+ aria-valuemax="100"
7
+ aria-valuemin="0"
8
+ aria-valuenow="50"
6
9
  class="progress bazinga"
10
+ role="progressbar"
7
11
  style="height: 100px;"
8
12
  >
9
13
  <div
10
- aria-valuemax="100"
11
- aria-valuemin="0"
12
- aria-valuenow="50"
13
14
  class="progress-bar bg-warning"
14
- role="progressbar"
15
15
  style="width: 50%;"
16
16
  >
17
17
  Test
@@ -25,7 +25,12 @@ exports[`loads and displays CProgress component 1`] = `
25
25
  <div
26
26
  class="progress"
27
27
  >
28
- Test
28
+ <div
29
+ class="progress-bar bg-warning"
30
+ style="width: 0%;"
31
+ >
32
+ Test
33
+ </div>
29
34
  </div>
30
35
  </div>
31
36
  `;
@@ -3,11 +3,7 @@
3
3
  exports[`CProgressBar customize 1`] = `
4
4
  <div>
5
5
  <div
6
- aria-valuemax="100"
7
- aria-valuemin="0"
8
- aria-valuenow="50"
9
6
  class="progress-bar bg-warning progress-bar-striped progress-bar-animated bazinga"
10
- role="progressbar"
11
7
  style="width: 50%;"
12
8
  >
13
9
  Test
@@ -18,11 +14,7 @@ exports[`CProgressBar customize 1`] = `
18
14
  exports[`loads and displays CProgressBar component 1`] = `
19
15
  <div>
20
16
  <div
21
- aria-valuemax="100"
22
- aria-valuemin="0"
23
- aria-valuenow="0"
24
17
  class="progress-bar bg-warning"
25
- role="progressbar"
26
18
  style="width: 0%;"
27
19
  >
28
20
  Test
@@ -3,7 +3,7 @@ import { createPortal } from 'react-dom'
3
3
  import PropTypes from 'prop-types'
4
4
  import classNames from 'classnames'
5
5
 
6
- import { CBackdrop } from '../backdrop/CBackdrop'
6
+ import { CBackdrop } from '../backdrop'
7
7
 
8
8
  import { isInViewport } from '../../utils'
9
9
  import { useForkedRef } from '../../hooks'
@@ -7,7 +7,7 @@ import { Transition } from 'react-transition-group'
7
7
  import { usePopper } from '../../hooks'
8
8
  import { fallbackPlacementsPropType, triggerPropType } from '../../props'
9
9
  import type { Placements, Triggers } from '../../types'
10
- import { getRTLPlacement } from '../../utils'
10
+ import { getRTLPlacement, getTransitionDurationFromElement } from '../../utils'
11
11
 
12
12
  export interface CTooltipProps extends Omit<HTMLAttributes<HTMLDivElement>, 'content'> {
13
13
  /**
@@ -158,7 +158,7 @@ export const CTooltip: FC<CTooltipProps> = ({
158
158
  onExit={onHide}
159
159
  timeout={{
160
160
  enter: 0,
161
- exit: 200,
161
+ exit: tooltipRef.current ? getTransitionDurationFromElement(tooltipRef.current) + 50 : 200,
162
162
  }}
163
163
  unmountOnExit
164
164
  >
@@ -41,7 +41,7 @@ export const CWidgetStatsA = forwardRef<HTMLDivElement, CWidgetStatsAProps>(
41
41
  return (
42
42
  <CCard
43
43
  className={classNames(
44
- { [`bg-${color}`]: color, 'text-high-emphasis-inverse': color },
44
+ { [`bg-${color}`]: color, 'text-white': color },
45
45
  className,
46
46
  )}
47
47
  {...rest}
@@ -48,7 +48,7 @@ export const CWidgetStatsB = forwardRef<HTMLDivElement, CWidgetStatsBProps>(
48
48
  <CCard
49
49
  className={className}
50
50
  color={color}
51
- {...(inverse && { textColor: 'high-emphasis-inverse' })}
51
+ {...(inverse && { textColor: 'white' })}
52
52
  {...rest}
53
53
  ref={ref}
54
54
  >
@@ -57,7 +57,7 @@ export const CWidgetStatsB = forwardRef<HTMLDivElement, CWidgetStatsBProps>(
57
57
  {title && <div>{title}</div>}
58
58
  <CProgress className="my-2" height={4} {...(inverse && { white: true })} {...progress} />
59
59
  {text && (
60
- <small className={inverse ? 'text-medium-emphasis-inverse' : 'text-medium-emphasis'}>
60
+ <small className={inverse ? 'text-white text-opacity-75' : 'text-body-secondary'}>
61
61
  {text}
62
62
  </small>
63
63
  )}
@@ -48,23 +48,15 @@ export const CWidgetStatsC = forwardRef<HTMLDivElement, CWidgetStatsCProps>(
48
48
  <CCard
49
49
  className={className}
50
50
  color={color}
51
- {...(inverse && { textColor: 'high-emphasis-inverse' })}
51
+ {...(inverse && { textColor: 'white' })}
52
52
  {...rest}
53
53
  ref={ref}
54
54
  >
55
55
  <CCardBody>
56
- {icon && (
57
- <div className={`text-medium-emphasis${inverse ? '-inverse' : ''} text-end mb-4`}>
58
- {icon}
59
- </div>
60
- )}
61
- {value && (
62
- <div className={`text-high-emphasis${inverse ? '-inverse' : ''} fs-4 fw-semibold`}>
63
- {value}
64
- </div>
65
- )}
56
+ {icon && <div className="text-end mb-4">{icon}</div>}
57
+ {value && <div className="fs-4 fw-semibold">{value}</div>}
66
58
  {title && (
67
- <div className={inverse ? 'text-medium-emphasis-inverse' : 'text-medium-emphasis'}>
59
+ <div className={inverse ? 'text-white text-opacity-75' : 'text-body-secondary'}>
68
60
  {title}
69
61
  </div>
70
62
  )}
@@ -61,7 +61,7 @@ export const CWidgetStatsD = forwardRef<HTMLDivElement, CWidgetStatsDProps>(
61
61
  {index % 2 !== 0 && <div className="vr"></div>}
62
62
  <CCol>
63
63
  <div className="fs-5 fw-semibold">{value.value}</div>
64
- <div className="text-uppercase text-medium-emphasis small">{value.title}</div>
64
+ <div className="text-uppercase text-body-secondary small">{value.title}</div>
65
65
  </CCol>
66
66
  </React.Fragment>
67
67
  )
@@ -29,7 +29,7 @@ export const CWidgetStatsE = forwardRef<HTMLDivElement, CWidgetStatsEProps>(
29
29
  <CCard className={classNames(className)} {...rest} ref={ref}>
30
30
  <CCardBody className="text-center">
31
31
  {title && (
32
- <div className="text-medium-emphasis small text-uppercase fw-semibold">{title}</div>
32
+ <div className="text-body-secondary small text-uppercase fw-semibold">{title}</div>
33
33
  )}
34
34
  {value && <div className="fs-6 fw-semibold py-3">{value}</div>}
35
35
  {chart}
@@ -47,7 +47,7 @@ export const CWidgetStatsF = forwardRef<HTMLDivElement, CWidgetStatsFProps>(
47
47
  <div className={`me-3 text-white bg-${color} ${padding ? 'p-3' : 'p-4'}`}>{icon}</div>
48
48
  <div>
49
49
  <div className={`fs-6 fw-semibold text-${color}`}>{value}</div>
50
- <div className="text-medium-emphasis text-uppercase fw-semibold small">{title}</div>
50
+ <div className="text-body-secondary text-uppercase fw-semibold small">{title}</div>
51
51
  </div>
52
52
  </CCardBody>
53
53
  {footer && <CCardFooter>{footer}</CCardFooter>}
@@ -23,7 +23,7 @@ test('CWidgetStatsA customize', async () => {
23
23
  )
24
24
  expect(container).toMatchSnapshot()
25
25
  expect(container.firstChild).toHaveClass('bg-info')
26
- expect(container.firstChild).toHaveClass('text-high-emphasis-inverse')
26
+ expect(container.firstChild).toHaveClass('text-white')
27
27
  expect(container.firstChild).toHaveClass('bazinga')
28
28
  if (container.firstChild === null) {
29
29
  expect(true).toBe(false)
@@ -32,7 +32,7 @@ test('CWidgetStatsB customize', async () => {
32
32
  expect(container.firstChild.firstChild.firstChild).toHaveClass('fs-4')
33
33
  expect(container.firstChild.firstChild.firstChild).toHaveClass('fw-semibold')
34
34
  expect(container.firstChild.firstChild.firstChild).toHaveTextContent('value')
35
- expect(container.firstChild.firstChild.lastChild).toHaveClass('text-medium-emphasis-inverse')
35
+ expect(container.firstChild.firstChild.lastChild).toHaveClass('text-white')
36
36
  expect(container.firstChild.firstChild.lastChild).toHaveTextContent('text')
37
37
  }
38
38
  })
@@ -29,7 +29,7 @@ test('CWidgetStatsC customize', async () => {
29
29
  expect(true).toBe(false)
30
30
  } else {
31
31
  expect(container.firstChild.firstChild).toHaveClass('card-body')
32
- expect(container.firstChild.firstChild.firstChild).toHaveClass('text-medium-emphasis-inverse')
32
+ expect(container.firstChild.firstChild.firstChild).toHaveClass('text-white')
33
33
  expect(container.firstChild.firstChild.firstChild).toHaveClass('text-end')
34
34
  expect(container.firstChild.firstChild.firstChild).toHaveClass('mb-4')
35
35
  expect(container.firstChild.firstChild.firstChild).toHaveTextContent('icon')
@@ -42,7 +42,7 @@ test('CWidgetStatsD customize', async () => {
42
42
  expect(container.firstChild.lastChild.firstChild.firstChild).toHaveTextContent('89K')
43
43
  expect(container.firstChild.lastChild.firstChild.lastChild).toHaveClass('text-uppercase')
44
44
  expect(container.firstChild.lastChild.firstChild.lastChild).toHaveClass(
45
- 'text-medium-emphasis',
45
+ 'text-body-secondary',
46
46
  )
47
47
  expect(container.firstChild.lastChild.firstChild.lastChild).toHaveClass('small')
48
48
  expect(container.firstChild.lastChild.firstChild.lastChild).toHaveTextContent('friends')
@@ -21,7 +21,7 @@ test('CWidgetStatsE customize', async () => {
21
21
  expect(true).toBe(false)
22
22
  } else {
23
23
  expect(container.firstChild.firstChild).toHaveClass('card-body')
24
- expect(container.firstChild.firstChild.firstChild).toHaveClass('text-medium-emphasis')
24
+ expect(container.firstChild.firstChild.firstChild).toHaveClass('text-body-secondary')
25
25
  expect(container.firstChild.firstChild.firstChild).toHaveClass('small')
26
26
  expect(container.firstChild.firstChild.firstChild).toHaveClass('text-uppercase')
27
27
  expect(container.firstChild.firstChild.firstChild).toHaveClass('fw-semibold')
@@ -47,7 +47,7 @@ test('CWidgetStatsF customize', async () => {
47
47
  expect(container.firstChild.firstChild.lastChild.firstChild).toHaveClass('text-info')
48
48
  expect(container.firstChild.firstChild.lastChild.firstChild).toHaveTextContent('value')
49
49
  expect(container.firstChild.firstChild.lastChild.lastChild).toHaveClass(
50
- 'text-medium-emphasis',
50
+ 'text-body-secondary',
51
51
  )
52
52
  expect(container.firstChild.firstChild.lastChild.lastChild).toHaveClass('text-uppercase')
53
53
  expect(container.firstChild.firstChild.lastChild.lastChild).toHaveClass('fw-semibold ')
@@ -3,7 +3,7 @@
3
3
  exports[`CWidgetStatsA customize 1`] = `
4
4
  <div>
5
5
  <div
6
- class="card bg-info text-high-emphasis-inverse bazinga"
6
+ class="card bg-info text-white bazinga"
7
7
  >
8
8
  <div
9
9
  class="card-body pb-0 d-flex justify-content-between align-items-start"
@@ -3,7 +3,7 @@
3
3
  exports[`CWidgetStatsB customize 1`] = `
4
4
  <div>
5
5
  <div
6
- class="card bg-info text-high-emphasis-inverse bazinga"
6
+ class="card bg-info text-white bazinga"
7
7
  >
8
8
  <div
9
9
  class="card-body"
@@ -17,20 +17,20 @@ exports[`CWidgetStatsB customize 1`] = `
17
17
  title
18
18
  </div>
19
19
  <div
20
+ aria-valuemax="100"
21
+ aria-valuemin="0"
22
+ aria-valuenow="75"
20
23
  class="progress progress-white my-2"
24
+ role="progressbar"
21
25
  style="height: 4px;"
22
26
  >
23
27
  <div
24
- aria-valuemax="100"
25
- aria-valuemin="0"
26
- aria-valuenow="75"
27
28
  class="progress-bar bg-warning"
28
- role="progressbar"
29
29
  style="width: 75%;"
30
30
  />
31
31
  </div>
32
32
  <small
33
- class="text-medium-emphasis-inverse"
33
+ class="text-white text-opacity-75"
34
34
  >
35
35
  text
36
36
  </small>
@@ -50,7 +50,12 @@ exports[`loads and displays CWidgetStatsB component 1`] = `
50
50
  <div
51
51
  class="progress my-2"
52
52
  style="height: 4px;"
53
- />
53
+ >
54
+ <div
55
+ class="progress-bar"
56
+ style="width: 0%;"
57
+ />
58
+ </div>
54
59
  </div>
55
60
  </div>
56
61
  </div>
@@ -3,36 +3,36 @@
3
3
  exports[`CWidgetStatsC customize 1`] = `
4
4
  <div>
5
5
  <div
6
- class="card bg-info text-high-emphasis-inverse bazinga"
6
+ class="card bg-info text-white bazinga"
7
7
  >
8
8
  <div
9
9
  class="card-body"
10
10
  >
11
11
  <div
12
- class="text-medium-emphasis-inverse text-end mb-4"
12
+ class="text-end mb-4"
13
13
  >
14
14
  icon
15
15
  </div>
16
16
  <div
17
- class="text-high-emphasis-inverse fs-4 fw-semibold"
17
+ class="fs-4 fw-semibold"
18
18
  >
19
19
  value
20
20
  </div>
21
21
  <div
22
- class="text-medium-emphasis-inverse"
22
+ class="text-white text-opacity-75"
23
23
  >
24
24
  title
25
25
  </div>
26
26
  <div
27
+ aria-valuemax="100"
28
+ aria-valuemin="0"
29
+ aria-valuenow="75"
27
30
  class="progress progress-white mt-3 mb-0"
31
+ role="progressbar"
28
32
  style="height: 4px;"
29
33
  >
30
34
  <div
31
- aria-valuemax="100"
32
- aria-valuemin="0"
33
- aria-valuenow="75"
34
35
  class="progress-bar bg-warning"
35
- role="progressbar"
36
36
  style="width: 75%;"
37
37
  />
38
38
  </div>
@@ -52,7 +52,12 @@ exports[`loads and displays CWidgetStatsC component 1`] = `
52
52
  <div
53
53
  class="progress mt-3 mb-0"
54
54
  style="height: 4px;"
55
- />
55
+ >
56
+ <div
57
+ class="progress-bar"
58
+ style="width: 0%;"
59
+ />
60
+ </div>
56
61
  </div>
57
62
  </div>
58
63
  </div>
@@ -20,7 +20,7 @@ exports[`CWidgetStatsD customize 1`] = `
20
20
  89K
21
21
  </div>
22
22
  <div
23
- class="text-uppercase text-medium-emphasis small"
23
+ class="text-uppercase text-body-secondary small"
24
24
  >
25
25
  friends
26
26
  </div>
@@ -37,7 +37,7 @@ exports[`CWidgetStatsD customize 1`] = `
37
37
  459
38
38
  </div>
39
39
  <div
40
- class="text-uppercase text-medium-emphasis small"
40
+ class="text-uppercase text-body-secondary small"
41
41
  >
42
42
  feeds
43
43
  </div>
@@ -9,7 +9,7 @@ exports[`CWidgetStatsE customize 1`] = `
9
9
  class="card-body text-center"
10
10
  >
11
11
  <div
12
- class="text-medium-emphasis small text-uppercase fw-semibold"
12
+ class="text-body-secondary small text-uppercase fw-semibold"
13
13
  >
14
14
  title
15
15
  </div>
@@ -20,7 +20,7 @@ exports[`CWidgetStatsF customize 1`] = `
20
20
  value
21
21
  </div>
22
22
  <div
23
- class="text-medium-emphasis text-uppercase fw-semibold small"
23
+ class="text-body-secondary text-uppercase fw-semibold small"
24
24
  >
25
25
  title
26
26
  </div>
@@ -51,7 +51,7 @@ exports[`loads and displays CWidgetStatsF component 1`] = `
51
51
  class="fs-6 fw-semibold text-undefined"
52
52
  />
53
53
  <div
54
- class="text-medium-emphasis text-uppercase fw-semibold small"
54
+ class="text-body-secondary text-uppercase fw-semibold small"
55
55
  />
56
56
  </div>
57
57
  </div>
@@ -2,6 +2,8 @@ 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
+
5
7
  interface UsePopperOutput {
6
8
  popper: Instance | undefined
7
9
  initPopper: (reference: HTMLElement, popper: HTMLElement, options: Partial<Options>) => void
@@ -10,14 +12,20 @@ interface UsePopperOutput {
10
12
 
11
13
  export const usePopper = (): UsePopperOutput => {
12
14
  const _popper = useRef<Instance>()
15
+ const el = useRef<HTMLElement>()
13
16
 
14
17
  const initPopper = (reference: HTMLElement, popper: HTMLElement, options: Partial<Options>) => {
15
18
  _popper.current = createPopper(reference, popper, options)
19
+ el.current = popper
16
20
  }
17
21
 
18
22
  const destroyPopper = () => {
19
- if (_popper.current) {
20
- _popper.current.destroy()
23
+ const popperInstance = _popper.current
24
+
25
+ if (popperInstance && el.current) {
26
+ executeAfterTransition(() => {
27
+ popperInstance.destroy()
28
+ }, el.current)
21
29
  }
22
30
 
23
31
  _popper.current = undefined
package/src/types.ts CHANGED
@@ -45,14 +45,21 @@ export type Shapes =
45
45
 
46
46
  export type TextColors =
47
47
  | Colors
48
+ | 'primary-emphasis'
49
+ | 'secondary-emphasis'
50
+ | 'success-emphasis'
51
+ | 'danger-emphasis'
52
+ | 'warning-emphasis'
53
+ | 'info-emphasis'
54
+ | 'light-emphasis'
55
+ | 'body'
56
+ | 'body-emphasis'
57
+ | 'body-secondary'
58
+ | 'body-tertiary'
59
+ | 'black'
60
+ | 'black-50'
48
61
  | 'white'
49
- | 'muted'
50
- | 'high-emphasis'
51
- | 'medium-emphasis'
52
- | 'disabled'
53
- | 'high-emphasis-inverse'
54
- | 'medium-emphasis-inverse'
55
- | 'disabled-inverse'
62
+ | 'white-50'
56
63
  | string
57
64
 
58
65
  export type Triggers = 'hover' | 'focus' | 'click'
@@ -0,0 +1,46 @@
1
+ import getTransitionDurationFromElement from './getTransitionDurationFromElement'
2
+
3
+ const execute = (callback: () => void) => {
4
+ if (typeof callback === 'function') {
5
+ callback()
6
+ }
7
+ }
8
+
9
+ const triggerTransitionEnd = (element: HTMLElement) => {
10
+ element.dispatchEvent(new Event('transitionend'))
11
+ }
12
+
13
+ const executeAfterTransition = (
14
+ callback: () => void,
15
+ transitionElement: HTMLElement,
16
+ waitForTransition = true,
17
+ ) => {
18
+ if (!waitForTransition) {
19
+ execute(callback)
20
+ return
21
+ }
22
+
23
+ const durationPadding = 5
24
+ const emulatedDuration = getTransitionDurationFromElement(transitionElement) + durationPadding
25
+
26
+ let called = false
27
+
28
+ const handler = ({ target }: { target: any }) => {
29
+ if (target !== transitionElement) {
30
+ return
31
+ }
32
+
33
+ called = true
34
+ transitionElement.removeEventListener('transitionend', handler)
35
+ execute(callback)
36
+ }
37
+
38
+ transitionElement.addEventListener('transitionend', handler)
39
+ setTimeout(() => {
40
+ if (!called) {
41
+ triggerTransitionEnd(transitionElement)
42
+ }
43
+ }, emulatedDuration)
44
+ }
45
+
46
+ export default executeAfterTransition
@@ -0,0 +1,24 @@
1
+ const getTransitionDurationFromElement = (element: HTMLElement) => {
2
+ if (!element) {
3
+ return 0
4
+ }
5
+
6
+ // Get transition-duration of the element
7
+ let { transitionDuration, transitionDelay } = window.getComputedStyle(element)
8
+
9
+ const floatTransitionDuration = Number.parseFloat(transitionDuration)
10
+ const floatTransitionDelay = Number.parseFloat(transitionDelay)
11
+
12
+ // Return 0 if element or transition duration is not found
13
+ if (!floatTransitionDuration && !floatTransitionDelay) {
14
+ return 0
15
+ }
16
+
17
+ // If multiple durations are defined, take the first
18
+ transitionDuration = transitionDuration.split(',')[0]
19
+ transitionDelay = transitionDelay.split(',')[0]
20
+
21
+ return (Number.parseFloat(transitionDuration) + Number.parseFloat(transitionDelay)) * 1000
22
+ }
23
+
24
+ export default getTransitionDurationFromElement
@@ -1,5 +1,13 @@
1
+ import executeAfterTransition from './executeAfterTransition'
1
2
  import getRTLPlacement from './getRTLPlacement'
3
+ import getTransitionDurationFromElement from './getTransitionDurationFromElement'
2
4
  import isInViewport from './isInViewport'
3
5
  import isRTL from './isRTL'
4
6
 
5
- export { getRTLPlacement, isInViewport, isRTL }
7
+ export {
8
+ executeAfterTransition,
9
+ getRTLPlacement,
10
+ getTransitionDurationFromElement,
11
+ isInViewport,
12
+ isRTL,
13
+ }