@coreui/react-pro 5.1.0-alpha.0 → 5.2.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 (116) hide show
  1. package/README.md +1 -1
  2. package/dist/cjs/components/calendar/CCalendar.js +2 -3
  3. package/dist/cjs/components/calendar/CCalendar.js.map +1 -1
  4. package/dist/cjs/components/calendar/utils.d.ts +1 -0
  5. package/dist/cjs/components/calendar/utils.js +14 -5
  6. package/dist/cjs/components/calendar/utils.js.map +1 -1
  7. package/dist/cjs/components/date-range-picker/CDateRangePicker.js +1 -1
  8. package/dist/cjs/components/date-range-picker/CDateRangePicker.js.map +1 -1
  9. package/dist/cjs/components/dropdown/CDropdown.js +2 -1
  10. package/dist/cjs/components/dropdown/CDropdown.js.map +1 -1
  11. package/dist/cjs/components/dropdown/utils.d.ts +0 -1
  12. package/dist/cjs/components/dropdown/utils.js +0 -13
  13. package/dist/cjs/components/dropdown/utils.js.map +1 -1
  14. package/dist/cjs/components/multi-select/CMultiSelect.js +4 -0
  15. package/dist/cjs/components/multi-select/CMultiSelect.js.map +1 -1
  16. package/dist/cjs/components/multi-select/CMultiSelectSelection.js +1 -1
  17. package/dist/cjs/components/multi-select/CMultiSelectSelection.js.map +1 -1
  18. package/dist/cjs/components/multi-select/utils.js +0 -6
  19. package/dist/cjs/components/multi-select/utils.js.map +1 -1
  20. package/dist/cjs/components/rating/CRating.d.ts +3 -3
  21. package/dist/cjs/components/rating/CRating.js +15 -5
  22. package/dist/cjs/components/rating/CRating.js.map +1 -1
  23. package/dist/cjs/components/tabs/CTab.d.ts +12 -0
  24. package/dist/cjs/components/tabs/CTab.js +25 -0
  25. package/dist/cjs/components/tabs/CTab.js.map +1 -0
  26. package/dist/cjs/components/tabs/CTabList.d.ts +16 -0
  27. package/dist/cjs/components/tabs/CTabList.js +54 -0
  28. package/dist/cjs/components/tabs/CTabList.js.map +1 -0
  29. package/dist/cjs/components/tabs/CTabPane.d.ts +6 -0
  30. package/dist/cjs/components/tabs/CTabPane.js +4 -2
  31. package/dist/cjs/components/tabs/CTabPane.js.map +1 -1
  32. package/dist/cjs/components/tabs/CTabPanel.d.ts +28 -0
  33. package/dist/cjs/components/tabs/CTabPanel.js +43 -0
  34. package/dist/cjs/components/tabs/CTabPanel.js.map +1 -0
  35. package/dist/cjs/components/tabs/CTabs.d.ts +22 -0
  36. package/dist/cjs/components/tabs/CTabs.js +28 -0
  37. package/dist/cjs/components/tabs/CTabs.js.map +1 -0
  38. package/dist/cjs/components/tabs/index.d.ts +5 -1
  39. package/dist/cjs/index.js +8 -0
  40. package/dist/cjs/index.js.map +1 -1
  41. package/dist/cjs/node_modules/react-device-detect/dist/lib.js +0 -1
  42. package/dist/cjs/node_modules/react-device-detect/dist/lib.js.map +1 -1
  43. package/dist/cjs/node_modules/react-transition-group/esm/CSSTransition.js +1 -2
  44. package/dist/cjs/node_modules/react-transition-group/esm/CSSTransition.js.map +1 -1
  45. package/dist/cjs/node_modules/react-transition-group/esm/Transition.js +1 -2
  46. package/dist/cjs/node_modules/react-transition-group/esm/Transition.js.map +1 -1
  47. package/dist/cjs/utils/getNextActiveElement.d.ts +2 -0
  48. package/dist/cjs/utils/getNextActiveElement.js +19 -0
  49. package/dist/cjs/utils/getNextActiveElement.js.map +1 -0
  50. package/dist/cjs/utils/index.d.ts +2 -1
  51. package/dist/esm/components/calendar/CCalendar.js +2 -3
  52. package/dist/esm/components/calendar/CCalendar.js.map +1 -1
  53. package/dist/esm/components/calendar/utils.d.ts +1 -0
  54. package/dist/esm/components/calendar/utils.js +14 -6
  55. package/dist/esm/components/calendar/utils.js.map +1 -1
  56. package/dist/esm/components/date-range-picker/CDateRangePicker.js +1 -1
  57. package/dist/esm/components/date-range-picker/CDateRangePicker.js.map +1 -1
  58. package/dist/esm/components/dropdown/CDropdown.js +2 -1
  59. package/dist/esm/components/dropdown/CDropdown.js.map +1 -1
  60. package/dist/esm/components/dropdown/utils.d.ts +0 -1
  61. package/dist/esm/components/dropdown/utils.js +1 -13
  62. package/dist/esm/components/dropdown/utils.js.map +1 -1
  63. package/dist/esm/components/multi-select/CMultiSelect.js +4 -0
  64. package/dist/esm/components/multi-select/CMultiSelect.js.map +1 -1
  65. package/dist/esm/components/multi-select/CMultiSelectSelection.js +1 -1
  66. package/dist/esm/components/multi-select/CMultiSelectSelection.js.map +1 -1
  67. package/dist/esm/components/multi-select/utils.js +0 -6
  68. package/dist/esm/components/multi-select/utils.js.map +1 -1
  69. package/dist/esm/components/rating/CRating.d.ts +3 -3
  70. package/dist/esm/components/rating/CRating.js +16 -6
  71. package/dist/esm/components/rating/CRating.js.map +1 -1
  72. package/dist/esm/components/tabs/CTab.d.ts +12 -0
  73. package/dist/esm/components/tabs/CTab.js +23 -0
  74. package/dist/esm/components/tabs/CTab.js.map +1 -0
  75. package/dist/esm/components/tabs/CTabList.d.ts +16 -0
  76. package/dist/esm/components/tabs/CTabList.js +52 -0
  77. package/dist/esm/components/tabs/CTabList.js.map +1 -0
  78. package/dist/esm/components/tabs/CTabPane.d.ts +6 -0
  79. package/dist/esm/components/tabs/CTabPane.js +4 -2
  80. package/dist/esm/components/tabs/CTabPane.js.map +1 -1
  81. package/dist/esm/components/tabs/CTabPanel.d.ts +28 -0
  82. package/dist/esm/components/tabs/CTabPanel.js +41 -0
  83. package/dist/esm/components/tabs/CTabPanel.js.map +1 -0
  84. package/dist/esm/components/tabs/CTabs.d.ts +22 -0
  85. package/dist/esm/components/tabs/CTabs.js +25 -0
  86. package/dist/esm/components/tabs/CTabs.js.map +1 -0
  87. package/dist/esm/components/tabs/index.d.ts +5 -1
  88. package/dist/esm/index.js +4 -0
  89. package/dist/esm/index.js.map +1 -1
  90. package/dist/esm/node_modules/react-device-detect/dist/lib.js +0 -1
  91. package/dist/esm/node_modules/react-device-detect/dist/lib.js.map +1 -1
  92. package/dist/esm/node_modules/react-transition-group/esm/CSSTransition.js +1 -2
  93. package/dist/esm/node_modules/react-transition-group/esm/CSSTransition.js.map +1 -1
  94. package/dist/esm/node_modules/react-transition-group/esm/Transition.js +1 -2
  95. package/dist/esm/node_modules/react-transition-group/esm/Transition.js.map +1 -1
  96. package/dist/esm/utils/getNextActiveElement.d.ts +2 -0
  97. package/dist/esm/utils/getNextActiveElement.js +15 -0
  98. package/dist/esm/utils/getNextActiveElement.js.map +1 -0
  99. package/dist/esm/utils/index.d.ts +2 -1
  100. package/package.json +12 -12
  101. package/src/components/calendar/CCalendar.tsx +2 -2
  102. package/src/components/calendar/utils.ts +23 -7
  103. package/src/components/date-range-picker/CDateRangePicker.tsx +1 -1
  104. package/src/components/dropdown/CDropdown.tsx +2 -2
  105. package/src/components/dropdown/utils.ts +0 -22
  106. package/src/components/multi-select/CMultiSelect.tsx +5 -0
  107. package/src/components/multi-select/CMultiSelectSelection.tsx +1 -0
  108. package/src/components/rating/CRating.tsx +30 -8
  109. package/src/components/tabs/CTab.tsx +56 -0
  110. package/src/components/tabs/CTabList.tsx +92 -0
  111. package/src/components/tabs/CTabPane.tsx +9 -2
  112. package/src/components/tabs/CTabPanel.tsx +98 -0
  113. package/src/components/tabs/CTabs.tsx +54 -0
  114. package/src/components/tabs/index.ts +5 -1
  115. package/src/utils/getNextActiveElement.ts +23 -0
  116. package/src/utils/index.ts +2 -0
