@elliemae/ds-tabs 2.0.0-rc.12 → 2.0.0-rc.13

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 (105) hide show
  1. package/cjs/DSTabs.js +27 -108
  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/{PanelContainer.js → exportsRelated/DSTab.js} +14 -30
  9. package/cjs/index.js +5 -5
  10. package/cjs/parts/carousel/Carousel.js +71 -0
  11. package/cjs/parts/carousel/styles.js +60 -0
  12. package/cjs/parts/carousel/useCarousel.js +91 -0
  13. package/cjs/parts/carousel/useCarouselCallbacks.js +72 -0
  14. package/cjs/parts/tabBar/TabBar.js +160 -0
  15. package/cjs/parts/tabBar/styles.js +199 -0
  16. package/cjs/parts/tabBar/useTabBar.js +98 -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 +30 -0
  21. package/cjs/propTypes.js +33 -0
  22. package/cjs/utils/constants.js +29 -0
  23. package/cjs/utils/helpers.js +47 -0
  24. package/cjs/utils/hooks/useKeyboardNavigation.js +61 -0
  25. package/cjs/{useResize.js → utils/hooks/useResize.js} +8 -4
  26. package/cjs/utils/hooks/useTabsCallbacks.js +59 -0
  27. package/esm/DSTabs.js +29 -110
  28. package/esm/DSTabsCTX.js +25 -0
  29. package/esm/DSTabsDatatestid.js +14 -0
  30. package/esm/DSTabsTypes.js +1 -0
  31. package/esm/config/useCrossRef.js +13 -0
  32. package/esm/config/useTabs.js +47 -0
  33. package/esm/defaultProps.js +23 -0
  34. package/esm/{PanelContainer.js → exportsRelated/DSTab.js} +7 -26
  35. package/esm/index.js +4 -3
  36. package/esm/parts/carousel/Carousel.js +63 -0
  37. package/esm/parts/carousel/styles.js +49 -0
  38. package/esm/parts/carousel/useCarousel.js +87 -0
  39. package/esm/parts/carousel/useCarouselCallbacks.js +68 -0
  40. package/esm/parts/tabBar/TabBar.js +151 -0
  41. package/esm/parts/tabBar/styles.js +185 -0
  42. package/esm/parts/tabBar/useTabBar.js +90 -0
  43. package/esm/parts/tabsContent/TabsContent.js +40 -0
  44. package/esm/parts/tabsContent/styles.js +7 -0
  45. package/esm/parts/tabsPanel/TabsPanels.js +67 -0
  46. package/esm/parts/tabsPanel/styles.js +22 -0
  47. package/esm/propTypes.js +28 -0
  48. package/esm/utils/constants.js +21 -0
  49. package/esm/utils/helpers.js +37 -0
  50. package/esm/utils/hooks/useKeyboardNavigation.js +57 -0
  51. package/esm/{useResize.js → utils/hooks/useResize.js} +9 -5
  52. package/esm/utils/hooks/useTabsCallbacks.js +55 -0
  53. package/package.json +95 -35
  54. package/types/DSTabs.d.ts +6 -165
  55. package/types/DSTabsCTX.d.ts +4 -0
  56. package/types/DSTabsDatatestid.d.ts +12 -0
  57. package/types/DSTabsTypes.d.ts +202 -0
  58. package/types/config/useCrossRef.d.ts +2 -0
  59. package/types/config/useTabs.d.ts +2 -0
  60. package/types/defaultProps.d.ts +2 -0
  61. package/types/exportsRelated/DSTab.d.ts +14 -0
  62. package/types/index.d.ts +4 -3
  63. package/types/parts/carousel/Carousel.d.ts +3 -0
  64. package/types/parts/carousel/styles.d.ts +9 -0
  65. package/types/parts/carousel/useCarousel.d.ts +2 -0
  66. package/types/parts/carousel/useCarouselCallbacks.d.ts +2 -0
  67. package/types/parts/tabBar/TabBar.d.ts +2 -0
  68. package/types/parts/tabBar/styles.d.ts +7 -0
  69. package/types/parts/tabBar/useTabBar.d.ts +2 -0
  70. package/types/parts/tabsContent/TabsContent.d.ts +2 -0
  71. package/types/parts/tabsContent/styles.d.ts +1 -0
  72. package/types/parts/tabsPanel/TabsPanels.d.ts +2 -0
  73. package/types/parts/tabsPanel/styles.d.ts +2 -0
  74. package/types/propTypes.d.ts +54 -0
  75. package/types/tests/{DSTabs.events.test.d.ts → DSTabs.callbacks.test.d.ts} +0 -0
  76. package/types/tests/DSTabs.func.test.d.ts +1 -0
  77. package/types/tests/DSTabs.keyboard.test.d.ts +1 -0
  78. package/types/utils/constants.d.ts +19 -0
  79. package/types/utils/helpers.d.ts +8 -0
  80. package/types/utils/hooks/useKeyboardNavigation.d.ts +2 -0
  81. package/types/utils/hooks/useResize.d.ts +2 -0
  82. package/types/utils/hooks/useTabsCallbacks.d.ts +2 -0
  83. package/cjs/Carousel.js +0 -205
  84. package/cjs/DSTab.js +0 -46
  85. package/cjs/SubTabBar.js +0 -54
  86. package/cjs/TabBar.js +0 -417
  87. package/cjs/TabTypes.js +0 -15
  88. package/cjs/TabsImpl.js +0 -120
  89. package/cjs/TabsPanels.js +0 -82
  90. package/esm/Carousel.js +0 -196
  91. package/esm/DSTab.js +0 -36
  92. package/esm/SubTabBar.js +0 -48
  93. package/esm/TabBar.js +0 -407
  94. package/esm/TabTypes.js +0 -10
  95. package/esm/TabsImpl.js +0 -113
  96. package/esm/TabsPanels.js +0 -73
  97. package/types/Carousel.d.ts +0 -16
  98. package/types/DSTab.d.ts +0 -51
  99. package/types/PanelContainer.d.ts +0 -20
  100. package/types/SubTabBar.d.ts +0 -23
  101. package/types/TabBar.d.ts +0 -30
  102. package/types/TabTypes.d.ts +0 -5
  103. package/types/TabsImpl.d.ts +0 -37
  104. package/types/TabsPanels.d.ts +0 -5
  105. package/types/useResize.d.ts +0 -1
