@elliemae/ds-tabs 2.3.0-alpha.8 → 2.3.0-next.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 (174) hide show
  1. package/cjs/DSTabs.js +45 -0
  2. package/cjs/DSTabsCTX.js +30 -0
  3. package/cjs/DSTabsDatatestid.js +18 -0
  4. package/cjs/DSTabsTypes.js +2 -0
  5. package/cjs/config/useCrossRef.js +17 -0
  6. package/cjs/config/useTabs.js +51 -0
  7. package/cjs/defaultProps.js +27 -0
  8. package/cjs/exportsRelated/DSTab.js +32 -0
  9. package/cjs/index.js +17 -0
  10. package/cjs/parts/carousel/Carousel.js +69 -0
  11. package/cjs/parts/carousel/styles.js +65 -0
  12. package/cjs/parts/carousel/useCarousel.js +78 -0
  13. package/cjs/parts/carousel/useCarouselCallbacks.js +72 -0
  14. package/cjs/parts/tabBar/TabBar.js +168 -0
  15. package/cjs/parts/tabBar/styles.js +200 -0
  16. package/cjs/parts/tabBar/useTabBar.js +87 -0
  17. package/cjs/parts/tabsContent/TabsContent.js +49 -0
  18. package/cjs/parts/tabsContent/styles.js +15 -0
  19. package/cjs/parts/tabsPanel/TabsPanels.js +77 -0
  20. package/cjs/parts/tabsPanel/styles.js +25 -0
  21. package/cjs/propTypes.js +33 -0
  22. package/cjs/utils/constants.js +28 -0
  23. package/cjs/utils/helpers.js +75 -0
  24. package/cjs/utils/hooks/useKeyboardNavigation.js +61 -0
  25. package/cjs/utils/hooks/useTabsCallbacks.js +41 -0
  26. package/esm/DSTabs.js +35 -0
  27. package/esm/DSTabsCTX.js +25 -0
  28. package/esm/DSTabsDatatestid.js +14 -0
  29. package/esm/DSTabsTypes.js +1 -0
  30. package/{dist/esm → esm}/config/useCrossRef.js +4 -6
  31. package/esm/config/useTabs.js +47 -0
  32. package/{dist/esm → esm}/defaultProps.js +8 -9
  33. package/esm/exportsRelated/DSTab.js +21 -0
  34. package/esm/index.js +4 -0
  35. package/esm/parts/carousel/Carousel.js +61 -0
  36. package/esm/parts/carousel/styles.js +54 -0
  37. package/{dist/esm → esm}/parts/carousel/useCarousel.js +34 -15
  38. package/{dist/esm → esm}/parts/carousel/useCarouselCallbacks.js +28 -20
  39. package/esm/parts/tabBar/TabBar.js +159 -0
  40. package/esm/parts/tabBar/styles.js +186 -0
  41. package/{dist/esm → esm}/parts/tabBar/useTabBar.js +35 -27
  42. package/esm/parts/tabsContent/TabsContent.js +40 -0
  43. package/esm/parts/tabsContent/styles.js +7 -0
  44. package/esm/parts/tabsPanel/TabsPanels.js +67 -0
  45. package/esm/parts/tabsPanel/styles.js +17 -0
  46. package/esm/propTypes.js +28 -0
  47. package/esm/utils/constants.js +20 -0
  48. package/{dist/esm → esm}/utils/helpers.js +28 -23
  49. package/esm/utils/hooks/useKeyboardNavigation.js +57 -0
  50. package/esm/utils/hooks/useTabsCallbacks.js +37 -0
  51. package/package.json +70 -72
  52. package/types/DSTabs.d.ts +14 -0
  53. package/types/DSTabsCTX.d.ts +4 -0
  54. package/types/DSTabsDatatestid.d.ts +12 -0
  55. package/types/DSTabsTypes.d.ts +205 -0
  56. package/types/config/useCrossRef.d.ts +2 -0
  57. package/types/config/useTabs.d.ts +2 -0
  58. package/types/defaultProps.d.ts +2 -0
  59. package/types/exportsRelated/DSTab.d.ts +14 -0
  60. package/types/index.d.ts +5 -0
  61. package/types/parts/carousel/Carousel.d.ts +3 -0
  62. package/types/parts/carousel/styles.d.ts +9 -0
  63. package/types/parts/carousel/useCarousel.d.ts +2 -0
  64. package/types/parts/carousel/useCarouselCallbacks.d.ts +2 -0
  65. package/types/parts/tabBar/TabBar.d.ts +2 -0
  66. package/types/parts/tabBar/styles.d.ts +7 -0
  67. package/types/parts/tabBar/useTabBar.d.ts +2 -0
  68. package/types/parts/tabsContent/TabsContent.d.ts +2 -0
  69. package/types/parts/tabsContent/styles.d.ts +1 -0
  70. package/types/parts/tabsPanel/TabsPanels.d.ts +2 -0
  71. package/types/parts/tabsPanel/styles.d.ts +2 -0
  72. package/types/propTypes.d.ts +54 -0
  73. package/types/tests/DSTabs.callbacks.test.d.ts +1 -0
  74. package/types/tests/DSTabs.func.test.d.ts +1 -0
  75. package/types/tests/DSTabs.keyboard.test.d.ts +1 -0
  76. package/types/tests/DSTabs.test.d.ts +1 -0
  77. package/types/utils/constants.d.ts +18 -0
  78. package/types/utils/helpers.d.ts +9 -0
  79. package/types/utils/hooks/useKeyboardNavigation.d.ts +2 -0
  80. package/types/utils/hooks/useTabsCallbacks.d.ts +2 -0
  81. package/dist/cjs/DSTabs.js +0 -63
  82. package/dist/cjs/DSTabs.js.map +0 -7
  83. package/dist/cjs/DSTabsCTX.js +0 -56
  84. package/dist/cjs/DSTabsCTX.js.map +0 -7
  85. package/dist/cjs/DSTabsDatatestid.js +0 -46
  86. package/dist/cjs/DSTabsDatatestid.js.map +0 -7
  87. package/dist/cjs/DSTabsTypes.js +0 -27
  88. package/dist/cjs/DSTabsTypes.js.map +0 -7
  89. package/dist/cjs/config/useCrossRef.js +0 -44
  90. package/dist/cjs/config/useCrossRef.js.map +0 -7
  91. package/dist/cjs/config/useTabs.js +0 -68
  92. package/dist/cjs/config/useTabs.js.map +0 -7
  93. package/dist/cjs/defaultProps.js +0 -53
  94. package/dist/cjs/defaultProps.js.map +0 -7
  95. package/dist/cjs/exportsRelated/DSTab.js +0 -46
  96. package/dist/cjs/exportsRelated/DSTab.js.map +0 -7
  97. package/dist/cjs/index.js +0 -38
  98. package/dist/cjs/index.js.map +0 -7
  99. package/dist/cjs/parts/carousel/Carousel.js +0 -77
  100. package/dist/cjs/parts/carousel/Carousel.js.map +0 -7
  101. package/dist/cjs/parts/carousel/styles.js +0 -79
  102. package/dist/cjs/parts/carousel/styles.js.map +0 -7
  103. package/dist/cjs/parts/carousel/useCarousel.js +0 -80
  104. package/dist/cjs/parts/carousel/useCarousel.js.map +0 -7
  105. package/dist/cjs/parts/carousel/useCarouselCallbacks.js +0 -89
  106. package/dist/cjs/parts/carousel/useCarouselCallbacks.js.map +0 -7
  107. package/dist/cjs/parts/tabBar/TabBar.js +0 -171
  108. package/dist/cjs/parts/tabBar/TabBar.js.map +0 -7
  109. package/dist/cjs/parts/tabBar/styles.js +0 -294
  110. package/dist/cjs/parts/tabBar/styles.js.map +0 -7
  111. package/dist/cjs/parts/tabBar/useTabBar.js +0 -100
  112. package/dist/cjs/parts/tabBar/useTabBar.js.map +0 -7
  113. package/dist/cjs/parts/tabsContent/TabsContent.js +0 -53
  114. package/dist/cjs/parts/tabsContent/TabsContent.js.map +0 -7
  115. package/dist/cjs/parts/tabsContent/styles.js +0 -39
  116. package/dist/cjs/parts/tabsContent/styles.js.map +0 -7
  117. package/dist/cjs/parts/tabsPanel/TabsPanels.js +0 -79
  118. package/dist/cjs/parts/tabsPanel/TabsPanels.js.map +0 -7
  119. package/dist/cjs/parts/tabsPanel/styles.js +0 -45
  120. package/dist/cjs/parts/tabsPanel/styles.js.map +0 -7
  121. package/dist/cjs/propTypes.js +0 -58
  122. package/dist/cjs/propTypes.js.map +0 -7
  123. package/dist/cjs/utils/constants.js +0 -56
  124. package/dist/cjs/utils/constants.js.map +0 -7
  125. package/dist/cjs/utils/helpers.js +0 -88
  126. package/dist/cjs/utils/helpers.js.map +0 -7
  127. package/dist/cjs/utils/hooks/useKeyboardNavigation.js +0 -77
  128. package/dist/cjs/utils/hooks/useKeyboardNavigation.js.map +0 -7
  129. package/dist/cjs/utils/hooks/useTabsCallbacks.js +0 -60
  130. package/dist/cjs/utils/hooks/useTabsCallbacks.js.map +0 -7
  131. package/dist/esm/DSTabs.js +0 -34
  132. package/dist/esm/DSTabs.js.map +0 -7
  133. package/dist/esm/DSTabsCTX.js +0 -27
  134. package/dist/esm/DSTabsCTX.js.map +0 -7
  135. package/dist/esm/DSTabsDatatestid.js +0 -17
  136. package/dist/esm/DSTabsDatatestid.js.map +0 -7
  137. package/dist/esm/DSTabsTypes.js +0 -2
  138. package/dist/esm/DSTabsTypes.js.map +0 -7
  139. package/dist/esm/config/useCrossRef.js.map +0 -7
  140. package/dist/esm/config/useTabs.js +0 -39
  141. package/dist/esm/config/useTabs.js.map +0 -7
  142. package/dist/esm/defaultProps.js.map +0 -7
  143. package/dist/esm/exportsRelated/DSTab.js +0 -17
  144. package/dist/esm/exportsRelated/DSTab.js.map +0 -7
  145. package/dist/esm/index.js +0 -9
  146. package/dist/esm/index.js.map +0 -7
  147. package/dist/esm/parts/carousel/Carousel.js +0 -48
  148. package/dist/esm/parts/carousel/Carousel.js.map +0 -7
  149. package/dist/esm/parts/carousel/styles.js +0 -50
  150. package/dist/esm/parts/carousel/styles.js.map +0 -7
  151. package/dist/esm/parts/carousel/useCarousel.js.map +0 -7
  152. package/dist/esm/parts/carousel/useCarouselCallbacks.js.map +0 -7
  153. package/dist/esm/parts/tabBar/TabBar.js +0 -149
  154. package/dist/esm/parts/tabBar/TabBar.js.map +0 -7
  155. package/dist/esm/parts/tabBar/styles.js +0 -265
  156. package/dist/esm/parts/tabBar/styles.js.map +0 -7
  157. package/dist/esm/parts/tabBar/useTabBar.js.map +0 -7
  158. package/dist/esm/parts/tabsContent/TabsContent.js +0 -24
  159. package/dist/esm/parts/tabsContent/TabsContent.js.map +0 -7
  160. package/dist/esm/parts/tabsContent/styles.js +0 -10
  161. package/dist/esm/parts/tabsContent/styles.js.map +0 -7
  162. package/dist/esm/parts/tabsPanel/TabsPanels.js +0 -50
  163. package/dist/esm/parts/tabsPanel/TabsPanels.js.map +0 -7
  164. package/dist/esm/parts/tabsPanel/styles.js +0 -16
  165. package/dist/esm/parts/tabsPanel/styles.js.map +0 -7
  166. package/dist/esm/propTypes.js +0 -29
  167. package/dist/esm/propTypes.js.map +0 -7
  168. package/dist/esm/utils/constants.js +0 -27
  169. package/dist/esm/utils/constants.js.map +0 -7
  170. package/dist/esm/utils/helpers.js.map +0 -7
  171. package/dist/esm/utils/hooks/useKeyboardNavigation.js +0 -48
  172. package/dist/esm/utils/hooks/useKeyboardNavigation.js.map +0 -7
  173. package/dist/esm/utils/hooks/useTabsCallbacks.js +0 -31
  174. package/dist/esm/utils/hooks/useTabsCallbacks.js.map +0 -7