@@ -0,0 +1,92 @@
1
+ import React, { forwardRef, HTMLAttributes, KeyboardEvent, useRef } from 'react'
2
+ import PropTypes from 'prop-types'
3
+ import classNames from 'classnames'
4
+
5
+ import { useForkedRef } from '../../hooks'
6
+ import { getNextActiveElement } from '../../utils'
7
+
8
+ export interface CTabListProps extends HTMLAttributes<HTMLDivElement> {
9
+ /**
10
+ * A string of all className you want applied to the base component.
11
+ */
12
+ className?: string
13
+ /**
14
+ * Specify a layout type for component.
15
+ */
16
+ layout?: 'fill' | 'justified'
17
+ /**
18
+ * Set the nav variant to tabs or pills.
19
+ */
20
+ variant?: 'pills' | 'tabs' | 'underline' | 'underline-border'
21
+ }
22
+
23
+ export const CTabList = forwardRef<HTMLDivElement, CTabListProps>(
24
+ ({ children, className, layout, variant, ...rest }, ref) => {
25
+ const tabListRef = useRef<HTMLDivElement>(null)
26
+ const forkedRef = useForkedRef(ref, tabListRef)
27
+
28
+ const handleKeydown = (event: KeyboardEvent<HTMLDivElement>) => {
29
+ if (
30
+ tabListRef.current !== null &&
31
+ (event.key === 'ArrowDown' ||
32
+ event.key === 'ArrowUp' ||
33
+ event.key === 'ArrowLeft' ||
34
+ event.key === 'ArrowRight' ||
35
+ event.key === 'Home' ||
36
+ event.key === 'End')
37
+ ) {
38
+ event.preventDefault()
39
+ const target = event.target as HTMLElement
40
+ // eslint-disable-next-line unicorn/prefer-spread
41
+ const items: HTMLElement[] = Array.from(
42
+ tabListRef.current.querySelectorAll('.nav-link:not(.disabled):not(:disabled)'),
43
+ )
44
+
45
+ let nextActiveElement
46
+
47
+ if (event.key === 'Home' || event.key === 'End') {
48
+ nextActiveElement = event.key === 'End' ? items.at(-1) : items[0]
49
+ } else {
50
+ nextActiveElement = getNextActiveElement(
51
+ items,
52
+ target,
53
+ event.key === 'ArrowDown' || event.key === 'ArrowRight',
54
+ true,
55
+ )
56
+ }
57
+
58
+ if (nextActiveElement) {
59
+ nextActiveElement.focus({ preventScroll: true })
60
+ }
61
+ }
62
+ }
63
+
64
+ return (
65
+ <div
66
+ className={classNames(
67
+ 'nav',
68
+ {
69
+ [`nav-${layout}`]: layout,
70
+ [`nav-${variant}`]: variant,
71
+ },
72
+ className,
73
+ )}
74
+ role="tablist"
75
+ onKeyDown={handleKeydown}
76
+ ref={forkedRef}
77
+ {...rest}
78
+ >
79
+ {children}
80
+ </div>
81
+ )
82
+ },
83
+ )
84
+
85
+ CTabList.propTypes = {
86
+ children: PropTypes.node,
87
+ className: PropTypes.string,
88
+ layout: PropTypes.oneOf(['fill', 'justified']),
89
+ variant: PropTypes.oneOf(['pills', 'tabs', 'underline', 'underline-border']),
90
+ }
91
+
92
+ CTabList.displayName = 'CTabList'
@@ -18,6 +18,12 @@ export interface CTabPaneProps extends HTMLAttributes<HTMLDivElement> {
18
18
  * Callback fired when the component requests to be shown.
19
19
  */
20
20
  onShow?: () => void
21
+ /**
22
+ * Enable fade in and fade out transition.
23
+ *
24
+ * @since 5.1.0
25
+ */
26
+ transition?: boolean
21
27
  /**
22
28
  * Toggle the visibility of component.
23
29
  */
@@ -25,7 +31,7 @@ export interface CTabPaneProps extends HTMLAttributes<HTMLDivElement> {
25
31
  }
26
32
 
27
33
  export const CTabPane = forwardRef<HTMLDivElement, CTabPaneProps>(
28
- ({ children, className, onHide, onShow, visible, ...rest }, ref) => {
34
+ ({ children, className, onHide, onShow, transition = true, visible, ...rest }, ref) => {
29
35
  const tabPaneRef = useRef()
30
36
  const forkedRef = useForkedRef(ref, tabPaneRef)
31
37
 
@@ -35,9 +41,9 @@ export const CTabPane = forwardRef<HTMLDivElement, CTabPaneProps>(
35
41
  <div
36
42
  className={classNames(
37
43
  'tab-pane',
38
- 'fade',
39
44
  {
40
45
  active: visible,
46
+ fade: transition,
41
47
  show: state === 'entered',
42
48
  },
43
49
  className,
@@ -58,6 +64,7 @@ CTabPane.propTypes = {
58
64
  className: PropTypes.string,
59
65
  onHide: PropTypes.func,
60
66
  onShow: PropTypes.func,
67
+ transition: PropTypes.bool,
61
68
  visible: PropTypes.bool,
62
69
  }
63
70
 
@@ -0,0 +1,98 @@
1
+ import React, { HTMLAttributes, forwardRef, useContext, useEffect, useRef, useState } from 'react'
2
+ import PropTypes from 'prop-types'
3
+ import classNames from 'classnames'
4
+ import { Transition } from 'react-transition-group'
5
+
6
+ import { TabsContext } from './CTabs'
7
+ import { useForkedRef } from '../../hooks'
8
+ import { getTransitionDurationFromElement } from '../../utils'
9
+
10
+ export interface CTabPanelProps extends HTMLAttributes<HTMLDivElement> {
11
+ /**
12
+ * A string of all className you want applied to the base component.
13
+ */
14
+ className?: string
15
+ /**
16
+ * Item key.
17
+ */
18
+ itemKey: number | string
19
+ /**
20
+ * Callback fired when the component requests to be hidden.
21
+ */
22
+ onHide?: () => void
23
+ /**
24
+ * Callback fired when the component requests to be shown.
25
+ */
26
+ onShow?: () => void
27
+ /**
28
+ * Enable fade in and fade out transition.
29
+ */
30
+ transition?: boolean
31
+ /**
32
+ * Toggle the visibility of component.
33
+ */
34
+ visible?: boolean
35
+ }
36
+
37
+ export const CTabPanel = forwardRef<HTMLDivElement, CTabPanelProps>(
38
+ ({ children, className, itemKey, onHide, onShow, transition = true, visible, ...rest }, ref) => {
39
+ const { _activeItemKey, id } = useContext(TabsContext)
40
+
41
+ const tabPaneRef = useRef()
42
+ const forkedRef = useForkedRef(ref, tabPaneRef)
43
+
44
+ const [_visible, setVisible] = useState(visible || _activeItemKey === itemKey)
45
+
46
+ useEffect(() => {
47
+ visible !== undefined && setVisible(visible)
48
+ }, [visible])
49
+
50
+ useEffect(() => {
51
+ setVisible(_activeItemKey === itemKey)
52
+ }, [_activeItemKey])
53
+
54
+ return (
55
+ <Transition
56
+ in={_visible}
57
+ nodeRef={tabPaneRef}
58
+ onEnter={onShow}
59
+ onExit={onHide}
60
+ timeout={tabPaneRef.current ? getTransitionDurationFromElement(tabPaneRef.current) : 0}
61
+ >
62
+ {(state) => (
63
+ <div
64
+ className={classNames(
65
+ 'tab-pane',
66
+ {
67
+ active: _visible,
68
+ fade: transition,
69
+ show: state === 'entered',
70
+ },
71
+ className,
72
+ )}
73
+ id={`${id}${itemKey}-tab-pane`}
74
+ role="tabpanel"
75
+ aria-labelledby={`${id}${itemKey}-tab`}
76
+ tabIndex={0}
77
+ ref={forkedRef}
78
+ {...rest}
79
+ >
80
+ {children}
81
+ </div>
82
+ )}
83
+ </Transition>
84
+ )
85
+ },
86
+ )
87
+
88
+ CTabPanel.propTypes = {
89
+ children: PropTypes.node,
90
+ className: PropTypes.string,
91
+ itemKey: PropTypes.oneOfType([PropTypes.number, PropTypes.string]).isRequired,
92
+ onHide: PropTypes.func,
93
+ onShow: PropTypes.func,
94
+ transition: PropTypes.bool,
95
+ visible: PropTypes.bool,
96
+ }
97
+
98
+ CTabPanel.displayName = 'CTabPanel'
@@ -0,0 +1,54 @@
1
+ import React, { createContext, forwardRef, HTMLAttributes, useEffect, useId, useState } from 'react'
2
+ import PropTypes from 'prop-types'
3
+ import classNames from 'classnames'
4
+
5
+ export interface CTabsProps extends Omit<HTMLAttributes<HTMLDivElement>, 'onChange'> {
6
+ /**
7
+ * The active item key.
8
+ */
9
+ activeItemKey: number | string
10
+ /**
11
+ * A string of all className you want applied to the base component.
12
+ */
13
+ className?: string
14
+ /**
15
+ * The callback is fired when the active tab changes.
16
+ */
17
+ onChange?: (value: number | string) => void
18
+ }
19
+
20
+ export interface TabsContextProps {
21
+ _activeItemKey?: number | string
22
+ setActiveItemKey: React.Dispatch<React.SetStateAction<number | string | undefined>>
23
+ id?: string
24
+ }
25
+
26
+ export const TabsContext = createContext({} as TabsContextProps)
27
+
28
+ export const CTabs = forwardRef<HTMLDivElement, CTabsProps>(
29
+ ({ children, activeItemKey, className, onChange }, ref) => {
30
+ const id = useId()
31
+ const [_activeItemKey, setActiveItemKey] = useState(activeItemKey)
32
+
33
+ useEffect(() => {
34
+ _activeItemKey && onChange && onChange(_activeItemKey)
35
+ }, [_activeItemKey])
36
+
37
+ return (
38
+ <TabsContext.Provider value={{ _activeItemKey, setActiveItemKey, id }}>
39
+ <div className={classNames('tabs', className)} ref={ref}>
40
+ {children}
41
+ </div>
42
+ </TabsContext.Provider>
43
+ )
44
+ },
45
+ )
46
+
47
+ CTabs.propTypes = {
48
+ activeItemKey: PropTypes.oneOfType([PropTypes.number, PropTypes.string]).isRequired,
49
+ children: PropTypes.node,
50
+ className: PropTypes.string,
51
+ onChange: PropTypes.func,
52
+ }
53
+
54
+ CTabs.displayName = 'CTabs'
@@ -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 }
@@ -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'
@@ -7,6 +8,7 @@ import isRTL from './isRTL'
7
8
 
8
9
  export {
9
10
  executeAfterTransition,
11
+ getNextActiveElement,
10
12
  getRTLPlacement,
11
13
  getTransitionDurationFromElement,
12
14
  isInViewport,