package/cjs/TabBar.js DELETED
@@ -1,417 +0,0 @@
1
- 'use strict';
2
-
3
- var _jsx = require('@babel/runtime/helpers/jsx');
4
- require('core-js/modules/esnext.async-iterator.map.js');
5
- require('core-js/modules/esnext.iterator.map.js');
6
- var React = require('react');
7
- var lodash = require('lodash');
8
- var dsClassnames = require('@elliemae/ds-classnames');
9
- var RequiredMark = require('@elliemae/ds-form/RequiredMark');
10
- var memoizeOne = require('memoize-one');
11
- var resizeObserver = require('resize-observer');
12
- var styled = require('styled-components');
13
- var Carousel = require('./Carousel.js');
14
- var jsxRuntime = require('react/jsx-runtime');
15
-
16
- function _interopDefaultLegacy (e) { return e && typeof e === 'object' && 'default' in e ? e : { 'default': e }; }
17
-
18
- var _jsx__default = /*#__PURE__*/_interopDefaultLegacy(_jsx);
19
- var React__default = /*#__PURE__*/_interopDefaultLegacy(React);
20
- var RequiredMark__default = /*#__PURE__*/_interopDefaultLegacy(RequiredMark);
21
- var memoizeOne__default = /*#__PURE__*/_interopDefaultLegacy(memoizeOne);
22
- var styled__default = /*#__PURE__*/_interopDefaultLegacy(styled);
23
-
24
- const blockName = 'tabs-tab-bar';
25
- const gradientWidth = 24;
26
- const StyledTabWrapper = /*#__PURE__*/styled__default["default"].div.withConfig({
27
- componentId: "sc-7sdovg-0"
28
- })(["display:flex;flex:1;flex-wrap:nowrap;", ";"], _ref => {
29
- let {
30
- flexibleTabsHeaders
31
- } = _ref;
32
- return flexibleTabsHeaders ? '' : 'overflow-x: hidden';
33
- });
34
- const StyledTabList = dsClassnames.aggregatedClasses('div')(blockName, 'list', _ref2 => {
35
- let {
36
- withCarousel,
37
- flexibleTabsHeaders,
38
- fixedTabsHeaders,
39
- isDSMobile,
40
- withLeftGradients,
41
- withRightGradients
42
- } = _ref2;
43
- return {
44
- carousel: withCarousel,
45
- 'flexible-table-headers': isDSMobile && flexibleTabsHeaders,
46
- 'fixed-table-headers': isDSMobile && fixedTabsHeaders,
47
- 'left-gradients': isDSMobile && flexibleTabsHeaders && withLeftGradients,
48
- 'right-gradients': isDSMobile && flexibleTabsHeaders && withRightGradients
49
- };
50
- }, {
51
- propsToRemoveFromFinalElement: ['withCarousel', 'flexibleTabsHeaders', 'fixedTabsHeaders', 'withLeftGradients', 'withRightGradients', 'isDSMobile']
52
- });
53
- const TabContainer = dsClassnames.aggregatedClasses('button', {
54
- role: 'tab'
55
- })(blockName, 'tab', _ref3 => {
56
- let {
57
- isActive,
58
- showSeparator,
59
- disabled
60
- } = _ref3;
61
- return {
62
- active: isActive,
63
- separator: showSeparator,
64
- disabled
65
- };
66
- });
67
- const SelectionIndicator = dsClassnames.aggregatedClasses('div')(blockName, 'selection-indicator');
68
-
69
- class TabBar extends React.Component {
70
- constructor(_props) {
71
- super(_props);
72
-
73
- this.handleTabClick = (tabId, e) => {
74
- const {
75
- tabListRef,
76
- props
77
- } = this;
78
- const {
79
- onTabClick,
80
- flexibleTabsHeaders,
81
- isDSMobile
82
- } = props;
83
-
84
- if (isDSMobile && flexibleTabsHeaders) {
85
- const tabListDomEl = tabListRef.current;
86
- const el = e.target;
87
- const {
88
- offsetLeft
89
- } = el;
90
- const {
91
- width: elWidth
92
- } = el.getBoundingClientRect();
93
- const {
94
- width: listWidth
95
- } = tabListDomEl.getBoundingClientRect();
96
- const extraSideSpace = listWidth - elWidth;
97
- const leftOffsetToCenter = extraSideSpace > 0 ? extraSideSpace / 2 : 0;
98
- const centeredLeftOffset = offsetLeft > leftOffsetToCenter ? offsetLeft - leftOffsetToCenter : 0;
99
- tabListDomEl.scrollTo({
100
- top: 0,
101
- left: centeredLeftOffset,
102
- behavior: 'smooth'
103
- });
104
- }
105
-
106
- e.preventDefault();
107
- onTabClick(tabId);
108
- };
109
-
110
- this.handleKeyPress = (tabId, e, index) => {
111
- const {
112
- tabs,
113
- handleDownArrow,
114
- handleUpArrow // onTabClick,
115
-
116
- } = this.props;
117
-
118
- if (e.keyCode === 39) {
119
- var _this$tabsRef;
120
-
121
- const nextTab = tabs[index + 1];
122
- if (!nextTab && handleDownArrow) handleDownArrow(e);
123
- if (!nextTab) return; // const { props } = nextTab
124
- // onTabClick(props.tabId)
125
-
126
- (_this$tabsRef = this.tabsRef[index + 1]) === null || _this$tabsRef === void 0 ? void 0 : _this$tabsRef.focus();
127
- }
128
-
129
- if (e.keyCode === 37) {
130
- var _this$tabsRef2;
131
-
132
- const nextTab = tabs[index - 1];
133
- if (!nextTab && handleUpArrow) handleUpArrow(e);
134
- if (!nextTab) return; // const { props } = nextTab
135
- // onTabClick(props.tabId)
136
-
137
- (_this$tabsRef2 = this.tabsRef[index - 1]) === null || _this$tabsRef2 === void 0 ? void 0 : _this$tabsRef2.focus();
138
- }
139
-
140
- if (e.keyCode === 40 && handleDownArrow) {
141
- handleDownArrow(e);
142
- }
143
-
144
- if (e.keyCode === 38 && handleUpArrow) {
145
- handleUpArrow(e);
146
- }
147
- };
148
-
149
- this.handleTabsHeadersHorizontalScroll = lodash.debounce(() => {
150
- const {
151
- tabListRef,
152
- props
153
- } = this;
154
- const {
155
- flexibleTabsHeaders,
156
- isDSMobile
157
- } = props;
158
-
159
- if (isDSMobile && flexibleTabsHeaders) {
160
- const tabListDomEl = tabListRef.current;
161
- const {
162
- scrollLeft,
163
- scrollWidth,
164
- clientWidth
165
- } = tabListDomEl;
166
- const withLeftGradients = this.shouldHaveLeftGradient(scrollLeft, gradientWidth);
167
- const withRightGradients = this.shouldHaveRightGradient(scrollLeft, gradientWidth, clientWidth, scrollWidth);
168
- this.setState({
169
- withLeftGradients,
170
- withRightGradients
171
- });
172
- }
173
- }, 50);
174
- this.renderTabs = memoizeOne__default["default"]((activeTab, tabs) => {
175
- const {
176
- showSeparator
177
- } = this.props;
178
- return React__default["default"].Children.map(tabs, (tab, index) => {
179
- const {
180
- tabId,
181
- title,
182
- style,
183
- required,
184
- disabled
185
- } = tab.props;
186
- const isActive = activeTab === tabId;
187
- return [/*#__PURE__*/jsxRuntime.jsxs(TabContainer, {
188
- // eslint-disable-next-line no-return-assign
189
- ref: t => {
190
- this.tabsRef[index] = t;
191
-
192
- if (index === 0 && this.props.firstSubtabRef) {
193
- this.props.firstSubtabRef.current = t;
194
- }
195
-
196
- if (index === tabs.length - 1 && this.props.lastTabRef) {
197
- this.props.lastTabRef.current = t;
198
- }
199
- },
200
- "aria-controls": tabId,
201
- "aria-selected": isActive,
202
- "aria-disabled": !!disabled,
203
- classProps: {
204
- isActive,
205
- showSeparator,
206
- disabled
207
- },
208
- "data-tab-id": tabId,
209
- id: "".concat(tabId, "-label"),
210
- onClick: e => {
211
- if (!disabled) this.handleTabClick(tabId, e, index);
212
- },
213
- onKeyDown: e => {
214
- if (!disabled) this.handleKeyPress(tabId, e, index);
215
- },
216
- style: style,
217
- tabIndex: 0,
218
- children: [title, /*#__PURE__*/_jsx__default["default"](RequiredMark__default["default"], {
219
- required: required
220
- })]
221
- }, tabId)];
222
- }, null);
223
- });
224
- this.tabListRef = /*#__PURE__*/React__default["default"].createRef();
225
- this.resizeObserver = new resizeObserver.ResizeObserver(() => this.setIndicatorStyle());
226
- this.state = {
227
- indicatorStyle: null,
228
- withLeftGradients: false,
229
- withRightGradients: false
230
- };
231
- this.setIndicatorStyle = this.setIndicatorStyle.bind(this);
232
- this.getIndicatorStyles = this.getIndicatorStyles.bind(this);
233
- this.handleGradients = this.handleGradients.bind(this);
234
- this.handleTabsHeadersHorizontalScroll = this.handleTabsHeadersHorizontalScroll.bind(this);
235
- this.tabsRef = {};
236
- this.setIndicatorStyle = this.setIndicatorStyle.bind(this);
237
- }
238
-
239
- componentDidMount() {
240
- const {
241
- showSelectionIndicator
242
- } = this.props;
243
- this.resizeObserver.observe(this.tabListRef.current);
244
-
245
- if (showSelectionIndicator) {
246
- this.setIndicatorStyle();
247
- }
248
-
249
- window.addEventListener('resize', this.handleGradients);
250
- window.addEventListener('orientationchange', this.handleGradients);
251
- this.handleGradients();
252
- }
253
-
254
- componentDidUpdate(prevProps) {
255
- const {
256
- activeTab,
257
- showSelectionIndicator
258
- } = this.props;
259
-
260
- if (showSelectionIndicator && prevProps.activeTab !== activeTab) {
261
- this.setIndicatorStyle(activeTab);
262
- }
263
- }
264
-
265
- componentWillUnmount() {
266
- this.resizeObserver.unobserve(this.tabListRef.current);
267
- window.removeEventListener('resize', this.handleGradients);
268
- window.removeEventListener('orientationchange', this.handleGradients);
269
- }
270
-
271
- handleGradients() {
272
- const {
273
- scrollLeft,
274
- scrollWidth,
275
- clientWidth
276
- } = this.tabListRef.current;
277
- const withLeftGradients = this.shouldHaveLeftGradient(scrollLeft, gradientWidth);
278
- const withRightGradients = this.shouldHaveRightGradient(scrollLeft, gradientWidth, clientWidth, scrollWidth);
279
- this.setState({
280
- withLeftGradients,
281
- withRightGradients
282
- });
283
- }
284
-
285
- shouldHaveLeftGradient(scrollLeft, gWidth) {
286
- return Math.abs(scrollLeft) > gWidth;
287
- } // eslint-disable-next-line max-params
288
-
289
-
290
- shouldHaveRightGradient(scrollLeft, gWidth, clientWidth, scrollWidth) {
291
- return Math.abs(scrollLeft) <= scrollWidth - (clientWidth + gWidth);
292
- }
293
-
294
- setIndicatorStyle() {
295
- const {
296
- activeTab
297
- } = this.props;
298
- setTimeout(() => this.setState({
299
- indicatorStyle: this.getIndicatorStyles(activeTab)
300
- }), 100);
301
- }
302
-
303
- getActiveTabElement(activeTab) {
304
- const tabListEl = this.tabListRef.current;
305
- const tabSelector = "[data-tab-id=\"".concat(activeTab, "\"]");
306
- return tabListEl && tabListEl.querySelector(tabSelector);
307
- }
308
-
309
- isElementVisible(el, holder) {
310
- const {
311
- left,
312
- right,
313
- width
314
- } = el.getBoundingClientRect();
315
- const holderRect = holder.getBoundingClientRect();
316
- return left <= holderRect.left ? holderRect.left - left <= width : right - holderRect.right <= width;
317
- }
318
-
319
- getVisibleDimensions(node, referenceNode) {
320
- const pos = node.getBoundingClientRect();
321
- const referencePos = referenceNode.getBoundingClientRect();
322
- return {
323
- width: Math.min(node.clientWidth, referencePos.left + referenceNode.clientWidth - pos.left, node.clientWidth - (referencePos.left - pos.left)),
324
- height: Math.min(node.clientHeight, referencePos.top + referenceNode.clientHeight - pos.top, node.clientHeight - (referencePos.top - pos.top))
325
- };
326
- }
327
-
328
- getIndicatorStyles(activeTab) {
329
- const tabListEl = this.tabListRef.current;
330
- const {
331
- withCarousel
332
- } = this.props;
333
- const activeTabEl = this.getActiveTabElement(activeTab);
334
- if (!activeTabEl || !this.isElementVisible(activeTabEl, tabListEl)) return null;
335
- const {
336
- clientHeight,
337
- clientWidth,
338
- offsetTop,
339
- offsetLeft
340
- } = activeTabEl;
341
- const {
342
- left
343
- } = activeTabEl.getBoundingClientRect();
344
- const leftOff = withCarousel ? Math.max(0, left - tabListEl.getBoundingClientRect().left) : offsetLeft;
345
- const width = withCarousel ? this.getVisibleDimensions(activeTabEl, tabListEl).width + 2 : clientWidth + 2;
346
- return {
347
- height: clientHeight,
348
- left: "".concat(Math.floor(leftOff), "px"),
349
- // using left and top for ie compatibility
350
- top: "".concat(Math.floor(offsetTop), "px"),
351
- width
352
- };
353
- }
354
-
355
- render() {
356
- const {
357
- id,
358
- tabs,
359
- activeTab,
360
- renderCustomTabBar,
361
- withCarousel,
362
- isDSMobile,
363
- flexibleTabsHeaders,
364
- fixedTabsHeaders
365
- } = this.props;
366
- const {
367
- indicatorStyle,
368
- withLeftGradients,
369
- withRightGradients
370
- } = this.state;
371
-
372
- if (renderCustomTabBar) {
373
- return renderCustomTabBar({
374
- innerRef: this.tabListRef,
375
- withCarousel,
376
- tabsComponents: this.renderTabs(activeTab, tabs)
377
- });
378
- }
379
-
380
- const shouldUseCarousel = !isDSMobile && withCarousel;
381
- return /*#__PURE__*/jsxRuntime.jsx(jsxRuntime.Fragment, {
382
- children: /*#__PURE__*/_jsx__default["default"](StyledTabList, {
383
- withCarousel: withCarousel,
384
- "aria-label": id,
385
- innerRef: this.tabListRef,
386
- role: "tablist",
387
- "data-testid": "tab-list",
388
- isDSMobile: isDSMobile,
389
- flexibleTabsHeaders: flexibleTabsHeaders,
390
- withLeftGradients: withLeftGradients,
391
- withRightGradients: withRightGradients,
392
- fixedTabsHeaders: fixedTabsHeaders,
393
- onScroll: this.handleTabsHeadersHorizontalScroll,
394
- style: {
395
- width: '100%'
396
- }
397
- }, void 0, /*#__PURE__*/_jsx__default["default"](StyledTabWrapper, {
398
- isDSMobile: isDSMobile,
399
- flexibleTabsHeaders: flexibleTabsHeaders,
400
- fixedTabsHeaders: fixedTabsHeaders
401
- }, void 0, shouldUseCarousel ? /*#__PURE__*/_jsx__default["default"](Carousel, {
402
- onScroll: this.setIndicatorStyle
403
- }, void 0, this.renderTabs(activeTab, tabs)) : null, !shouldUseCarousel ? this.renderTabs(activeTab, tabs) : null, /*#__PURE__*/_jsx__default["default"](SelectionIndicator, {
404
- style: indicatorStyle
405
- })))
406
- });
407
- }
408
-
409
- }
410
-
411
- TabBar.defaultProps = {
412
- showSelectionIndicator: true,
413
- showSeparator: false,
414
- isDSMobile: false
415
- };
416
-
417
- module.exports = TabBar;
package/cjs/TabTypes.js DELETED
@@ -1,15 +0,0 @@
1
- 'use strict';
2
-
3
- Object.defineProperty(exports, '__esModule', { value: true });
4
-
5
- require('core-js/modules/esnext.async-iterator.map.js');
6
- require('core-js/modules/esnext.iterator.map.js');
7
-
8
- const TabTypes = {
9
- NORMAL: 'normal',
10
- SUBTABS: 'subtabs'
11
- };
12
- const getTabTypes = () => Object.keys(TabTypes).map(key => TabTypes[key]);
13
-
14
- exports.TabTypes = TabTypes;
15
- exports.getTabTypes = getTabTypes;
package/cjs/TabsImpl.js DELETED
@@ -1,120 +0,0 @@
1
- 'use strict';
2
-
3
- var _defineProperty = require('@babel/runtime/helpers/defineProperty');
4
- var _jsx = require('@babel/runtime/helpers/jsx');
5
- require('core-js/modules/web.dom-collections.iterator.js');
6
- require('core-js/modules/esnext.async-iterator.filter.js');
7
- require('core-js/modules/esnext.iterator.constructor.js');
8
- require('core-js/modules/esnext.iterator.filter.js');
9
- require('core-js/modules/esnext.async-iterator.for-each.js');
10
- require('core-js/modules/esnext.iterator.for-each.js');
11
- var React = require('react');
12
- var dsClassnames = require('@elliemae/ds-classnames');
13
- var TabsPanels = require('./TabsPanels.js');
14
- var TabBar = require('./TabBar.js');
15
- var SubTabBar = require('./SubTabBar.js');
16
- var TabTypes = require('./TabTypes.js');
17
- var jsxRuntime = require('react/jsx-runtime');
18
-
19
- function _interopDefaultLegacy (e) { return e && typeof e === 'object' && 'default' in e ? e : { 'default': e }; }
20
-
21
- var _defineProperty__default = /*#__PURE__*/_interopDefaultLegacy(_defineProperty);
22
- var _jsx__default = /*#__PURE__*/_interopDefaultLegacy(_jsx);
23
-
24
- function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); if (enumerableOnly) { symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; }); } keys.push.apply(keys, symbols); } return keys; }
25
-
26
- function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i] != null ? arguments[i] : {}; if (i % 2) { ownKeys(Object(source), true).forEach(function (key) { _defineProperty__default["default"](target, key, source[key]); }); } else if (Object.getOwnPropertyDescriptors) { Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)); } else { ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } } return target; }
27
- const blockName = 'tabs';
28
- const StyledTabsContainer = dsClassnames.aggregatedClasses('div')(blockName);
29
- const StyledTabBarContainer = dsClassnames.aggregatedClasses('div')(blockName, 'tab-bar-container');
30
- const TabBarComponentsByType = {
31
- [TabTypes.TabTypes.NORMAL]: TabBar,
32
- [TabTypes.TabTypes.SUBTABS]: SubTabBar
33
- };
34
-
35
- const TabsImpl = props => {
36
- var _tabs$, _tabs$$props, _TabsPanels, _StyledTabBarContaine;
37
-
38
- const {
39
- animated,
40
- children: tabs,
41
- type,
42
- tabBarExtraContent,
43
- onTabChange,
44
- enableMouseEvents,
45
- innerRef,
46
- onlyRenderActiveTab,
47
- containerProps,
48
- allowTextSelection,
49
- tabsListAriaLabel,
50
- activeTab,
51
- firstSubtabRef,
52
- lastTabRef,
53
- withCarousel,
54
- flexibleTabsHeaders,
55
- fixedTabsHeaders,
56
- isDSMobile
57
- } = props;
58
- const [actualActiveTab, setActualActiveTab] = React.useState(activeTab || (tabs === null || tabs === void 0 ? void 0 : (_tabs$ = tabs[0]) === null || _tabs$ === void 0 ? void 0 : (_tabs$$props = _tabs$.props) === null || _tabs$$props === void 0 ? void 0 : _tabs$$props.tabId));
59
- const firstTabRefByParent = React.useRef(null);
60
- const lastTabRefByParent = React.useRef(null);
61
- React.useEffect(() => {
62
- if (activeTab) {
63
- setActualActiveTab(activeTab);
64
- }
65
- }, [activeTab]);
66
- const handleTabClick = React.useCallback(tab => {
67
- setActualActiveTab(tab);
68
- onTabChange(tab);
69
- }, [onTabChange]);
70
- const handleDownArrow = React.useCallback(e => {
71
- var _firstTabRefByParent$;
72
-
73
- e.preventDefault();
74
- e.stopPropagation();
75
- if (firstTabRefByParent !== null && firstTabRefByParent !== void 0 && firstTabRefByParent.current) (_firstTabRefByParent$ = firstTabRefByParent.current) === null || _firstTabRefByParent$ === void 0 ? void 0 : _firstTabRefByParent$.focus();
76
- }, [firstTabRefByParent]);
77
- const handleUpArrow = React.useCallback(e => {
78
- var _lastTabRef$current;
79
-
80
- e.preventDefault();
81
- e.stopPropagation();
82
- if (lastTabRef !== null && lastTabRef !== void 0 && lastTabRef.current) (_lastTabRef$current = lastTabRef.current) === null || _lastTabRef$current === void 0 ? void 0 : _lastTabRef$current.focus();
83
- }, [lastTabRef]);
84
- const PureTabBarComponent = React.useMemo(() => {
85
- const TabBarComponent = TabBarComponentsByType[type] || TabBar;
86
- return /*#__PURE__*/_jsx__default["default"](TabBarComponent, {
87
- withCarousel: withCarousel,
88
- activeTab: actualActiveTab,
89
- onTabClick: handleTabClick,
90
- tabs: tabs,
91
- firstSubtabRef: firstSubtabRef,
92
- lastTabRef: lastTabRefByParent,
93
- handleDownArrow: handleDownArrow,
94
- handleUpArrow: handleUpArrow,
95
- isDSMobile: isDSMobile,
96
- flexibleTabsHeaders: flexibleTabsHeaders,
97
- fixedTabsHeaders: fixedTabsHeaders
98
- });
99
- }, [type, withCarousel, actualActiveTab, handleTabClick, tabs, firstSubtabRef, lastTabRefByParent, handleDownArrow, handleUpArrow, isDSMobile]);
100
- const PureTabsPanels = React.useMemo(() => _TabsPanels || (_TabsPanels = /*#__PURE__*/_jsx__default["default"](TabsPanels, {
101
- activeTab: actualActiveTab,
102
- allowTextSelection: allowTextSelection,
103
- animated: animated,
104
- enableMouseEvents: enableMouseEvents,
105
- onlyRenderActiveTab: onlyRenderActiveTab,
106
- onTabChange: handleTabClick,
107
- tabsComponents: tabs,
108
- lastTabRef: lastTabRefByParent,
109
- firstTabRefByParent: firstTabRefByParent
110
- })), [actualActiveTab, allowTextSelection, animated, enableMouseEvents, onlyRenderActiveTab, handleTabClick, tabs, lastTabRefByParent, firstTabRefByParent]);
111
- const PureTabsImpl = React.useMemo(() => /*#__PURE__*/jsxRuntime.jsxs(StyledTabsContainer, _objectSpread(_objectSpread({}, containerProps), {}, {
112
- "aria-label": tabsListAriaLabel,
113
- innerRef: innerRef,
114
- role: "tablist",
115
- children: [_StyledTabBarContaine || (_StyledTabBarContaine = /*#__PURE__*/_jsx__default["default"](StyledTabBarContainer, {}, void 0, PureTabBarComponent, tabBarExtraContent)), PureTabsPanels]
116
- })), [containerProps, tabsListAriaLabel, innerRef, PureTabBarComponent, tabBarExtraContent, PureTabsPanels]);
117
- return PureTabsImpl;
118
- };
119
-
120
- module.exports = TabsImpl;
package/cjs/TabsPanels.js DELETED
@@ -1,82 +0,0 @@
1
- 'use strict';
2
-
3
- var _jsx = require('@babel/runtime/helpers/jsx');
4
- require('core-js/modules/web.dom-collections.iterator.js');
5
- require('core-js/modules/esnext.async-iterator.map.js');
6
- require('core-js/modules/esnext.iterator.map.js');
7
- var React = require('react');
8
- var memoizeOne = require('memoize-one');
9
- var dsClassnames = require('@elliemae/ds-classnames');
10
- var SwipeableViews = require('react-swipeable-views');
11
- var PanelContainer = require('./PanelContainer.js');
12
-
13
- function _interopDefaultLegacy (e) { return e && typeof e === 'object' && 'default' in e ? e : { 'default': e }; }
14
-
15
- var _jsx__default = /*#__PURE__*/_interopDefaultLegacy(_jsx);
16
- var React__default = /*#__PURE__*/_interopDefaultLegacy(React);
17
- var memoizeOne__default = /*#__PURE__*/_interopDefaultLegacy(memoizeOne);
18
- var SwipeableViews__default = /*#__PURE__*/_interopDefaultLegacy(SwipeableViews);
19
-
20
- const blockName = 'tabs-panels';
21
- const Panels = dsClassnames.aggregatedClasses('div')(blockName);
22
-
23
- const getIndexById = (children, activeId) => children && children.findIndex(item => item.props.tabId === activeId);
24
-
25
- const getIdByIndex = (children, index) => children && children[index].props.tabId;
26
-
27
- class TabsPanels extends React.Component {
28
- constructor() {
29
- super(...arguments);
30
- this.renderPanels = memoizeOne__default["default"]((activeTab, tabsComponents) => {
31
- const {
32
- animated,
33
- onlyRenderActiveTab,
34
- allowTextSelection
35
- } = this.props;
36
- return React__default["default"].Children.map(tabsComponents, tab => {
37
- const {
38
- tabId: panelId,
39
- style,
40
- children: content
41
- } = tab.props;
42
- const isActive = activeTab === panelId;
43
- const shouldRender = !onlyRenderActiveTab || isActive;
44
- return /*#__PURE__*/_jsx__default["default"](PanelContainer, {
45
- "aria-labelledby": "".concat(panelId, "-label"),
46
- lastTabRef: this.props.lastTabRef,
47
- firstSubtabRef: this.props.firstTabRefByParent,
48
- classProps: {
49
- isActive
50
- },
51
- "data-panel-id": panelId,
52
- hidden: !animated && !isActive,
53
- onMouseDown: e => {
54
- const role = e.target.getAttribute('role');
55
- if (role !== 'tabpanel' && allowTextSelection) e.stopPropagation();
56
- },
57
- role: "tabpanel",
58
- style: style
59
- }, panelId, shouldRender && content);
60
- }, null);
61
- });
62
- }
63
-
64
- render() {
65
- const {
66
- activeTab,
67
- tabsComponents,
68
- animated,
69
- onTabChange,
70
- enableMouseEvents
71
- } = this.props;
72
- const panels = animated ? /*#__PURE__*/_jsx__default["default"](SwipeableViews__default["default"], {
73
- enableMouseEvents: enableMouseEvents,
74
- index: getIndexById(tabsComponents, activeTab),
75
- onChangeIndex: index => onTabChange(getIdByIndex(tabsComponents, index))
76
- }, void 0, this.renderPanels(activeTab, tabsComponents)) : this.renderPanels(activeTab, tabsComponents);
77
- return /*#__PURE__*/_jsx__default["default"](Panels, {}, void 0, panels);
78
- }
79
-
80
- }
81
-
82
- module.exports = TabsPanels;