@@ -0,0 +1,28 @@
1
+ 'use strict';
2
+
3
+ Object.defineProperty(exports, '__esModule', { value: true });
4
+
5
+ const TabTypes = {
6
+ NORMAL: 'normal',
7
+ NORMAL_SMALL: 'normal_small',
8
+ SUBTABS: 'subtabs'
9
+ };
10
+ const TabTypesValuesAsArray = Object.values(TabTypes);
11
+ const MOBILE_GRADIENT_WIDTH = 24;
12
+ const defaultIndicatorStyles = {
13
+ left: '0px',
14
+ width: '0px',
15
+ backgroundWithTransparent: ''
16
+ };
17
+ const gradientOffsetsAccordingType = {
18
+ normal_small: 14,
19
+ normal: 16,
20
+ subtabs: 16,
21
+ fixedTabsHeaders: 0
22
+ };
23
+
24
+ exports.MOBILE_GRADIENT_WIDTH = MOBILE_GRADIENT_WIDTH;
25
+ exports.TabTypes = TabTypes;
26
+ exports.TabTypesValuesAsArray = TabTypesValuesAsArray;
27
+ exports.defaultIndicatorStyles = defaultIndicatorStyles;
28
+ exports.gradientOffsetsAccordingType = gradientOffsetsAccordingType;
@@ -0,0 +1,75 @@
1
+ 'use strict';
2
+
3
+ Object.defineProperty(exports, '__esModule', { value: true });
4
+
5
+ var constants = require('./constants.js');
6
+
7
+ const isElementVisible = (tab, tabList) => {
8
+ const tabDimensions = tab.getBoundingClientRect();
9
+ const tabListDimensions = tabList.getBoundingClientRect();
10
+ return tabDimensions.left <= tabListDimensions.left ? tabListDimensions.left - tabDimensions.left <= tabDimensions.width : tabDimensions.right - tabListDimensions.right <= tabDimensions.width;
11
+ };
12
+ const isElementVisibleCarousel = function (tab, tabContainer) {
13
+ let firstOrLastItem = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : true;
14
+
15
+ if (tab && tabContainer) {
16
+ const tabDimensions = tab.getBoundingClientRect();
17
+ const tabContainerDimensions = tabContainer.getBoundingClientRect();
18
+ const offset = firstOrLastItem ? 16 : 32;
19
+ const tabDimensionsLeft = Math.floor(tabDimensions.left - offset);
20
+ const tabDimensionsRight = Math.floor(tabDimensions.right + offset);
21
+ const tabContainerDimensionsLeft = Math.floor(tabContainerDimensions.left);
22
+ const tabContainerDimensionsRight = Math.floor(tabContainerDimensions.right);
23
+ return tabDimensionsLeft >= tabContainerDimensionsLeft && tabDimensionsRight <= tabContainerDimensionsRight;
24
+ }
25
+
26
+ return false;
27
+ };
28
+ const centerTab = _ref => {
29
+ let {
30
+ e,
31
+ listRef
32
+ } = _ref;
33
+
34
+ if (listRef.current) {
35
+ const {
36
+ offsetLeft
37
+ } = e === null || e === void 0 ? void 0 : e.target;
38
+ const {
39
+ width: tabWidth
40
+ } = (e === null || e === void 0 ? void 0 : e.target).getBoundingClientRect();
41
+ const {
42
+ width: listWidth
43
+ } = listRef.current.getBoundingClientRect();
44
+ const extraSideSpace = listWidth - tabWidth;
45
+ const leftOffsetToCenter = extraSideSpace > 0 ? extraSideSpace / 2 : 0;
46
+ const centeredLeftOffset = offsetLeft > leftOffsetToCenter ? offsetLeft - leftOffsetToCenter : 0;
47
+ listRef.current.scrollTo({
48
+ top: 0,
49
+ left: centeredLeftOffset,
50
+ behavior: 'smooth'
51
+ });
52
+ e === null || e === void 0 ? void 0 : e.preventDefault();
53
+ }
54
+ };
55
+ const getVisibleDimensions = (node, referenceNode) => {
56
+ const nodeDimensions = node.getBoundingClientRect();
57
+ const referenceNodeDimensions = referenceNode.getBoundingClientRect();
58
+ return {
59
+ width: Math.min(node.clientWidth, referenceNodeDimensions.left + referenceNode.clientWidth - nodeDimensions.left, node.clientWidth - (referenceNodeDimensions.left - nodeDimensions.left)),
60
+ height: Math.min(node.clientHeight, referenceNodeDimensions.top + referenceNode.clientHeight - nodeDimensions.top, node.clientHeight - (referenceNodeDimensions.top - nodeDimensions.top))
61
+ };
62
+ };
63
+ const getIndexById = (children, activeId) => children && children.findIndex(item => item.props.tabId === activeId);
64
+ const getIdByIndex = (children, index) => children && children[index].props.tabId || '';
65
+ const shouldHaveLeftGradient = scrollLeft => Math.abs(scrollLeft) > constants.MOBILE_GRADIENT_WIDTH;
66
+ const shouldHaveRightGradient = (scrollLeft, clientWidth, scrollWidth) => Math.abs(scrollLeft) <= scrollWidth - (clientWidth + constants.MOBILE_GRADIENT_WIDTH);
67
+
68
+ exports.centerTab = centerTab;
69
+ exports.getIdByIndex = getIdByIndex;
70
+ exports.getIndexById = getIndexById;
71
+ exports.getVisibleDimensions = getVisibleDimensions;
72
+ exports.isElementVisible = isElementVisible;
73
+ exports.isElementVisibleCarousel = isElementVisibleCarousel;
74
+ exports.shouldHaveLeftGradient = shouldHaveLeftGradient;
75
+ exports.shouldHaveRightGradient = shouldHaveRightGradient;
@@ -0,0 +1,61 @@
1
+ 'use strict';
2
+
3
+ Object.defineProperty(exports, '__esModule', { value: true });
4
+
5
+ var React = require('react');
6
+ var DSTabsCTX = require('../../DSTabsCTX.js');
7
+
8
+ /* eslint-disable max-statements */
9
+ const useKeyboardNavigation = () => {
10
+ const {
11
+ focusableTabsRef
12
+ } = React.useContext(DSTabsCTX.DSTabsContext);
13
+ const {
14
+ firstSubtabInternalRef,
15
+ lastTabInternalRef
16
+ } = React.useContext(DSTabsCTX.DSTabsCrossRefContext);
17
+ const handleOnKeyDown = React.useCallback(e => {
18
+ if (e.key === 'ArrowRight' && focusableTabsRef.current) {
19
+ var _focusableTabsRef$cur, _focusableTabsRef$cur2;
20
+
21
+ e.preventDefault();
22
+ e.stopPropagation();
23
+ const nextTab = focusableTabsRef.current[(focusableTabsRef === null || focusableTabsRef === void 0 ? void 0 : (_focusableTabsRef$cur = focusableTabsRef.current) === null || _focusableTabsRef$cur === void 0 ? void 0 : (_focusableTabsRef$cur2 = _focusableTabsRef$cur.indexOf) === null || _focusableTabsRef$cur2 === void 0 ? void 0 : _focusableTabsRef$cur2.call(_focusableTabsRef$cur, e.target)) + 1];
24
+ if (nextTab) nextTab.focus();
25
+ if (!nextTab) return;
26
+ }
27
+
28
+ if (e.key === 'ArrowLeft' && focusableTabsRef.current) {
29
+ var _focusableTabsRef$cur3, _focusableTabsRef$cur4;
30
+
31
+ e.preventDefault();
32
+ e.stopPropagation();
33
+ const prevTab = focusableTabsRef.current[(focusableTabsRef === null || focusableTabsRef === void 0 ? void 0 : (_focusableTabsRef$cur3 = focusableTabsRef.current) === null || _focusableTabsRef$cur3 === void 0 ? void 0 : (_focusableTabsRef$cur4 = _focusableTabsRef$cur3.indexOf) === null || _focusableTabsRef$cur4 === void 0 ? void 0 : _focusableTabsRef$cur4.call(_focusableTabsRef$cur3, e.target)) - 1];
34
+ if (prevTab) prevTab.focus();
35
+ if (!prevTab) return;
36
+ }
37
+
38
+ if (e.key === 'ArrowDown') {
39
+ var _firstSubtabInternalR;
40
+
41
+ e.preventDefault();
42
+ e.stopPropagation();
43
+ const canFocusCrossTabs = (firstSubtabInternalRef === null || firstSubtabInternalRef === void 0 ? void 0 : firstSubtabInternalRef.current) && (lastTabInternalRef === null || lastTabInternalRef === void 0 ? void 0 : lastTabInternalRef.current);
44
+ if (canFocusCrossTabs) (_firstSubtabInternalR = firstSubtabInternalRef.current) === null || _firstSubtabInternalR === void 0 ? void 0 : _firstSubtabInternalR.focus();
45
+ }
46
+
47
+ if (e.key === 'ArrowUp') {
48
+ var _lastTabInternalRef$c;
49
+
50
+ e.preventDefault();
51
+ e.stopPropagation();
52
+ const canFocusCrossTabs = (firstSubtabInternalRef === null || firstSubtabInternalRef === void 0 ? void 0 : firstSubtabInternalRef.current) && (lastTabInternalRef === null || lastTabInternalRef === void 0 ? void 0 : lastTabInternalRef.current);
53
+ if (canFocusCrossTabs) (_lastTabInternalRef$c = lastTabInternalRef.current) === null || _lastTabInternalRef$c === void 0 ? void 0 : _lastTabInternalRef$c.focus();
54
+ }
55
+ }, [firstSubtabInternalRef, lastTabInternalRef, focusableTabsRef]);
56
+ return {
57
+ handleOnKeyDown
58
+ };
59
+ };
60
+
61
+ exports.useKeyboardNavigation = useKeyboardNavigation;
@@ -0,0 +1,41 @@
1
+ 'use strict';
2
+
3
+ Object.defineProperty(exports, '__esModule', { value: true });
4
+
5
+ var React = require('react');
6
+ var helpers = require('../helpers.js');
7
+ var DSTabsCTX = require('../../DSTabsCTX.js');
8
+
9
+ const useTabsCallbacks = () => {
10
+ const {
11
+ setInternalActiveTab,
12
+ tabsListRef,
13
+ props: {
14
+ onTabChange,
15
+ isDSMobile,
16
+ allowTextSelection,
17
+ fixedTabsHeaders
18
+ }
19
+ } = React.useContext(DSTabsCTX.DSTabsContext);
20
+ const handleOnTabChange = React.useCallback((tabId, e) => {
21
+ setInternalActiveTab(tabId);
22
+ onTabChange(tabId, e);
23
+
24
+ if (isDSMobile && !fixedTabsHeaders && e) {
25
+ helpers.centerTab({
26
+ e,
27
+ listRef: tabsListRef
28
+ });
29
+ }
30
+ }, [fixedTabsHeaders, isDSMobile, onTabChange, setInternalActiveTab, tabsListRef]);
31
+ const handleOnMouseDown = React.useCallback(e => {
32
+ const role = e.target.getAttribute('role');
33
+ if (role !== 'tabpanel' && allowTextSelection) e.stopPropagation();
34
+ }, [allowTextSelection]);
35
+ return {
36
+ handleOnTabChange,
37
+ handleOnMouseDown
38
+ };
39
+ };
40
+
41
+ exports.useTabsCallbacks = useTabsCallbacks;
package/esm/DSTabs.js ADDED
@@ -0,0 +1,35 @@
1
+ import _jsx from '@babel/runtime/helpers/esm/jsx';
2
+ import { describe } from 'react-desc';
3
+ import { tabsPropTypes } from './propTypes.js';
4
+ import { DSTabsContext, DSTabsCrossRefContext } from './DSTabsCTX.js';
5
+ import { TabsContent } from './parts/tabsContent/TabsContent.js';
6
+ import { useTabs } from './config/useTabs.js';
7
+ import { useCrossRef } from './config/useCrossRef.js';
8
+ import { TabTypes } from './utils/constants.js';
9
+
10
+ var _TabsContent, _TabsContent2;
11
+
12
+ const DSTabs = props => {
13
+ const ctx = useTabs(props);
14
+ const crossRefsCtx = useCrossRef();
15
+ const {
16
+ type
17
+ } = props;
18
+
19
+ if (type === TabTypes.SUBTABS) {
20
+ return /*#__PURE__*/_jsx(DSTabsContext.Provider, {
21
+ value: ctx
22
+ }, void 0, _TabsContent || (_TabsContent = /*#__PURE__*/_jsx(TabsContent, {})));
23
+ }
24
+
25
+ return /*#__PURE__*/_jsx(DSTabsCrossRefContext.Provider, {
26
+ value: crossRefsCtx
27
+ }, void 0, /*#__PURE__*/_jsx(DSTabsContext.Provider, {
28
+ value: ctx
29
+ }, void 0, _TabsContent2 || (_TabsContent2 = /*#__PURE__*/_jsx(TabsContent, {}))));
30
+ };
31
+
32
+ const DSTabsWithSchema = describe(DSTabs);
33
+ DSTabsWithSchema.propTypes = tabsPropTypes;
34
+
35
+ export { DSTabs, DSTabsWithSchema, DSTabs as default };
@@ -0,0 +1,25 @@
1
+ import { createContext, createRef } from 'react';
2
+ import { tabsDefaultProps } from './defaultProps.js';
3
+
4
+ // eslint-disable-next-line @typescript-eslint/no-empty-function
5
+ const noop = () => {};
6
+
7
+ const defaultContext = {
8
+ props: tabsDefaultProps,
9
+ tabsRef: /*#__PURE__*/createRef(),
10
+ tabsListRef: /*#__PURE__*/createRef(),
11
+ carouselOnlyListRef: /*#__PURE__*/createRef(),
12
+ focusableTabsRef: /*#__PURE__*/createRef(),
13
+ tabsRefAsArray: /*#__PURE__*/createRef(),
14
+ actualActiveTabRef: /*#__PURE__*/createRef(),
15
+ setInternalActiveTab: noop,
16
+ actualActiveTab: ''
17
+ };
18
+ const defaultCrossRefsContext = {
19
+ lastTabInternalRef: /*#__PURE__*/createRef(),
20
+ firstSubtabInternalRef: /*#__PURE__*/createRef()
21
+ };
22
+ const DSTabsContext = /*#__PURE__*/createContext(defaultContext);
23
+ const DSTabsCrossRefContext = /*#__PURE__*/createContext(defaultCrossRefsContext);
24
+
25
+ export { DSTabsContext, DSTabsCrossRefContext };
@@ -0,0 +1,14 @@
1
+ const DSTabsDatatestid = {
2
+ TABS_CONTAINER: 'ds-tabs-container',
3
+ TAB_BUTTON: 'ds-tabs-tab-button',
4
+ SUBTAB_BUTTON: 'ds-tabs-subtab-button',
5
+ TAB_PANEL: 'ds-tabs-tab-panel',
6
+ SUB_TAB_LIST: 'subtabs-list',
7
+ TAB_LIST: 'tab-list',
8
+ CAROUSEL: {
9
+ BUTTON_RIGHT: 'chevron-right',
10
+ BUTTON_LEFT: 'chevron-left'
11
+ }
12
+ };
13
+
14
+ export { DSTabsDatatestid };
@@ -0,0 +1 @@
1
+
@@ -1,5 +1,5 @@
1
- import * as React from "react";
2
- import { useRef, useMemo } from "react";
1
+ import { useRef, useMemo } from 'react';
2
+
3
3
  const useCrossRef = () => {
4
4
  const firstSubtabInternalRef = useRef();
5
5
  const lastTabInternalRef = useRef();
@@ -9,7 +9,5 @@ const useCrossRef = () => {
9
9
  }), []);
