@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
@@ -1,13 +1,18 @@
1
- import * as React from "react";
2
- import { useCallback, useContext } from "react";
3
- import { isElementVisibleCarousel } from "../../utils/helpers";
4
- import { DSTabsContext } from "../../DSTabsCTX";
5
- const useCarouselCallbacks = ({
6
- getVisibleItemsOffset,
7
- updateIndicatorStyle,
8
- recalcChevrons
9
- }) => {
10
- const { focusableTabsRef, carouselOnlyListRef } = useContext(DSTabsContext);
1
+ import { useContext, useCallback } from 'react';
2
+ import { isElementVisibleCarousel } from '../../utils/helpers.js';
3
+ import { DSTabsContext } from '../../DSTabsCTX.js';
4
+
5
+ /* eslint-disable max-statements */
6
+ const useCarouselCallbacks = _ref => {
7
+ let {
8
+ getVisibleItemsOffset,
9
+ updateIndicatorStyle,
10
+ recalcChevrons
11
+ } = _ref;
12
+ const {
13
+ focusableTabsRef,
14
+ carouselOnlyListRef
15
+ } = useContext(DSTabsContext);
11
16
  const rightButtonOnClick = useCallback(() => {
12
17
  if (carouselOnlyListRef.current) {
13
18
  carouselOnlyListRef.current.scrollLeft += getVisibleItemsOffset();
@@ -20,25 +25,30 @@ const useCarouselCallbacks = ({
20
25
  }, [getVisibleItemsOffset, carouselOnlyListRef]);
21
26
  const handleOnScroll = useCallback(() => {
22
27
  recalcChevrons();
23
- if (updateIndicatorStyle)
24
- updateIndicatorStyle();
28
+ if (updateIndicatorStyle) updateIndicatorStyle();
25
29
  }, [recalcChevrons, updateIndicatorStyle]);
26
- const handleOnClick = useCallback(({ target }) => {
27
- if (focusableTabsRef.current && target.getAttribute("role") === "tab") {
30
+ const handleOnClick = useCallback(_ref2 => {
31
+ let {
32
+ target
33
+ } = _ref2;
34
+
35
+ if (focusableTabsRef.current && target.getAttribute('role') === 'tab') {
28
36
  const tabList = carouselOnlyListRef.current;
29
37
  const tabButton = target;
30
38
  const tabButtonDimensions = tabButton.getBoundingClientRect();
31
- const tabListDimensions = tabList?.getBoundingClientRect();
39
+ const tabListDimensions = tabList === null || tabList === void 0 ? void 0 : tabList.getBoundingClientRect();
32
40
  const tabButtonIndex = tabButton.dataset.index;
33
41
  const lastItemIndex = focusableTabsRef.current.length.toString();
34
42
  const magicNumber = 34;
35
- const firstOrLastItem = tabButtonIndex === "0" || tabButtonIndex === lastItemIndex;
43
+ const firstOrLastItem = tabButtonIndex === '0' || tabButtonIndex === lastItemIndex;
44
+
36
45
  if (!isElementVisibleCarousel(tabButton, tabList, firstOrLastItem) && tabListDimensions && carouselOnlyListRef.current) {
37
46
  const containerWidth = tabListDimensions.width;
38
47
  const halfContainer = containerWidth / 2;
39
48
  const elementScrollPosition = tabButtonDimensions.left - tabListDimensions.left;
40
49
  const positionInContainer = elementScrollPosition % containerWidth;
41
50
  const width = tabButton.offsetWidth + magicNumber;
51
+
42
52
  if (positionInContainer > halfContainer) {
43
53
  carouselOnlyListRef.current.scrollLeft += width + positionInContainer - containerWidth;
44
54
  } else {
@@ -54,7 +64,5 @@ const useCarouselCallbacks = ({
54
64
  handleOnScroll
55
65
  };
56
66
  };
57
- export {
58
- useCarouselCallbacks
59
- };
60
- //# sourceMappingURL=useCarouselCallbacks.js.map
67
+
68
+ export { useCarouselCallbacks };
@@ -0,0 +1,159 @@
1
+ import _jsx from '@babel/runtime/helpers/esm/jsx';
2
+ import 'core-js/modules/esnext.async-iterator.map.js';
3
+ import 'core-js/modules/esnext.iterator.map.js';
4
+ import React, { useContext, useMemo } from 'react';
5
+ import { Carousel } from '../carousel/Carousel.js';
6
+ import { useTabBar } from './useTabBar.js';
7
+ import { StyledTabButton, StyledRequiredMark, StyledSubTabsList, StyledTabList, StyledTabWrapper, StyledSelectionIndicator } from './styles.js';
8
+ import { DSTabsContext, DSTabsCrossRefContext } from '../../DSTabsCTX.js';
9
+ import { useKeyboardNavigation } from '../../utils/hooks/useKeyboardNavigation.js';
10
+ import { centerTab } from '../../utils/helpers.js';
11
+ import { TabTypes } from '../../utils/constants.js';
12
+ import { useTabsCallbacks } from '../../utils/hooks/useTabsCallbacks.js';
13
+ import { DSTabsDatatestid } from '../../DSTabsDatatestid.js';
14
+ import { jsxs, jsx } from 'react/jsx-runtime';
15
+
16
+ var _StyledRequiredMark;
17
+ const TabBar = () => {
18
+ const {
19
+ tabsRef,
20
+ focusableTabsRef,
21
+ tabsListRef,
22
+ tabsRefAsArray,
23
+ carouselOnlyListRef,
24
+ actualActiveTab,
25
+ props: {
26
+ type,
27
+ fixedTabsHeaders,
28
+ withCarousel,
29
+ isDSMobile,
30
+ showSeparator,
31
+ children: tabs
32
+ }
33
+ } = useContext(DSTabsContext);
34
+ const {
35
+ lastTabInternalRef,
36
+ firstSubtabInternalRef
37
+ } = useContext(DSTabsCrossRefContext);
38
+ const {
39
+ handleOnTabChange
40
+ } = useTabsCallbacks();
41
+ const {
42
+ handleOnKeyDown
43
+ } = useKeyboardNavigation();
44
+ const {
45
+ indicatorStyle,
46
+ mobileGradients,
47
+ updateMobileGradients,
48
+ updateIndicatorStyle
49
+ } = useTabBar();
50
+ const renderTabs = useMemo(() => {
51
+ const availableTabIndexes = [];
52
+ return React.Children.map(tabs, (tab, index) => {
53
+ const {
54
+ tabId = '',
55
+ title = '',
56
+ style,
57
+ required = false,
58
+ disabled = false,
59
+ ref,
60
+ onClick,
61
+ onKeyDown
62
+ } = tab.props;
63
+ if (!disabled) availableTabIndexes.push(index);
64
+ return /*#__PURE__*/jsxs(StyledTabButton, {
65
+ role: "tab",
66
+ ref: t => {
67
+ if (tabsRefAsArray.current && focusableTabsRef.current && tabsRef.current) {
68
+ tabsRefAsArray.current[index] = t;
69
+ if (!disabled && !focusableTabsRef.current.includes(t)) focusableTabsRef.current.push(t);
70
+ tabsRef.current[index] = t;
71
+
72
+ if (type === TabTypes.SUBTABS && firstSubtabInternalRef && index === availableTabIndexes[0]) {
73
+ firstSubtabInternalRef.current = t;
74
+ }
75
+
76
+ if (type !== TabTypes.SUBTABS && index === availableTabIndexes[availableTabIndexes.length - 1]) {
77
+ lastTabInternalRef.current = t;
78
+ }
79
+
80
+ if (ref) ref.current = t;
81
+ }
82
+ },
83
+ type: "button",
84
+ "aria-controls": tabId,
85
+ "aria-selected": actualActiveTab === tabId,
86
+ "aria-disabled": disabled,
87
+ "aria-labelledby": "".concat(tabId, "-label"),
88
+ isDSMobile: isDSMobile,
89
+ fixedTabsHeaders: fixedTabsHeaders,
90
+ tabType: type,
91
+ title: title,
92
+ "data-required": required,
93
+ "data-tab-id": tabId,
94
+ "data-index": index,
95
+ withCarousel: withCarousel,
96
+ isActive: actualActiveTab === tabId,
97
+ disabled: disabled,
98
+ showSeparator: showSeparator && type !== TabTypes.NORMAL,
99
+ "data-testid": type === TabTypes.NORMAL ? DSTabsDatatestid.TAB_BUTTON : DSTabsDatatestid.SUBTAB_BUTTON,
100
+ id: "".concat(tabId, "-label"),
101
+ onClick: e => {
102
+ if (!disabled) {
103
+ handleOnTabChange(tabId, e);
104
+ updateIndicatorStyle();
105
+ }
106
+
107
+ if (onClick && !disabled) onClick(tabId, e);
108
+ },
109
+ onFocus: e => {
110
+ if (withCarousel) centerTab({
111
+ e,
112
+ listRef: carouselOnlyListRef
113
+ });
114
+ },
115
+ onKeyDown: e => {
116
+ if (e.key === 'Enter') e.stopPropagation();
117
+ if (!disabled) handleOnKeyDown(e);
118
+ if (onKeyDown && !disabled) onKeyDown(e);
119
+ },
120
+ style: style,
121
+ children: [title, required && (_StyledRequiredMark || (_StyledRequiredMark = /*#__PURE__*/_jsx(StyledRequiredMark, {}, void 0, "\u25CF")))]
122
+ }, tabId);
123
+ });
124
+ }, [tabs, actualActiveTab, isDSMobile, fixedTabsHeaders, type, withCarousel, showSeparator, tabsRefAsArray, focusableTabsRef, tabsRef, firstSubtabInternalRef, lastTabInternalRef, handleOnTabChange, updateIndicatorStyle, carouselOnlyListRef, handleOnKeyDown]);
125
+
126
+ if (type === TabTypes.SUBTABS && !isDSMobile) {
127
+ return /*#__PURE__*/jsx(StyledSubTabsList, {
128
+ withCarousel: withCarousel,
129
+ "data-testid": DSTabsDatatestid.SUB_TAB_LIST,
130
+ ref: tabsListRef,
131
+ role: "tablist",
132
+ children: withCarousel ? /*#__PURE__*/_jsx(Carousel, {}, void 0, renderTabs) : renderTabs
133
+ });
134
+ }
135
+
136
+ return /*#__PURE__*/jsxs(StyledTabList, {
137
+ withCarousel: withCarousel,
138
+ ref: tabsListRef,
139
+ role: "tablist",
140
+ "data-testid": DSTabsDatatestid.TAB_LIST,
141
+ isDSMobile: isDSMobile,
142
+ fixedTabsHeaders: fixedTabsHeaders,
143
+ mobileGradients: mobileGradients,
144
+ onScroll: updateMobileGradients,
145
+ indicatorStyle: indicatorStyle,
146
+ tabType: type,
147
+ children: [/*#__PURE__*/_jsx(StyledTabWrapper, {
148
+ isDSMobile: isDSMobile,
149
+ fixedTabsHeaders: fixedTabsHeaders
150
+ }, void 0, !isDSMobile && withCarousel ? /*#__PURE__*/_jsx(Carousel, {
151
+ updateIndicatorStyle: updateIndicatorStyle
152
+ }, void 0, renderTabs) : renderTabs), /*#__PURE__*/_jsx(StyledSelectionIndicator, {
153
+ isDSMobile: isDSMobile,
154
+ tabType: type
155
+ })]
156
+ });
157
+ };
158
+
159
+ export { TabBar };
@@ -0,0 +1,186 @@
1
+ import _taggedTemplateLiteral from '@babel/runtime/helpers/esm/taggedTemplateLiteral';
2
+ import styled from 'styled-components';
3
+ import { css, onlySafariAndFirefox, safariAndFirefoxBold } from '@elliemae/ds-system';
4
+ import { TabTypes } from '../../utils/constants.js';
5
+
6
+ var _templateObject;
7
+ const StyledSelectionIndicator = /*#__PURE__*/styled.div.withConfig({
8
+ componentId: "sc-3hla56-0"
9
+ })(["position:absolute;height:3px;top:", ";margin-top:", ";pointer-events:none;transition:200ms cubic-bezier(0.36,0,1,1);z-index:10;", ""], _ref => {
10
+ let {
11
+ tabType,
12
+ isDSMobile
13
+ } = _ref;
14
+ if (isDSMobile) return "35px";
15
+ if (tabType === TabTypes.NORMAL_SMALL) return "15px";
16
+ return "25px";
17
+ }, _ref2 => {
18
+ let {
19
+ theme
20
+ } = _ref2;
21
+ return theme.space.xxxs;
22
+ }, _ref3 => {
23
+ let {
24
+ isDSMobile
25
+ } = _ref3;
26
+ return isDSMobile ? " \n margin-left: 0;\n margin-top: 3px;\n " : "";
27
+ });
28
+ const mobileGradientsSettings = css(_templateObject || (_templateObject = _taggedTemplateLiteral(["\n ", "\n"])), _ref4 => {
29
+ let {
30
+ theme,
31
+ mobileGradients,
32
+ isDSMobile,
33
+ fixedTabsHeaders
34
+ } = _ref4;
35
+
36
+ if (isDSMobile && !fixedTabsHeaders) {
37
+ if (mobileGradients.right && mobileGradients.left) return "background: linear-gradient(90deg, rgba(238,238,238,0) 0%, ".concat(theme.colors.brand[200], " 20%, ").concat(theme.colors.brand[200], " 80%, rgba(238,238,238,0) 100%);");
38
+ if (mobileGradients.right) return "background: linear-gradient(90deg, ".concat(theme.colors.brand[200], " 0%, ").concat(theme.colors.brand[200], " 80%, rgba(238,238,238,0) 100%);");
39
+ if (mobileGradients.left) return "background: linear-gradient(90deg, rgba(238,238,238,0) 0%, ".concat(theme.colors.brand[200], " 20%, ").concat(theme.colors.brand[200], " 100%);");
40
+ }
41
+
42
+ return "";
43
+ });
44
+ const StyledTabWrapper = /*#__PURE__*/styled.div.withConfig({
45
+ componentId: "sc-3hla56-1"
46
+ })(["display:flex;flex:1;flex-wrap:nowrap;", " ", ""], _ref5 => {
47
+ let {
48
+ fixedTabsHeaders,
49
+ isDSMobile
50
+ } = _ref5;
51
+ return !fixedTabsHeaders && isDSMobile ? '' : 'overflow-x: hidden;';
52
+ }, _ref6 => {
53
+ let {
54
+ theme,
55
+ isDSMobile
56
+ } = _ref6;
57
+ return isDSMobile ? "border-bottom: 1px solid ".concat(theme.colors.brand[300], ";") : "";
58
+ });
59
+ const StyledTabButton = /*#__PURE__*/styled.button.withConfig({
60
+ componentId: "sc-3hla56-2"
61
+ })(["position:relative;background-color:transparent;border:none;cursor:pointer;transition:100ms cubic-bezier(0,0,0.42,1);text-transform:", ";letter-spacing:0px;white-space:nowrap;padding:2px 0;margin-right:", ";margin-left:", ";color:", ";", " ", " ", " ", " ", " ", " ", ""], _ref7 => {
62
+ let {
63
+ tabType
64
+ } = _ref7;
65
+ return tabType === TabTypes.SUBTABS ? "capitalize" : "uppercase";
66
+ }, _ref8 => {
67
+ let {
68
+ fixedTabsHeaders,
69
+ isDSMobile
70
+ } = _ref8;
71
+ if (fixedTabsHeaders) return '0px';
72
+ if (!fixedTabsHeaders && isDSMobile) return '14px';
73
+ return '16px';
74
+ }, _ref9 => {
75
+ let {
76
+ fixedTabsHeaders,
77
+ isDSMobile
78
+ } = _ref9;
79
+ if (fixedTabsHeaders) return '0px';
80
+ if (!fixedTabsHeaders && isDSMobile) return '14px';
81
+ return '16px';
82
+ }, _ref10 => {
83
+ let {
84
+ theme
85
+ } = _ref10;
86
+ return theme.colors.neutral[700];
87
+ }, onlySafariAndFirefox('-webkit-text-stroke: 0.4px transparent;'), _ref11 => {
88
+ let {
89
+ tabType
90
+ } = _ref11;
91
+ return tabType === TabTypes.NORMAL ? "height: 32px;" : "height: 22px;";
92
+ }, _ref12 => {
93
+ let {
94
+ theme,
95
+ isActive,
96
+ disabled
97
+ } = _ref12;
98
+ return isActive && !disabled ? "\n font-weight: ".concat(theme.fontWeights.semibold, ";\n ").concat(safariAndFirefoxBold("#353C46"), "\n\n &:hover {\n ").concat(safariAndFirefoxBold("#1E79C2"), "\n }\n \n ") : "\n \n ";
99
+ }, _ref13 => {
100
+ let {
101
+ theme,
102
+ disabled
103
+ } = _ref13;
104
+ return disabled ? "\n color: ".concat(theme.colors.neutral[500], ";\n cursor: not-allowed;\n ") : "\n &:hover {\n color: ".concat(theme.colors.brand[600], ";\n }\n ");
105
+ }, _ref14 => {
106
+ let {
107
+ theme,
108
+ showSeparator,
109
+ tabType
110
+ } = _ref14;
111
+ return showSeparator ? "\n &:not(:last-of-type):before\n {\n content: \"\";\n position: absolute;\n width: 1px;\n right: -16px;\n top: 50%;\n transform: translateY(-50%);\n height: ".concat(tabType === TabTypes.SUBTABS ? "10px" : "16px", ";\n background: ").concat(theme.colors.neutral[400], ";\n }") : "";
112
+ }, _ref15 => {
113
+ let {
114
+ theme,
115
+ isDSMobile,
116
+ tabType,
117
+ isActive
118
+ } = _ref15;
119
+ return !isDSMobile ? "\n &:focus {\n outline: none;\n &:after {\n position: absolute;\n content: '';\n top: 0;\n left: -16px;\n width: calc(100% + 32px);\n height: 100%;\n z-index: 5;\n border-radius: 2px;\n border: 2px solid ".concat(theme.colors.brand[700], ";\n }\n\n ").concat(tabType !== TabTypes.SUBTABS && isActive ? "\n &:before {\n position: absolute;\n content: '';\n left: -16px;\n right: 0;\n top: calc(100% - 2px);\n transform: none;\n width: calc(100% + 32px);\n height: 2px;\n z-index: 10;\n background: linear-gradient(to right, transparent 0px, transparent 12px, white 12px, white 16px, transparent 16px,transparent calc(100% - 16px), white calc(100% - 16px), white calc(100% - 12px), transparent calc(100% - 12px), transparent 100%);\n }\n " : "", "\n }\n \n ") : "";
120
+ }, _ref16 => {
121
+ let {
122
+ theme,
123
+ isActive,
124
+ disabled,
125
+ isDSMobile
126
+ } = _ref16;
127
+ return isDSMobile ? "\n height: 40px;\n color: ".concat(theme.colors.brand[600], ";\n font-weight: ").concat(theme.fontWeights.regular, ";\n padding: 0;\n font-size: 13px;\n line-height: 1.3;\n ").concat(onlySafariAndFirefox('-webkit-text-stroke: 0.4px transparent;'), " \n\n &:focus {\n font-weight: ").concat(theme.fontWeights.regular, ";\n font-size: 13px;\n ").concat(safariAndFirefoxBold('#006AA9'), "\n }\n\n ").concat(isActive ? "\n font-weight: ".concat(theme.fontWeights.regular, ";\n font-size: 13px;\n ").concat(safariAndFirefoxBold('#006AA9'), "\n ") : "", "\n\n ").concat(isActive && !disabled ? "\n font-size: 13px;\n color: ".concat(theme.colors.brand[700], ";\n line-height: 1.3;\n font-weight: ").concat(theme.fontWeights.regular, ";\n -webkit-font-smoothing: subpixel-antialiased; \n -webkit-text-stroke: 0.4px ").concat(theme.colors.brand[700], ";") : "", "\n\n ").concat(!disabled ? "\n &:hover,\n &:focus {\n outline: none;\n color: ".concat(theme.colors.brand[700], ";\n ").concat(safariAndFirefoxBold('#006AA9'), "\n }") : "", "\n\n ") : "";
128
+ });
129
+ const StyledSubTabsList = /*#__PURE__*/styled.div.withConfig({
130
+ componentId: "sc-3hla56-3"
131
+ })(["position:relative;display:flex;flex-wrap:nowrap;flex:1;width:100%;", ""], _ref17 => {
132
+ let {
133
+ withCarousel
134
+ } = _ref17;
135
+ return withCarousel ? 'max-width: 100%;' : '';
136
+ });
137
+ const StyledTabList = /*#__PURE__*/styled.div.withConfig({
138
+ componentId: "sc-3hla56-4"
139
+ })(["position:relative;display:flex;flex-wrap:nowrap;flex:1;width:100%;", " ", " ", "{padding-bottom:0;padding-top:0;}", " ", " ", " ", "{", "}", "{background:", ";}"], _ref18 => {
140
+ let {
141
+ withCarousel,
142
+ isDSMobile
143
+ } = _ref18;
144
+ return withCarousel && !isDSMobile ? "max-width: 100%;" : '';
145
+ }, _ref19 => {
146
+ let {
147
+ theme,
148
+ isDSMobile,
149
+ tabType
150
+ } = _ref19;
151
+ return tabType !== TabTypes.NORMAL_SMALL && !isDSMobile ? "\n &:after {\n content: '';\n position: absolute;\n width: 100%;\n height: 1px;\n box-shadow: 0px 0px 0px 1px ".concat(theme.colors.neutral[400], ";\n pointer-events: none;\n bottom: 0px;\n }\n ") : "";
152
+ }, StyledTabButton, _ref20 => {
153
+ let {
154
+ theme,
155
+ isDSMobile
156
+ } = _ref20;
157
+ return isDSMobile ? "\n \n background: ".concat(theme.colors.brand[200], ";") : "";
158
+ }, mobileGradientsSettings, _ref21 => {
159
+ let {
160
+ isDSMobile,
161
+ fixedTabsHeaders
162
+ } = _ref21;
163
+ return isDSMobile ? "\n ".concat(!fixedTabsHeaders ? "\n z-index: 0;\n overflow-x: auto;\n overflow-y: hidden;\n scrollbar-width: thin;\n &::-webkit-scrollbar {\n display: none;\n }" : "\n display: flex;\n ".concat(StyledTabButton, " {\n flex: 1;\n overflow-x: hidden;\n }")) : "";
164
+ }, StyledSelectionIndicator, _ref22 => {
165
+ let {
166
+ indicatorStyle
167
+ } = _ref22;
168
+ return "\n width: ".concat(indicatorStyle.width, ";\n left: ").concat(indicatorStyle.left, ";\n ");
169
+ }, StyledSelectionIndicator, _ref23 => {
170
+ let {
171
+ theme,
172
+ indicatorStyle,
173
+ isDSMobile
174
+ } = _ref23;
175
+ return !isDSMobile ? indicatorStyle.backgroundWithTransparent : theme.colors.brand[600];
176
+ });
177
+ const StyledRequiredMark = /*#__PURE__*/styled.span.withConfig({
178
+ componentId: "sc-3hla56-5"
179
+ })(["color:", ";font-size:6px;margin-left:2px;position:absolute;top:5px;"], _ref24 => {
180
+ let {
181
+ theme
182
+ } = _ref24;
183
+ return theme.colors.danger[900];
184
+ });
185
+
186
+ export { StyledRequiredMark, StyledSelectionIndicator, StyledSubTabsList, StyledTabButton, StyledTabList, StyledTabWrapper };
@@ -1,41 +1,57 @@
1
- import * as React from "react";
2
- import { useCallback, useLayoutEffect, useState, useContext } from "react";
3
- import useResizeObserver from "@react-hook/resize-observer";
4
- import { isElementVisible, shouldHaveLeftGradient, shouldHaveRightGradient } from "../../utils/helpers";
5
- import { DSTabsContext } from "../../DSTabsCTX";
6
- import { defaultIndicatorStyles } from "../../utils/constants";
1
+ import 'core-js/modules/web.dom-collections.iterator.js';
2
+ import { useContext, useState, useCallback, useLayoutEffect } from 'react';
3
+ import useResizeObserver from '@react-hook/resize-observer';
4
+ import { isElementVisible, shouldHaveLeftGradient, shouldHaveRightGradient } from '../../utils/helpers.js';
5
+ import { DSTabsContext } from '../../DSTabsCTX.js';
6
+ import { defaultIndicatorStyles } from '../../utils/constants.js';
7
+
7
8
  const useTabBar = () => {
8
9
  const {
9
10
  actualActiveTab,
10
11
  actualActiveTabRef,
11
12
  tabsListRef,
12
- props: { showSelectionIndicator, isDSMobile, fixedTabsHeaders }
13
+ props: {
14
+ showSelectionIndicator,
15
+ isDSMobile,
16
+ fixedTabsHeaders
17
+ }
13
18
  } = useContext(DSTabsContext);
14
- const [mobileGradients, setMobileGradients] = useState({ left: false, right: false });
19
+ const [mobileGradients, setMobileGradients] = useState({
20
+ left: false,
21
+ right: false
22
+ });
15
23
  const [indicatorStyle, setIndicatorStyle] = useState(defaultIndicatorStyles);
16
24
  const getIndicatorStyles = useCallback(() => {
17
25
  if (tabsListRef.current) {
18
26
  const tabList = tabsListRef.current;
19
27
  const activeTabButton = actualActiveTabRef.current;
20
- if (!activeTabButton || !isElementVisible(activeTabButton, tabList))
21
- return defaultIndicatorStyles;
28
+ if (!activeTabButton || !isElementVisible(activeTabButton, tabList)) return defaultIndicatorStyles; // The missingMargins are to make the selection indicator white marks work properly in desktop, we need
29
+ // the full width of the tab button with margins.
30
+
22
31
  const missingMargins = isDSMobile ? 0 : 16;
23
- const tabClientWidth = isDSMobile && !fixedTabsHeaders ? activeTabButton.clientWidth : activeTabButton.clientWidth + missingMargins * 2;
32
+ const tabClientWidth = isDSMobile && !fixedTabsHeaders ? activeTabButton.clientWidth : activeTabButton.clientWidth + missingMargins * 2; // The reason why we use the tabList.scrollLeft is due to the centerOnTabChange (only in Mobile and FlexibleTabs)
33
+ // behavior that adds scroll to the tabList
34
+
24
35
  const position = isDSMobile && !fixedTabsHeaders ? activeTabButton.getBoundingClientRect().left - tabList.getBoundingClientRect().left + tabList.scrollLeft : activeTabButton.getBoundingClientRect().left - tabList.getBoundingClientRect().left - missingMargins;
25
- const backgroundWithTransparent = `linear-gradient(to right, transparent 0px, transparent 16px, #1E79C2 16px, #1E79C2 ${tabClientWidth - 16}px,transparent ${tabClientWidth - 16}px,transparent ${tabClientWidth}px )`;
36
+ const backgroundWithTransparent = "linear-gradient(to right, transparent 0px, transparent 16px, #1E79C2 16px, #1E79C2 ".concat(tabClientWidth - 16, "px,transparent ").concat(tabClientWidth - 16, "px,transparent ").concat(tabClientWidth, "px )");
26
37
  return {
27
- left: `${position}px`,
28
- width: `${tabClientWidth}px`,
38
+ left: "".concat(position, "px"),
39
+ width: "".concat(tabClientWidth, "px"),
29
40
  backgroundWithTransparent
30
41
  };
31
42
  }
43
+
32
44
  return defaultIndicatorStyles;
33
45
  }, [actualActiveTabRef, fixedTabsHeaders, isDSMobile, tabsListRef]);
34
46
  const updateIndicatorStyle = useCallback(() => setTimeout(() => setIndicatorStyle(getIndicatorStyles()), 100), [getIndicatorStyles, setIndicatorStyle]);
35
47
  useResizeObserver(tabsListRef, updateIndicatorStyle);
36
48
  const updateMobileGradients = useCallback(() => {
37
49
  if (tabsListRef.current && isDSMobile && !fixedTabsHeaders) {
38
- const { scrollLeft, scrollWidth, clientWidth } = tabsListRef.current;
50
+ const {
51
+ scrollLeft,
52
+ scrollWidth,
53
+ clientWidth
54
+ } = tabsListRef.current;
39
55
  setMobileGradients({
40
56
  left: shouldHaveLeftGradient(scrollLeft),
41
57
  right: shouldHaveRightGradient(scrollLeft, clientWidth, scrollWidth)
@@ -46,17 +62,11 @@ const useTabBar = () => {
46
62
  if (showSelectionIndicator) {
47
63
  updateIndicatorStyle();
48
64
  }
65
+
49
66
  if (isDSMobile && !fixedTabsHeaders) {
50
67
  updateMobileGradients();
51
68
  }
52
- }, [
53
- updateMobileGradients,
54
- showSelectionIndicator,
55
- updateIndicatorStyle,
56
- isDSMobile,
57
- fixedTabsHeaders,
58
- actualActiveTab
59
- ]);
69
+ }, [updateMobileGradients, showSelectionIndicator, updateIndicatorStyle, isDSMobile, fixedTabsHeaders, actualActiveTab]);
60
70
  return {
61
71
  updateIndicatorStyle,
62
72
  setIndicatorStyle,
@@ -65,7 +75,5 @@ const useTabBar = () => {
65
75
  updateMobileGradients
66
76
  };
67
77
  };
68
- export {
69
- useTabBar
70
- };
71
- //# sourceMappingURL=useTabBar.js.map
78
+
79
+ export { useTabBar };
@@ -0,0 +1,40 @@
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 _jsx from '@babel/runtime/helpers/esm/jsx';
8
+ import { useContext } from 'react';
9
+ import { TabsPanels } from '../tabsPanel/TabsPanels.js';
10
+ import { TabBar } from '../tabBar/TabBar.js';
11
+ import { StyledTabBarContainer } from './styles.js';
12
+ import { DSTabsContext } from '../../DSTabsCTX.js';
13
+ import { DSTabsDatatestid } from '../../DSTabsDatatestid.js';
14
+ import { jsxs } from 'react/jsx-runtime';
15
+
16
+ var _TabBar, _TabsPanels;
17
+
18
+ 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; }
19
+
20
+ 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; }
21
+ const TabsContent = () => {
22
+ const {
23
+ props: {
24
+ containerProps,
25
+ innerRef,
26
+ tabsListAriaLabel,
27
+ tabBarExtraContent
28
+ }
29
+ } = useContext(DSTabsContext);
30
+ return /*#__PURE__*/jsxs("div", _objectSpread(_objectSpread({}, containerProps), {}, {
31
+ ref: innerRef,
32
+ "data-testid": DSTabsDatatestid.TABS_CONTAINER,
33
+ children: [/*#__PURE__*/_jsx(StyledTabBarContainer, {
34
+ "aria-label": tabsListAriaLabel,
35
+ role: "tablist"
36
+ }, void 0, _TabBar || (_TabBar = /*#__PURE__*/_jsx(TabBar, {})), tabBarExtraContent), _TabsPanels || (_TabsPanels = /*#__PURE__*/_jsx(TabsPanels, {}))]
37
+ }));
38
+ };
39
+
40
+ export { TabsContent };
@@ -0,0 +1,7 @@
1
+ import styled from 'styled-components';
2
+
3
+ const StyledTabBarContainer = /*#__PURE__*/styled.div.withConfig({
4
+ componentId: "sc-vm3k1y-0"
5
+ })(["display:flex;overflow-x:hidden;"]);
6
+
7
+ export { StyledTabBarContainer };
@@ -0,0 +1,67 @@
1
+ import _jsx from '@babel/runtime/helpers/esm/jsx';
2
+ import 'core-js/modules/esnext.async-iterator.map.js';
3
+ import 'core-js/modules/esnext.iterator.map.js';
4
+ import React, { useContext, useCallback, useMemo } from 'react';
5
+ import SwipeableViews from 'react-swipeable-views';
6
+ import { getIdByIndex, getIndexById } from '../../utils/helpers.js';
7
+ import { StyledPanelContainer } from './styles.js';
8
+ import { DSTabsContext } from '../../DSTabsCTX.js';
9
+ import { useTabsCallbacks } from '../../utils/hooks/useTabsCallbacks.js';
10
+ import { jsx, Fragment } from 'react/jsx-runtime';
11
+
12
+ const TabsPanels = () => {
13
+ const {
14
+ actualActiveTab,
15
+ focusableTabsRef,
16
+ props: {
17
+ animated,
18
+ enableMouseEvents,
19
+ onlyRenderActiveTab,
20
+ children: tabs,
21
+ isDSMobile
22
+ }
23
+ } = useContext(DSTabsContext);
24
+ const {
25
+ handleOnTabChange,
26
+ handleOnMouseDown
27
+ } = useTabsCallbacks();
28
+ const handleOnChangeIndex = useCallback(index => {
29
+ handleOnTabChange(getIdByIndex(tabs, index));
30
+ if (focusableTabsRef.current) focusableTabsRef.current[index].click();
31
+ }, [focusableTabsRef, handleOnTabChange, tabs]);
32
+ const panels = useMemo(() => React.Children.map(tabs, tab => {
33
+ const {
34
+ tabId: panelId = '',
35
+ style,
36
+ children: content
37
+ } = tab.props;
38
+ const isActive = actualActiveTab === panelId;
39
+ const shouldRender = !onlyRenderActiveTab || isActive;
40
+ return shouldRender && /*#__PURE__*/_jsx(StyledPanelContainer, {
41
+ id: panelId,
42
+ "aria-labelledby": "".concat(panelId, "-label"),
43
+ "aria-hidden": !isActive,
44
+ "data-panel-id": panelId,
45
+ "data-testid": "ds-tabs-tab-panel",
46
+ hidden: !isActive,
47
+ onMouseDown: handleOnMouseDown,
48
+ role: "tabpanel",
49
+ style: style,
50
+ isDSMobile: isDSMobile
51
+ }, panelId, content);
52
+ }), [actualActiveTab, handleOnMouseDown, isDSMobile, onlyRenderActiveTab, tabs]);
53
+
54
+ if (animated) {
55
+ return /*#__PURE__*/_jsx(SwipeableViews, {
56
+ enableMouseEvents: enableMouseEvents,
57
+ index: getIndexById(tabs, actualActiveTab),
58
+ onChangeIndex: handleOnChangeIndex
59
+ }, void 0, panels);
60
+ }
61
+
62
+ return /*#__PURE__*/jsx(Fragment, {
63
+ children: panels
64
+ });
65
+ };
66
+
67
+ export { TabsPanels };
@@ -0,0 +1,17 @@
1
+ import styled from 'styled-components';
2
+
3
+ const StyledPanelContainer = /*#__PURE__*/styled.div.withConfig({
4
+ componentId: "sc-oxw5jq-0"
5
+ })(["padding-top:8px;&:focus{outline:none;}", " ", ""], _ref => {
6
+ let {
7
+ hidden
8
+ } = _ref;
9
+ return hidden ? 'visibility: hidden;' : '';
10
+ }, _ref2 => {
11
+ let {
12
+ isDSMobile
13
+ } = _ref2;
14
+ return isDSMobile ? "padding-top: 0;" : "";
15
+ });
16
+
17
+ export { StyledPanelContainer };