10
10
  return ctx;
11
11
  };
12
- export {
13
- useCrossRef
14
- };
15
- //# sourceMappingURL=useCrossRef.js.map
12
+
13
+ export { useCrossRef };
@@ -0,0 +1,47 @@
1
+ import 'core-js/modules/web.dom-collections.iterator.js';
2
+ import 'core-js/modules/esnext.async-iterator.find.js';
3
+ import 'core-js/modules/esnext.iterator.constructor.js';
4
+ import 'core-js/modules/esnext.iterator.find.js';
5
+ import { useRef, useState, useMemo, useEffect } from 'react';
6
+ import { useMemoMergePropsWithDefault } from '@elliemae/ds-props-helpers';
7
+ import { tabsDefaultProps } from '../defaultProps.js';
8
+
9
+ const useTabs = props => {
10
+ var _children$, _children$$props;
11
+
12
+ const propsWithDefaults = useMemoMergePropsWithDefault(props, tabsDefaultProps);
13
+ const {
14
+ activeTab,
15
+ children
16
+ } = propsWithDefaults;
17
+ const tabsRef = useRef({});
18
+ const tabsRefAsArray = useRef([]);
19
+ const focusableTabsRef = useRef([]);
20
+ const carouselOnlyListRef = useRef(null);
21
+ const tabsListRef = useRef(null);
22
+ const actualActiveTabRef = useRef(null);
23
+ const [internalActiveTab, setInternalActiveTab] = useState(children === null || children === void 0 ? void 0 : (_children$ = children[0]) === null || _children$ === void 0 ? void 0 : (_children$$props = _children$.props) === null || _children$$props === void 0 ? void 0 : _children$$props.tabId);
24
+ const actualActiveTab = useMemo(() => {
25
+ if (activeTab !== undefined) return activeTab;
26
+ return internalActiveTab;
27
+ }, [activeTab, internalActiveTab]);
28
+ useEffect(() => {
29
+ var _focusableTabsRef$cur;
30
+
31
+ actualActiveTabRef.current = (_focusableTabsRef$cur = focusableTabsRef.current.find(el => el.dataset.tabId === actualActiveTab)) !== null && _focusableTabsRef$cur !== void 0 ? _focusableTabsRef$cur : null;
32
+ }, [actualActiveTab]);
33
+ const ctx = useMemo(() => ({
34
+ props: propsWithDefaults,
35
+ tabsRef,
36
+ focusableTabsRef,
37
+ tabsListRef,
38
+ tabsRefAsArray,
39
+ setInternalActiveTab,
40
+ actualActiveTab,
41
+ actualActiveTabRef,
42
+ carouselOnlyListRef
43
+ }), [actualActiveTab, propsWithDefaults]);
44
+ return ctx;
45
+ };
46
+
47
+ export { useTabs };
@@ -1,14 +1,15 @@
1
- import * as React from "react";
2
- import { TabTypes } from "./utils/constants";
3
- const noop = () => {
4
- };
1
+ import { TabTypes } from './utils/constants.js';
2
+
3
+ // eslint-disable-next-line @typescript-eslint/no-empty-function
4
+ const noop = () => {};
5
+
5
6
  const tabsDefaultProps = {
6
7
  containerProps: {},
7
8
  animated: true,
8
9
  enableMouseEvents: false,
9
10
  allowTextSelection: false,
10
11
  onTabChange: noop,
11
- tabsListAriaLabel: "Tab list",
12
+ tabsListAriaLabel: 'Tab list',
12
13
  type: TabTypes.NORMAL,
13
14
  onlyRenderActiveTab: false,
14
15
  withCarousel: false,
@@ -18,7 +19,5 @@ const tabsDefaultProps = {
18
19
  fixedTabsHeaders: false,
19
20
  showSeparator: true
20
21
  };
21
- export {
22
- tabsDefaultProps
23
- };
24
- //# sourceMappingURL=defaultProps.js.map
22
+
23
+ export { tabsDefaultProps };
@@ -0,0 +1,21 @@
1
+ import 'core-js/modules/esnext.async-iterator.filter.js';
2
+ import 'core-js/modules/esnext.iterator.constructor.js';
3
+ import 'core-js/modules/esnext.iterator.filter.js';
4
+ import 'core-js/modules/esnext.async-iterator.for-each.js';
5
+ import 'core-js/modules/esnext.iterator.for-each.js';
6
+ import _defineProperty from '@babel/runtime/helpers/esm/defineProperty';
7
+ import React from 'react';
8
+ import { describe } from 'react-desc';
9
+ import { tabPropTypes } from '../propTypes.js';
10
+ import { jsx } from 'react/jsx-runtime';
11
+
12
+ function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); enumerableOnly && (symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; })), keys.push.apply(keys, symbols); } return keys; }
13
+
14
+ function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = null != arguments[i] ? arguments[i] : {}; i % 2 ? ownKeys(Object(source), !0).forEach(function (key) { _defineProperty(target, key, source[key]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)) : ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } return target; }
15
+
16
+ const DSTab = props => /*#__PURE__*/jsx(React.Fragment, _objectSpread({}, props));
17
+
18
+ const DSTabWithSchema = describe(DSTab);
19
+ DSTabWithSchema.propTypes = tabPropTypes;
20
+
21
+ export { DSTab, DSTabWithSchema, DSTab as default };
package/esm/index.js ADDED
@@ -0,0 +1,4 @@
1
+ export { DSTab, DSTabWithSchema } from './exportsRelated/DSTab.js';
2
+ export { DSTabs, DSTabsWithSchema } from './DSTabs.js';
3
+ export { TabTypes } from './utils/constants.js';
4
+ export { DSTabsDatatestid } from './DSTabsDatatestid.js';
@@ -0,0 +1,61 @@
1
+ import _jsx from '@babel/runtime/helpers/esm/jsx';
2
+ import { useContext } from 'react';
3
+ import { DSIconSizes } from '@elliemae/ds-icon';
4
+ import { BUTTON_TYPES } from '@elliemae/ds-button';
5
+ import { ChevronLeft, ChevronRight } from '@elliemae/ds-icons';
6
+ import { StyledCarouselWrapper, StyledCarouselButtonWrapper, StyledCarouselBtn, StyledChildrenWrap } from './styles.js';
7
+ import { useCarousel } from './useCarousel.js';
8
+ import { DSTabsContext } from '../../DSTabsCTX.js';
9
+ import { DSTabsDatatestid } from '../../DSTabsDatatestid.js';
10
+ import { jsx } from 'react/jsx-runtime';
11
+
12
+ const Carousel = _ref => {
13
+ let {
14
+ children,
15
+ updateIndicatorStyle
16
+ } = _ref;
17
+ const {
18
+ showChevrons,
19
+ leftButtonOnClick,
20
+ rightButtonOnClick,
21
+ handleOnClick,
22
+ handleOnScroll
23
+ } = useCarousel({
24
+ updateIndicatorStyle
25
+ });
26
+ const {
27
+ carouselOnlyListRef,
28
+ props: {
29
+ type
30
+ }
31
+ } = useContext(DSTabsContext);
32
+ return /*#__PURE__*/_jsx(StyledCarouselWrapper, {}, void 0, showChevrons.left && /*#__PURE__*/_jsx(StyledCarouselButtonWrapper, {
33
+ tabType: type
34
+ }, void 0, /*#__PURE__*/_jsx(StyledCarouselBtn, {
35
+ size: "s",
36
+ onClick: leftButtonOnClick,
37
+ tabIndex: -1,
38
+ "data-testid": DSTabsDatatestid.CAROUSEL.BUTTON_LEFT,
39
+ buttonType: BUTTON_TYPES.ICON
40
+ }, void 0, /*#__PURE__*/_jsx(ChevronLeft, {
41
+ size: DSIconSizes.S
42
+ }))), showChevrons.right && /*#__PURE__*/_jsx(StyledCarouselButtonWrapper, {
43
+ tabType: type,
44
+ right: showChevrons.right
45
+ }, void 0, /*#__PURE__*/_jsx(StyledCarouselBtn, {
46
+ size: "s",
47
+ onClick: rightButtonOnClick,
48
+ tabIndex: -1,
49
+ "data-testid": DSTabsDatatestid.CAROUSEL.BUTTON_RIGHT,
50
+ buttonType: BUTTON_TYPES.ICON
51
+ }, void 0, /*#__PURE__*/_jsx(ChevronRight, {
52
+ size: DSIconSizes.S
53
+ }))), /*#__PURE__*/jsx(StyledChildrenWrap, {
54
+ ref: carouselOnlyListRef,
55
+ onClick: handleOnClick,
56
+ onScroll: handleOnScroll,
57
+ children: children
58
+ }));
59
+ };
60
+
61
+ export { Carousel };
@@ -0,0 +1,54 @@
1
+ import styled from 'styled-components';
2
+ import { DSButtonV2 } from '@elliemae/ds-button';
3
+ import { TabTypes } from '../../utils/constants.js';
4
+
5
+ const StyledCarouselBtn = /*#__PURE__*/styled(DSButtonV2).withConfig({
6
+ componentId: "sc-prv5a7-0"
7
+ })(["margin:0;min-width:", ";width:", ";&:hover:not(:disabled){background-color:transparent;}background-color:transparent;border-radius:0px;& .em-ds-icon svg{fill:", ";}"], _ref => {
8
+ let {
9
+ theme
10
+ } = _ref;
11
+ return theme.space.xs;
12
+ }, _ref2 => {
13
+ let {
14
+ theme
15
+ } = _ref2;
16
+ return theme.space.xs;
17
+ }, _ref3 => {
18
+ let {
19
+ theme
20
+ } = _ref3;
21
+ return theme.colors.brand[600];
22
+ });
23
+ const StyledCarouselWrapper = /*#__PURE__*/styled.span.withConfig({
24
+ componentId: "sc-prv5a7-1"
25
+ })(["position:relative;width:100%;display:flex;"]);
26
+ const StyledChildrenWrap = /*#__PURE__*/styled.div.withConfig({
27
+ componentId: "sc-prv5a7-2"
28
+ })(["display:flex;flex-wrap:nowrap;flex:1;overflow-x:hidden;"]);
29
+ const StyledCarouselButtonWrapper = /*#__PURE__*/styled.div.withConfig({
30
+ componentId: "sc-prv5a7-3"
31
+ })(["max-width:16px;position:absolute;z-index:200;", " width:16px;height:", ";padding-top:", ";background:white;", ";"], _ref4 => {
32
+ let {
33
+ right
34
+ } = _ref4;
35
+ return right ? 'right: 0;' : "left: 0;";
36
+ }, _ref5 => {
37
+ let {
38
+ tabType
39
+ } = _ref5;
40
+ return tabType === TabTypes.NORMAL ? '32px' : '22px';
41
+ }, _ref6 => {
42
+ let {
43
+ tabType
44
+ } = _ref6;
45
+ return tabType === TabTypes.NORMAL ? '5px' : '0px';
46
+ }, _ref7 => {
47
+ let {
48
+ theme,
49
+ tabType
50
+ } = _ref7;
51
+ return tabType === TabTypes.NORMAL ? "\n background: linear-gradient(to bottom, white 0px, white 30px, ".concat(theme.colors.neutral[400], " 30px, ").concat(theme.colors.neutral[400], " 31px, white 31px , white 32px );\n ") : "";
52
+ });
53
+
54
+ export { StyledCarouselBtn, StyledCarouselButtonWrapper, StyledCarouselWrapper, StyledChildrenWrap };
@@ -1,20 +1,34 @@
1
- import * as React from "react";
2
- import { useCallback, useState, useContext } from "react";
3
- import useResizeObserver from "@react-hook/resize-observer";
4
- import { DSTabsContext } from "../../DSTabsCTX";
5
- import { isElementVisibleCarousel } from "../../utils/helpers";
6
- import { useCarouselCallbacks } from "./useCarouselCallbacks";
7
- const useCarousel = ({ updateIndicatorStyle }) => {
8
- const { carouselOnlyListRef } = useContext(DSTabsContext);
1
+ import 'core-js/modules/web.dom-collections.iterator.js';
2
+ import 'core-js/modules/esnext.async-iterator.reduce.js';
3
+ import 'core-js/modules/esnext.iterator.constructor.js';
4
+ import 'core-js/modules/esnext.iterator.reduce.js';
5
+ import { useContext, useState, useCallback } from 'react';
6
+ import useResizeObserver from '@react-hook/resize-observer';
7
+ import { DSTabsContext } from '../../DSTabsCTX.js';
8
+ import { isElementVisibleCarousel } from '../../utils/helpers.js';
9
+ import { useCarouselCallbacks } from './useCarouselCallbacks.js';
10
+
11
+ const useCarousel = _ref => {
12
+ let {
13
+ updateIndicatorStyle
14
+ } = _ref;
15
+ const {
16
+ carouselOnlyListRef
17
+ } = useContext(DSTabsContext);
9
18
  const [showChevrons, setShowChevrons] = useState({
10
19
  right: false,
11
20
  left: false
12
21
  });
13
- const { tabsRefAsArray } = useContext(DSTabsContext);
22
+ const {
23
+ tabsRefAsArray
24
+ } = useContext(DSTabsContext);
14
25
  const shouldShowLeft = useCallback(() => carouselOnlyListRef.current ? carouselOnlyListRef.current.scrollLeft > 0 : false, [carouselOnlyListRef]);
15
26
  const shouldShowRight = useCallback(() => carouselOnlyListRef.current ? carouselOnlyListRef.current.scrollLeft < carouselOnlyListRef.current.scrollWidth - carouselOnlyListRef.current.clientWidth : false, [carouselOnlyListRef]);
16
27
  const recalcChevrons = useCallback(() => {
17
- setShowChevrons({ right: shouldShowRight(), left: shouldShowLeft() });
28
+ setShowChevrons({
29
+ right: shouldShowRight(),
30
+ left: shouldShowLeft()
31
+ });
18
32
  }, [shouldShowLeft, shouldShowRight]);
19
33
  const getVisibleItemsOffset = useCallback(() => {
20
34
  if (tabsRefAsArray.current) {
@@ -25,14 +39,21 @@ const useCarousel = ({ updateIndicatorStyle }) => {
25
39
  const margin = parseFloat(styles.marginLeft) + parseFloat(styles.marginRight);
26
40
  return acc + (width + margin);
27
41
  }
42
+
28
43
  return acc;
29
44
  }, 0);
30
45
  return scroll - 16;
31
46
  }
47
+
32
48
  return 0;
33
49
  }, [tabsRefAsArray, carouselOnlyListRef]);
34
50
  useResizeObserver(carouselOnlyListRef, recalcChevrons);
35
- const { leftButtonOnClick, rightButtonOnClick, handleOnClick, handleOnScroll } = useCarouselCallbacks({
51
+ const {
52
+ leftButtonOnClick,
53
+ rightButtonOnClick,
54
+ handleOnClick,
55
+ handleOnScroll
56
+ } = useCarouselCallbacks({
36
57
  getVisibleItemsOffset,
37
58
  recalcChevrons,
38
59
  updateIndicatorStyle
@@ -45,7 +66,5 @@ const useCarousel = ({ updateIndicatorStyle }) => {
45
66
  handleOnScroll
46
67
  };
47
68
  };
48
- export {
49
- useCarousel
50
- };
51
- //# sourceMappingURL=useCarousel.js.map
69
+
70
+ export { useCarousel };