@transferwise/components 0.0.0-experimental-45bc551 → 0.0.0-experimental-49ac695

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.
@@ -1,7 +1,6 @@
1
- import { Spring, animated } from '@react-spring/web';
2
1
  import { clsx } from 'clsx';
3
2
  import clamp from 'lodash.clamp';
4
- import { Component, createRef, Fragment } from 'react';
3
+ import { Component, createRef } from 'react';
5
4
  import '../common/theme.mjs';
6
5
  import { Direction } from '../common/direction.mjs';
7
6
  import '../common/propsValues/control.mjs';
@@ -29,20 +28,12 @@ import { DirectionContext } from '../provider/direction/DirectionProvider.mjs';
29
28
  import Tab from './Tab.mjs';
30
29
  import TabList from './TabList.mjs';
31
30
  import TabPanel from './TabPanel.mjs';
32
- import { swipedLeftToRight, swipedRightToLeft, getSwipeDifference, getElasticDragDifference, getVelocity, swipeShouldChangeTab } from './utils.mjs';
31
+ import { swipedLeftToRight, swipedRightToLeft, getSwipeDifference, swipeShouldChangeTab } from './utils.mjs';
33
32
 
34
33
  const MIN_INDEX = 0;
35
- const SpacerWidth = {
36
- default: 0,
37
- xs: 8,
38
- sm: 16,
39
- md: 24,
40
- lg: 32
41
- };
42
34
  class Tabs extends Component {
43
35
  static defaultProps = {
44
36
  changeTabOnSwipe: true,
45
- transitionSpacing: 'default',
46
37
  headerWidth: Width.BLOCK
47
38
  };
48
39
  containerReference = /*#__PURE__*/createRef();
@@ -50,25 +41,15 @@ class Tabs extends Component {
50
41
  super(props);
51
42
  this.state = {
52
43
  start: null,
53
- translateX: 0,
54
- translateFrom: 0,
55
- translateTo: 0,
56
44
  translateLineX: null,
57
- isAnimating: false,
58
45
  isSwiping: false,
59
46
  isScrolling: false,
60
- lastSwipeVelocity: 0,
61
- fullWidthTabs: props.headerWidth === Width.BLOCK,
62
- currentSwipe: [],
63
- selectedTabIndex: props.selected
47
+ fullWidthTabs: props.headerWidth === Width.BLOCK
64
48
  };
65
49
  }
66
50
  container = null;
67
51
  containerWidth = 0;
68
52
  tabRefs = [];
69
- get filteredTabsLength() {
70
- return this.props.tabs.filter(tab => !tab.disabled).length;
71
- }
72
53
  get MAX_INDEX() {
73
54
  return this.props.tabs.length - 1;
74
55
  }
@@ -78,7 +59,7 @@ class Tabs extends Component {
78
59
  } = this.props;
79
60
  this.setTabWidth();
80
61
  this.switchTab(clamp(selected, MIN_INDEX, this.MAX_INDEX));
81
- this.animateToTab(clamp(selected, MIN_INDEX, this.MAX_INDEX), true);
62
+ this.animateLine(clamp(selected, MIN_INDEX, this.MAX_INDEX));
82
63
  document.body.addEventListener('touchmove', this.disableScroll, {
83
64
  passive: false
84
65
  });
@@ -87,7 +68,7 @@ class Tabs extends Component {
87
68
  });
88
69
  window.addEventListener('resize', this.handleResize);
89
70
  }
90
- componentDidUpdate(previousProps, previousState) {
71
+ componentDidUpdate(previousProps) {
91
72
  const currentSelected = this.props.selected;
92
73
  const previousSelected = previousProps.selected;
93
74
  const currentSelectedTab = this.props.tabs[currentSelected];
@@ -100,15 +81,11 @@ class Tabs extends Component {
100
81
  const previousDisabledTabsLength = previousProps.tabs.filter(tab => !tab.disabled).length;
101
82
  const currentHeaderWidth = this.props.headerWidth;
102
83
  const previousFullHeaderWidth = previousProps.headerWidth;
103
- const {
104
- animatePanelsOnClick
105
- } = this.props;
106
- const instantOnClick = !animatePanelsOnClick && !previousState.isSwiping;
107
84
  if (currentHeaderWidth !== previousFullHeaderWidth || currentTabsLength !== previousTabsLength) {
108
85
  this.setTabWidth();
109
86
  }
110
87
  if (currentSelected !== previousSelected || currentDisabledTabsLength !== previousDisabledTabsLength || currentSelectedTabIsDisabled !== previousSelectedTabIsDisabled) {
111
- this.animateToTab(clamp(currentSelected, MIN_INDEX, this.MAX_INDEX), currentSelected === previousSelected || instantOnClick);
88
+ this.animateLine(clamp(currentSelected, MIN_INDEX, this.MAX_INDEX));
112
89
  }
113
90
  }
114
91
  componentWillUnmount() {
@@ -118,11 +95,6 @@ class Tabs extends Component {
118
95
  }
119
96
  handleResize = () => {
120
97
  this.setContainerWidth(this.container);
121
- this.setState(({
122
- selectedTabIndex
123
- }) => ({
124
- translateTo: -(this.containerWidth * selectedTabIndex)
125
- }));
126
98
  };
127
99
  setContainerRefAndWidth = node => {
128
100
  this.container = node;
@@ -212,60 +184,17 @@ class Tabs extends Component {
212
184
  return nextSelected;
213
185
  };
214
186
  swipedOverHalfOfContainer = difference => difference / this.containerWidth >= 0.5;
215
- calculateApplicableDragDifference = ({
216
- currentSelected,
217
- nextSelected,
218
- start,
219
- end
220
- }) => {
221
- const difference = getSwipeDifference(start, end);
222
- const elasticDrag = getElasticDragDifference(difference);
223
- if (swipedLeftToRight(start, end)) {
224
- if (currentSelected > MIN_INDEX && currentSelected !== nextSelected) {
225
- return Math.min(difference, this.containerWidth);
226
- }
227
- return elasticDrag;
228
- }
229
- if (swipedRightToLeft(start, end)) {
230
- if (currentSelected < this.MAX_INDEX && currentSelected !== nextSelected) {
231
- return -Math.min(difference, this.containerWidth);
232
- }
233
- return -elasticDrag;
234
- }
235
- return false;
236
- };
237
187
  switchTab = index => {
238
188
  const {
239
189
  onTabSelect
240
190
  } = this.props;
241
191
  onTabSelect(index);
242
192
  };
243
- getTabIndexWithoutDisabledTabs(index) {
244
- return index - this.props.tabs.slice(0, index).filter(tab => tab.disabled).length;
245
- }
246
- animateToTab = (index, instant) => {
247
- this.animateLine(index);
248
- this.animatePanel(this.getTabIndexWithoutDisabledTabs(index), instant);
249
- };
250
193
  animateLine = index => {
251
194
  this.setState(previousState => ({
252
195
  translateLineX: previousState.fullWidthTabs ? `${index * 100}%` : `${this.getDistanceToSelectedTab(index)}px`
253
196
  }));
254
197
  };
255
- // Pass `instant` to set the `translateX` to the new panel with no transition
256
- animatePanel = (index, instant = false) => {
257
- const {
258
- translateTo: currentTranslateTo
259
- } = this.state;
260
- const translateFrom = currentTranslateTo;
261
- const translateTo = -(this.containerWidth * index);
262
- this.setState({
263
- selectedTabIndex: index,
264
- isAnimating: !instant && translateFrom !== translateTo,
265
- translateFrom,
266
- translateTo
267
- });
268
- };
269
198
  disableScroll = event => {
270
199
  const {
271
200
  isSwiping
@@ -289,10 +218,8 @@ class Tabs extends Component {
289
218
  time: Date.now()
290
219
  };
291
220
  this.setState({
292
- start,
293
- currentSwipe: [start]
221
+ start
294
222
  });
295
- event.persist();
296
223
  };
297
224
  handleTouchMove = event => {
298
225
  const {
@@ -304,7 +231,6 @@ class Tabs extends Component {
304
231
  const {
305
232
  selected: currentSelectedFromProps
306
233
  } = this.props;
307
- const selected = this.getTabIndexWithoutDisabledTabs(currentSelectedFromProps);
308
234
  const end = {
309
235
  x: event.nativeEvent.changedTouches[0].clientX,
310
236
  y: event.nativeEvent.changedTouches[0].clientY,
@@ -316,7 +242,6 @@ class Tabs extends Component {
316
242
  isScrolling,
317
243
  isSwiping
318
244
  } = this.state;
319
- event.persist();
320
245
  if (!isScrolling && !isSwiping) {
321
246
  if (difference > yAxisDifference) {
322
247
  isSwiping = true;
@@ -331,18 +256,6 @@ class Tabs extends Component {
331
256
  if (isSwiping) {
332
257
  const nextSelected = this.getTabToSelect(currentSelectedFromProps, start, end);
333
258
  this.animateLine(this.swipedOverHalfOfContainer(difference) ? nextSelected : currentSelectedFromProps);
334
- const dragDifference = this.calculateApplicableDragDifference({
335
- currentSelected: currentSelectedFromProps,
336
- nextSelected,
337
- start,
338
- end
339
- });
340
- const translateX = dragDifference ? -(this.containerWidth * selected) + dragDifference : false;
341
- this.setState(state => ({
342
- currentSwipe: [...state.currentSwipe, end],
343
- translateFrom: translateX || state.translateFrom,
344
- translateTo: translateX || state.translateTo
345
- }));
346
259
  }
347
260
  };
348
261
  handleTouchEnd = event => {
@@ -362,23 +275,15 @@ class Tabs extends Component {
362
275
  time: Date.now()
363
276
  };
364
277
  const difference = getSwipeDifference(start, end);
365
- const velocity = getVelocity([...this.state.currentSwipe, end]);
366
- this.setState({
367
- currentSwipe: []
368
- });
369
278
  let nextSelected = selected;
370
- event.persist();
371
279
  if (isSwiping) {
372
280
  if (swipeShouldChangeTab(start, end) || this.swipedOverHalfOfContainer(difference)) {
373
281
  nextSelected = this.getTabToSelect(nextSelected, start, end);
374
282
  }
375
283
  if (nextSelected !== selected) {
376
284
  this.switchTab(nextSelected);
377
- this.setState({
378
- lastSwipeVelocity: velocity
379
- });
380
285
  } else {
381
- this.animateToTab(nextSelected);
286
+ this.animateLine(nextSelected);
382
287
  }
383
288
  }
384
289
  this.setState({
@@ -393,34 +298,13 @@ class Tabs extends Component {
393
298
  name,
394
299
  selected,
395
300
  className,
396
- transitionSpacing,
397
301
  headerWidth
398
302
  } = this.props;
399
303
  const {
400
- isSwiping,
401
304
  translateLineX,
402
- isAnimating,
403
- translateFrom,
404
- translateTo,
405
- lastSwipeVelocity,
406
305
  fullWidthTabs
407
306
  } = this.state;
408
- const spacer = SpacerWidth[transitionSpacing];
409
- const tabsLength = this.filteredTabsLength;
410
- const distanceSwiped = Math.abs(-translateFrom - this.containerWidth * selected);
411
- const remainingContainerToTravel = isSwiping ? 1 - distanceSwiped / this.containerWidth : 1 - Math.abs(distanceSwiped / this.containerWidth - 1);
412
- const restrictedVelocity = (Number.isNaN(remainingContainerToTravel) ? 0 : remainingContainerToTravel) * Math.min(10 * Math.E, lastSwipeVelocity * 10 * Math.E);
413
- const hidePanelOverflow = isAnimating || isSwiping;
414
- const sliderWidth = tabsLength * this.containerWidth + spacer * 2;
415
- // Uses `props.panelTransitionSpacing` to add a spacer in-between the `TabPanel` you're transitioning to/from
416
- const Spacer = ({
417
- id
418
- }) => spacer > 0 && /*#__PURE__*/jsx("div", {
419
- style: {
420
- width: spacer,
421
- display: hidePanelOverflow ? 'block' : 'none'
422
- }
423
- }, id);
307
+ const selectedTab = tabs[selected];
424
308
  return /*#__PURE__*/jsx(DirectionContext.Consumer, {
425
309
  children: direction => {
426
310
  const isRTL = direction === Direction.RTL;
@@ -470,55 +354,14 @@ class Tabs extends Component {
470
354
  }), /*#__PURE__*/jsx("div", {
471
355
  ref: this.setContainerRefAndWidth,
472
356
  className: "tabs__panel-container",
473
- style: {
474
- overflow: hidePanelOverflow ? 'hidden' : 'visible'
475
- },
476
- children: /*#__PURE__*/jsx(Spring, {
477
- from: {
478
- transform: `translateX(${translateFrom - spacer}px)`
479
- },
480
- to: {
481
- transform: `translateX(${translateTo - spacer}px)`
482
- },
483
- config: {
484
- precision: isSwiping ? 1 : 0.01,
485
- velocity: !isSwiping ? restrictedVelocity : 0,
486
- clamp: true
487
- },
488
- onRest: () => {
489
- if (isAnimating) {
490
- this.setState({
491
- isAnimating: false,
492
- lastSwipeVelocity: 0
493
- });
494
- }
357
+ children: selectedTab && !selectedTab.disabled ? /*#__PURE__*/jsx(TabPanel, {
358
+ tabId: `${name}-tab-${selected}`,
359
+ id: `${name}-panel-${selected}`,
360
+ style: {
361
+ width: '100%'
495
362
  },
496
- children: props => /*#__PURE__*/jsx(animated.div, {
497
- className: "tabs__slider",
498
- style: {
499
- width: hidePanelOverflow ? `${sliderWidth}px` : '100%',
500
- transform: hidePanelOverflow ? props.transform : 'translateX(0px)'
501
- },
502
- children: tabs.map(({
503
- content,
504
- disabled
505
- }, index) => !disabled ? /*#__PURE__*/jsxs(Fragment, {
506
- children: [index === selected && /*#__PURE__*/jsx(Spacer, {
507
- id: "left-spacer"
508
- }), /*#__PURE__*/jsx(TabPanel, {
509
- tabId: `${name}-tab-${index}`,
510
- id: `${name}-panel-${index}`,
511
- style: {
512
- width: hidePanelOverflow ? `${this.containerWidth}px` : '100%',
513
- display: hidePanelOverflow || index === selected ? 'block' : 'none'
514
- },
515
- children: content
516
- }, tabs[index].title), index === selected && /*#__PURE__*/jsx(Spacer, {
517
- id: "right-spacer"
518
- })]
519
- }, `${tabs[index].title}-fragment`) : null)
520
- })
521
- })
363
+ children: selectedTab.content
364
+ }, selectedTab.title) : null
522
365
  })]
523
366
  });
524
367
  }
@@ -1 +1 @@
1
- {"version":3,"file":"Tabs.mjs","sources":["../../src/tabs/Tabs.tsx"],"sourcesContent":["import { Spring, animated } from '@react-spring/web';\nimport { clsx } from 'clsx';\nimport clamp from 'lodash.clamp';\nimport { Component, createRef, Fragment } from 'react';\n\nimport { Size, Width, Direction } from '../common';\nimport { DirectionContext } from '../provider/direction';\n\nimport Tab from './Tab';\nimport TabList from './TabList';\nimport TabPanel from './TabPanel';\nimport {\n getElasticDragDifference,\n getSwipeDifference,\n swipedLeftToRight,\n swipedRightToLeft,\n swipeShouldChangeTab,\n getVelocity,\n Swipe,\n} from './utils';\n\nconst MIN_INDEX = 0;\n\nexport interface TabItem {\n title: string;\n content: React.ReactNode;\n disabled: boolean;\n}\n\ntype TabsTransitionSpacing =\n | 'default'\n | `${Size.EXTRA_SMALL | Size.SMALL | Size.MEDIUM | Size.LARGE}`;\n\nexport interface TabsProps {\n tabs: TabItem[];\n selected: number;\n name: string;\n animatePanelsOnClick?: boolean;\n changeTabOnSwipe?: boolean;\n className?: string;\n transitionSpacing?: TabsTransitionSpacing;\n headerWidth?: `${Width}`;\n id?: string;\n onTabSelect: (index: number) => void;\n}\n\ninterface TabsState {\n start: Swipe | null;\n translateX: number;\n translateFrom: number;\n translateTo: number;\n translateLineX: string | null;\n isAnimating: boolean;\n isSwiping: boolean;\n isScrolling: boolean;\n lastSwipeVelocity: number;\n fullWidthTabs: boolean;\n currentSwipe: Swipe[];\n selectedTabIndex: number;\n}\n\nconst SpacerWidth = {\n default: 0,\n xs: 8,\n sm: 16,\n md: 24,\n lg: 32,\n} satisfies Record<TabsTransitionSpacing, number>;\n\nexport default class Tabs extends Component<TabsProps, TabsState> {\n declare props: TabsProps & Required<Pick<TabsProps, keyof typeof Tabs.defaultProps>>;\n\n static defaultProps = {\n changeTabOnSwipe: true,\n transitionSpacing: 'default',\n headerWidth: Width.BLOCK,\n } satisfies Partial<TabsProps>;\n\n containerReference = createRef<HTMLDivElement>();\n\n constructor(props: Tabs['props']) {\n super(props);\n this.state = {\n start: null,\n translateX: 0,\n translateFrom: 0,\n translateTo: 0,\n translateLineX: null,\n isAnimating: false,\n isSwiping: false,\n isScrolling: false,\n lastSwipeVelocity: 0,\n fullWidthTabs: props.headerWidth === Width.BLOCK,\n currentSwipe: [],\n selectedTabIndex: props.selected,\n };\n }\n\n container: HTMLDivElement | null = null;\n\n containerWidth = 0;\n\n tabRefs: (HTMLLIElement | null)[] = [];\n\n get filteredTabsLength() {\n return this.props.tabs.filter((tab) => !tab.disabled).length;\n }\n\n get MAX_INDEX() {\n return this.props.tabs.length - 1;\n }\n\n componentDidMount() {\n const { selected } = this.props;\n\n this.setTabWidth();\n this.switchTab(clamp(selected, MIN_INDEX, this.MAX_INDEX));\n this.animateToTab(clamp(selected, MIN_INDEX, this.MAX_INDEX), true);\n document.body.addEventListener('touchmove', this.disableScroll, { passive: false });\n document.body.addEventListener('touchforcechange', this.disableScroll, { passive: false });\n window.addEventListener('resize', this.handleResize);\n }\n\n componentDidUpdate(previousProps: TabsProps, previousState: TabsState) {\n const currentSelected = this.props.selected;\n const previousSelected = previousProps.selected;\n const currentSelectedTab = this.props.tabs[currentSelected];\n const currentSelectedTabIsDisabled = currentSelectedTab?.disabled;\n const previousSelectedTab = previousProps.tabs[previousSelected];\n const previousSelectedTabIsDisabled = previousSelectedTab?.disabled;\n const currentTabsLength = this.props.tabs.length;\n const previousTabsLength = previousProps.tabs.length;\n const currentDisabledTabsLength = this.props.tabs.filter((tab) => !tab.disabled).length;\n const previousDisabledTabsLength = previousProps.tabs.filter((tab) => !tab.disabled).length;\n const currentHeaderWidth = this.props.headerWidth;\n const previousFullHeaderWidth = previousProps.headerWidth;\n const { animatePanelsOnClick } = this.props;\n const instantOnClick = !animatePanelsOnClick && !previousState.isSwiping;\n\n if (\n currentHeaderWidth !== previousFullHeaderWidth ||\n currentTabsLength !== previousTabsLength\n ) {\n this.setTabWidth();\n }\n\n if (\n currentSelected !== previousSelected ||\n currentDisabledTabsLength !== previousDisabledTabsLength ||\n currentSelectedTabIsDisabled !== previousSelectedTabIsDisabled\n ) {\n this.animateToTab(\n clamp(currentSelected, MIN_INDEX, this.MAX_INDEX),\n currentSelected === previousSelected || instantOnClick,\n );\n }\n }\n\n componentWillUnmount() {\n document.body.removeEventListener('touchmove', this.disableScroll);\n document.body.removeEventListener('touchforcechange', this.disableScroll);\n window.removeEventListener('resize', this.handleResize);\n }\n\n handleResize = () => {\n this.setContainerWidth(this.container);\n\n this.setState(({ selectedTabIndex }) => ({\n translateTo: -(this.containerWidth * selectedTabIndex),\n }));\n };\n\n setContainerRefAndWidth = (node: HTMLDivElement | null) => {\n this.container = node;\n this.setContainerWidth(node);\n };\n\n setContainerWidth = (node: HTMLDivElement | null) => {\n if (!node) {\n return;\n }\n\n const { width } = node.getBoundingClientRect();\n\n this.containerWidth = width;\n };\n\n isTabDisabled = (index: number) => {\n const { tabs } = this.props;\n\n return tabs[index]?.disabled ?? false;\n };\n\n getAllTabsWidth = () => {\n return this.tabRefs\n .map((reference) => {\n return reference ? reference.getBoundingClientRect().width : 0;\n })\n .reduce((a, b) => a + b, 0);\n };\n\n getDistanceToSelectedTab = (selectedTabIndex: number) => {\n return this.tabRefs\n .filter((_, idx) => idx < selectedTabIndex)\n .map((reference) => (reference ? reference.getBoundingClientRect().width : 0))\n .reduce((a, b) => a + b, 0);\n };\n\n setTabWidth = () => {\n const { fullWidthTabs } = this.state;\n const { headerWidth, selected } = this.props;\n\n const allTabsWidth = this.getAllTabsWidth();\n\n if (!fullWidthTabs && (headerWidth === Width.BLOCK || this.containerWidth < allTabsWidth)) {\n this.setState({ fullWidthTabs: true, translateLineX: `${selected * 100}%` });\n }\n if (fullWidthTabs && headerWidth === Width.AUTO && this.containerWidth >= allTabsWidth) {\n this.setState({\n fullWidthTabs: false,\n translateLineX: `${this.getDistanceToSelectedTab(selected)}px`,\n });\n }\n };\n\n getTabLineWidth = () => {\n const { fullWidthTabs } = this.state;\n const { selected, tabs } = this.props;\n\n if (fullWidthTabs) {\n return `${(1 / tabs.length) * 100}%`;\n }\n\n const reference = this.tabRefs[selected] || this.tabRefs[this.tabRefs.length - 1];\n const width = reference ? reference.getBoundingClientRect().width : 0;\n return `${width}px`;\n };\n\n /*\n * Gets the next tab that should be selected based on the swipe direction\n * and the current selected tab (is called recursively to account for disabled tabs).\n */\n getTabToSelect = (selected: number, start: Swipe, end: Swipe): number => {\n let nextSelected = selected;\n\n if (swipedLeftToRight(start, end)) {\n nextSelected -= 1;\n\n if (nextSelected > MIN_INDEX && this.isTabDisabled(nextSelected)) {\n return this.getTabToSelect(nextSelected, start, end);\n }\n } else if (swipedRightToLeft(start, end)) {\n nextSelected += 1;\n\n if (nextSelected < this.MAX_INDEX && this.isTabDisabled(nextSelected)) {\n return this.getTabToSelect(nextSelected, start, end);\n }\n }\n\n nextSelected = clamp(\n nextSelected,\n Math.max(selected - 1, MIN_INDEX),\n Math.min(selected + 1, this.MAX_INDEX),\n );\n\n if (this.isTabDisabled(nextSelected)) {\n return selected;\n }\n\n return nextSelected;\n };\n\n swipedOverHalfOfContainer = (difference: number) => difference / this.containerWidth >= 0.5;\n\n calculateApplicableDragDifference = ({\n currentSelected,\n nextSelected,\n start,\n end,\n }: {\n currentSelected: number;\n nextSelected: number;\n start: Swipe;\n end: Swipe;\n }) => {\n const difference = getSwipeDifference(start, end);\n const elasticDrag = getElasticDragDifference(difference);\n\n if (swipedLeftToRight(start, end)) {\n if (currentSelected > MIN_INDEX && currentSelected !== nextSelected) {\n return Math.min(difference, this.containerWidth);\n }\n return elasticDrag;\n }\n if (swipedRightToLeft(start, end)) {\n if (currentSelected < this.MAX_INDEX && currentSelected !== nextSelected) {\n return -Math.min(difference, this.containerWidth);\n }\n return -elasticDrag;\n }\n\n return false;\n };\n\n switchTab = (index: number) => {\n const { onTabSelect } = this.props;\n onTabSelect(index);\n };\n\n getTabIndexWithoutDisabledTabs(index: number) {\n return index - this.props.tabs.slice(0, index).filter((tab) => tab.disabled).length;\n }\n\n animateToTab = (index: number, instant?: boolean) => {\n this.animateLine(index);\n\n this.animatePanel(this.getTabIndexWithoutDisabledTabs(index), instant);\n };\n\n animateLine = (index: number) => {\n this.setState((previousState) => ({\n translateLineX: previousState.fullWidthTabs\n ? `${index * 100}%`\n : `${this.getDistanceToSelectedTab(index)}px`,\n }));\n };\n\n // Pass `instant` to set the `translateX` to the new panel with no transition\n animatePanel = (index: number, instant = false) => {\n const { translateTo: currentTranslateTo } = this.state;\n\n const translateFrom = currentTranslateTo;\n const translateTo = -(this.containerWidth * index);\n\n this.setState({\n selectedTabIndex: index,\n isAnimating: !instant && translateFrom !== translateTo,\n translateFrom,\n translateTo,\n });\n };\n\n disableScroll = (event: Event) => {\n const { isSwiping } = this.state;\n\n if (isSwiping) {\n event.preventDefault();\n }\n };\n\n handleTabClick = (index: number) => () => {\n this.switchTab(index);\n };\n\n onKeyDown = (index: number) => (event: React.KeyboardEvent<HTMLLIElement>) => {\n if (event && event.key === 'Enter') {\n this.switchTab(index);\n }\n };\n\n handleTouchStart: React.TouchEventHandler<HTMLDivElement> = (event) => {\n const start = {\n x: event.nativeEvent.touches[0].clientX,\n y: event.nativeEvent.touches[0].clientY,\n time: Date.now(),\n };\n this.setState({\n start,\n currentSwipe: [start],\n });\n\n event.persist();\n };\n\n handleTouchMove: React.TouchEventHandler<HTMLDivElement> = (event) => {\n const { start } = this.state;\n if (start == null) {\n return;\n }\n\n const { selected: currentSelectedFromProps } = this.props;\n const selected = this.getTabIndexWithoutDisabledTabs(currentSelectedFromProps);\n const end: Swipe = {\n x: event.nativeEvent.changedTouches[0].clientX,\n y: event.nativeEvent.changedTouches[0].clientY,\n time: Date.now(),\n };\n const difference = getSwipeDifference(start, end);\n const yAxisDifference = getSwipeDifference(start, end, 'y');\n let { isScrolling, isSwiping } = this.state;\n\n event.persist();\n\n if (!isScrolling && !isSwiping) {\n if (difference > yAxisDifference) {\n isSwiping = true;\n } else {\n isScrolling = true;\n }\n }\n\n this.setState({ isScrolling, isSwiping });\n\n if (isSwiping) {\n const nextSelected = this.getTabToSelect(currentSelectedFromProps, start, end);\n this.animateLine(\n this.swipedOverHalfOfContainer(difference) ? nextSelected : currentSelectedFromProps,\n );\n\n const dragDifference = this.calculateApplicableDragDifference({\n currentSelected: currentSelectedFromProps,\n nextSelected,\n start,\n end,\n });\n\n const translateX = dragDifference\n ? -(this.containerWidth * selected) + dragDifference\n : false;\n\n this.setState((state) => ({\n currentSwipe: [...state.currentSwipe, end],\n translateFrom: translateX || state.translateFrom,\n translateTo: translateX || state.translateTo,\n }));\n }\n };\n\n handleTouchEnd: React.TouchEventHandler<HTMLDivElement> = (event) => {\n const { start, isSwiping } = this.state;\n if (start == null) {\n return;\n }\n\n const { selected } = this.props;\n const end: Swipe = {\n x: event.nativeEvent.changedTouches[0].clientX,\n y: event.nativeEvent.changedTouches[0].clientY,\n time: Date.now(),\n };\n const difference = getSwipeDifference(start, end);\n const velocity = getVelocity([...this.state.currentSwipe, end]);\n\n this.setState({\n currentSwipe: [],\n });\n\n let nextSelected = selected;\n\n event.persist();\n\n if (isSwiping) {\n if (swipeShouldChangeTab(start, end) || this.swipedOverHalfOfContainer(difference)) {\n nextSelected = this.getTabToSelect(nextSelected, start, end);\n }\n\n if (nextSelected !== selected) {\n this.switchTab(nextSelected);\n\n this.setState({\n lastSwipeVelocity: velocity,\n });\n } else {\n this.animateToTab(nextSelected);\n }\n }\n\n this.setState({ isSwiping: false, isScrolling: false });\n };\n\n render() {\n const { tabs, changeTabOnSwipe, name, selected, className, transitionSpacing, headerWidth } =\n this.props;\n const {\n isSwiping,\n translateLineX,\n isAnimating,\n translateFrom,\n translateTo,\n lastSwipeVelocity,\n fullWidthTabs,\n } = this.state;\n\n const spacer = SpacerWidth[transitionSpacing];\n\n const tabsLength = this.filteredTabsLength;\n\n const distanceSwiped = Math.abs(-translateFrom - this.containerWidth * selected);\n\n const remainingContainerToTravel = isSwiping\n ? 1 - distanceSwiped / this.containerWidth\n : 1 - Math.abs(distanceSwiped / this.containerWidth - 1);\n\n const restrictedVelocity =\n (Number.isNaN(remainingContainerToTravel) ? 0 : remainingContainerToTravel) *\n Math.min(10 * Math.E, lastSwipeVelocity * 10 * Math.E);\n\n const hidePanelOverflow = isAnimating || isSwiping;\n\n const sliderWidth = tabsLength * this.containerWidth + spacer * 2;\n\n // Uses `props.panelTransitionSpacing` to add a spacer in-between the `TabPanel` you're transitioning to/from\n const Spacer = ({ id }: { id: string }) =>\n spacer > 0 && (\n <div\n key={id}\n style={{\n width: spacer,\n display: hidePanelOverflow ? 'block' : 'none',\n }}\n />\n );\n\n return (\n <DirectionContext.Consumer>\n {(direction) => {\n const isRTL = direction === Direction.RTL;\n return (\n <div\n ref={this.containerReference}\n className={clsx('tabs', className, {\n 'tabs--auto-width': headerWidth === Width.AUTO,\n })}\n onTouchStart={changeTabOnSwipe ? this.handleTouchStart : undefined}\n onTouchEnd={changeTabOnSwipe ? this.handleTouchEnd : undefined}\n onTouchMove={changeTabOnSwipe ? this.handleTouchMove : undefined}\n >\n <TabList>\n {tabs.map(({ title, disabled }, index) => {\n return (\n <Tab\n key={title}\n ref={(node) => {\n this.tabRefs[index] = node;\n }}\n id={`${name}-tab-${index}`}\n panelId={`${name}-panel-${index}`}\n selected={selected === index}\n disabled={disabled}\n focusTab={() => {\n if (this.containerReference.current?.contains(document.activeElement)) {\n this.tabRefs[index]?.focus();\n }\n }}\n onClick={disabled ? undefined : this.handleTabClick(index)}\n onKeyDown={this.onKeyDown(index)}\n {...(fullWidthTabs\n ? { style: { width: `${(1 / tabs.length) * 100}%` } }\n : {})}\n >\n {title}\n </Tab>\n );\n })}\n {translateLineX ? (\n <li\n role=\"none\"\n className=\"tabs__line\"\n style={{\n width: this.getTabLineWidth(),\n transform: isRTL\n ? `translateX(-${translateLineX})`\n : `translateX(${translateLineX})`,\n }}\n />\n ) : null}\n </TabList>\n <div\n ref={this.setContainerRefAndWidth}\n className=\"tabs__panel-container\"\n style={{\n overflow: hidePanelOverflow ? 'hidden' : 'visible',\n }}\n >\n <Spring\n from={{\n transform: `translateX(${translateFrom - spacer}px)`,\n }}\n to={{\n transform: `translateX(${translateTo - spacer}px)`,\n }}\n config={{\n precision: isSwiping ? 1 : 0.01,\n velocity: !isSwiping ? restrictedVelocity : 0,\n clamp: true,\n }}\n onRest={() => {\n if (isAnimating) {\n this.setState({\n isAnimating: false,\n lastSwipeVelocity: 0,\n });\n }\n }}\n >\n {(props) => (\n <animated.div\n className=\"tabs__slider\"\n style={{\n width: hidePanelOverflow ? `${sliderWidth}px` : '100%',\n transform: hidePanelOverflow ? props.transform : 'translateX(0px)',\n }}\n >\n {tabs.map(({ content, disabled }, index) =>\n !disabled ? (\n <Fragment key={`${tabs[index].title}-fragment`}>\n {index === selected && <Spacer id=\"left-spacer\" />}\n <TabPanel\n key={tabs[index].title}\n tabId={`${name}-tab-${index}`}\n id={`${name}-panel-${index}`}\n style={{\n width: hidePanelOverflow ? `${this.containerWidth}px` : '100%',\n display: hidePanelOverflow || index === selected ? 'block' : 'none',\n }}\n >\n {content}\n </TabPanel>\n {index === selected && <Spacer id=\"right-spacer\" />}\n </Fragment>\n ) : null,\n )}\n </animated.div>\n )}\n </Spring>\n </div>\n </div>\n );\n }}\n </DirectionContext.Consumer>\n );\n }\n}\n"],"names":["MIN_INDEX","SpacerWidth","default","xs","sm","md","lg","Tabs","Component","defaultProps","changeTabOnSwipe","transitionSpacing","headerWidth","Width","BLOCK","containerReference","createRef","constructor","props","state","start","translateX","translateFrom","translateTo","translateLineX","isAnimating","isSwiping","isScrolling","lastSwipeVelocity","fullWidthTabs","currentSwipe","selectedTabIndex","selected","container","containerWidth","tabRefs","filteredTabsLength","tabs","filter","tab","disabled","length","MAX_INDEX","componentDidMount","setTabWidth","switchTab","clamp","animateToTab","document","body","addEventListener","disableScroll","passive","window","handleResize","componentDidUpdate","previousProps","previousState","currentSelected","previousSelected","currentSelectedTab","currentSelectedTabIsDisabled","previousSelectedTab","previousSelectedTabIsDisabled","currentTabsLength","previousTabsLength","currentDisabledTabsLength","previousDisabledTabsLength","currentHeaderWidth","previousFullHeaderWidth","animatePanelsOnClick","instantOnClick","componentWillUnmount","removeEventListener","setContainerWidth","setState","setContainerRefAndWidth","node","width","getBoundingClientRect","isTabDisabled","index","getAllTabsWidth","map","reference","reduce","a","b","getDistanceToSelectedTab","_","idx","allTabsWidth","AUTO","getTabLineWidth","getTabToSelect","end","nextSelected","swipedLeftToRight","swipedRightToLeft","Math","max","min","swipedOverHalfOfContainer","difference","calculateApplicableDragDifference","getSwipeDifference","elasticDrag","getElasticDragDifference","onTabSelect","getTabIndexWithoutDisabledTabs","slice","instant","animateLine","animatePanel","currentTranslateTo","event","preventDefault","handleTabClick","onKeyDown","key","handleTouchStart","x","nativeEvent","touches","clientX","y","clientY","time","Date","now","persist","handleTouchMove","currentSelectedFromProps","changedTouches","yAxisDifference","dragDifference","handleTouchEnd","velocity","getVelocity","swipeShouldChangeTab","render","name","className","spacer","tabsLength","distanceSwiped","abs","remainingContainerToTravel","restrictedVelocity","Number","isNaN","E","hidePanelOverflow","sliderWidth","Spacer","id","_jsx","style","display","DirectionContext","Consumer","children","direction","isRTL","Direction","RTL","_jsxs","ref","clsx","onTouchStart","undefined","onTouchEnd","onTouchMove","TabList","title","Tab","panelId","focusTab","current","contains","activeElement","focus","onClick","role","transform","overflow","Spring","from","to","config","precision","onRest","animated","div","content","Fragment","TabPanel","tabId"],"mappings":"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"}
1
+ {"version":3,"file":"Tabs.mjs","sources":["../../src/tabs/Tabs.tsx"],"sourcesContent":["import { clsx } from 'clsx';\nimport clamp from 'lodash.clamp';\nimport { Component, createRef } from 'react';\n\nimport { Width, Direction } from '../common';\nimport { DirectionContext } from '../provider/direction';\n\nimport Tab from './Tab';\nimport TabList from './TabList';\nimport TabPanel from './TabPanel';\nimport {\n getSwipeDifference,\n swipedLeftToRight,\n swipedRightToLeft,\n swipeShouldChangeTab,\n Swipe,\n} from './utils';\n\nconst MIN_INDEX = 0;\n\nexport interface TabItem {\n title: string;\n content: React.ReactNode;\n disabled: boolean;\n}\n\nexport interface TabsProps {\n tabs: TabItem[];\n selected: number;\n name: string;\n changeTabOnSwipe?: boolean;\n className?: string;\n headerWidth?: `${Width}`;\n onTabSelect: (index: number) => void;\n}\n\ninterface TabsState {\n start: Swipe | null;\n translateLineX: string | null;\n isSwiping: boolean;\n isScrolling: boolean;\n fullWidthTabs: boolean;\n}\n\nexport default class Tabs extends Component<TabsProps, TabsState> {\n declare props: TabsProps & Required<Pick<TabsProps, keyof typeof Tabs.defaultProps>>;\n\n static defaultProps = {\n changeTabOnSwipe: true,\n headerWidth: Width.BLOCK,\n } satisfies Partial<TabsProps>;\n\n containerReference = createRef<HTMLDivElement>();\n\n constructor(props: Tabs['props']) {\n super(props);\n this.state = {\n start: null,\n translateLineX: null,\n isSwiping: false,\n isScrolling: false,\n fullWidthTabs: props.headerWidth === Width.BLOCK,\n };\n }\n\n container: HTMLDivElement | null = null;\n\n containerWidth = 0;\n\n tabRefs: (HTMLLIElement | null)[] = [];\n\n get MAX_INDEX() {\n return this.props.tabs.length - 1;\n }\n\n componentDidMount() {\n const { selected } = this.props;\n\n this.setTabWidth();\n this.switchTab(clamp(selected, MIN_INDEX, this.MAX_INDEX));\n this.animateLine(clamp(selected, MIN_INDEX, this.MAX_INDEX));\n document.body.addEventListener('touchmove', this.disableScroll, { passive: false });\n document.body.addEventListener('touchforcechange', this.disableScroll, { passive: false });\n window.addEventListener('resize', this.handleResize);\n }\n\n componentDidUpdate(previousProps: TabsProps) {\n const currentSelected = this.props.selected;\n const previousSelected = previousProps.selected;\n const currentSelectedTab = this.props.tabs[currentSelected];\n const currentSelectedTabIsDisabled = currentSelectedTab?.disabled;\n const previousSelectedTab = previousProps.tabs[previousSelected];\n const previousSelectedTabIsDisabled = previousSelectedTab?.disabled;\n const currentTabsLength = this.props.tabs.length;\n const previousTabsLength = previousProps.tabs.length;\n const currentDisabledTabsLength = this.props.tabs.filter((tab) => !tab.disabled).length;\n const previousDisabledTabsLength = previousProps.tabs.filter((tab) => !tab.disabled).length;\n const currentHeaderWidth = this.props.headerWidth;\n const previousFullHeaderWidth = previousProps.headerWidth;\n\n if (\n currentHeaderWidth !== previousFullHeaderWidth ||\n currentTabsLength !== previousTabsLength\n ) {\n this.setTabWidth();\n }\n\n if (\n currentSelected !== previousSelected ||\n currentDisabledTabsLength !== previousDisabledTabsLength ||\n currentSelectedTabIsDisabled !== previousSelectedTabIsDisabled\n ) {\n this.animateLine(clamp(currentSelected, MIN_INDEX, this.MAX_INDEX));\n }\n }\n\n componentWillUnmount() {\n document.body.removeEventListener('touchmove', this.disableScroll);\n document.body.removeEventListener('touchforcechange', this.disableScroll);\n window.removeEventListener('resize', this.handleResize);\n }\n\n handleResize = () => {\n this.setContainerWidth(this.container);\n };\n\n setContainerRefAndWidth = (node: HTMLDivElement | null) => {\n this.container = node;\n this.setContainerWidth(node);\n };\n\n setContainerWidth = (node: HTMLDivElement | null) => {\n if (!node) {\n return;\n }\n\n const { width } = node.getBoundingClientRect();\n\n this.containerWidth = width;\n };\n\n isTabDisabled = (index: number) => {\n const { tabs } = this.props;\n\n return tabs[index]?.disabled ?? false;\n };\n\n getAllTabsWidth = () => {\n return this.tabRefs\n .map((reference) => {\n return reference ? reference.getBoundingClientRect().width : 0;\n })\n .reduce((a, b) => a + b, 0);\n };\n\n getDistanceToSelectedTab = (selectedTabIndex: number) => {\n return this.tabRefs\n .filter((_, idx) => idx < selectedTabIndex)\n .map((reference) => (reference ? reference.getBoundingClientRect().width : 0))\n .reduce((a, b) => a + b, 0);\n };\n\n setTabWidth = () => {\n const { fullWidthTabs } = this.state;\n const { headerWidth, selected } = this.props;\n\n const allTabsWidth = this.getAllTabsWidth();\n\n if (!fullWidthTabs && (headerWidth === Width.BLOCK || this.containerWidth < allTabsWidth)) {\n this.setState({ fullWidthTabs: true, translateLineX: `${selected * 100}%` });\n }\n if (fullWidthTabs && headerWidth === Width.AUTO && this.containerWidth >= allTabsWidth) {\n this.setState({\n fullWidthTabs: false,\n translateLineX: `${this.getDistanceToSelectedTab(selected)}px`,\n });\n }\n };\n\n getTabLineWidth = () => {\n const { fullWidthTabs } = this.state;\n const { selected, tabs } = this.props;\n\n if (fullWidthTabs) {\n return `${(1 / tabs.length) * 100}%`;\n }\n\n const reference = this.tabRefs[selected] || this.tabRefs[this.tabRefs.length - 1];\n const width = reference ? reference.getBoundingClientRect().width : 0;\n return `${width}px`;\n };\n\n /*\n * Gets the next tab that should be selected based on the swipe direction\n * and the current selected tab (is called recursively to account for disabled tabs).\n */\n getTabToSelect = (selected: number, start: Swipe, end: Swipe): number => {\n let nextSelected = selected;\n\n if (swipedLeftToRight(start, end)) {\n nextSelected -= 1;\n\n if (nextSelected > MIN_INDEX && this.isTabDisabled(nextSelected)) {\n return this.getTabToSelect(nextSelected, start, end);\n }\n } else if (swipedRightToLeft(start, end)) {\n nextSelected += 1;\n\n if (nextSelected < this.MAX_INDEX && this.isTabDisabled(nextSelected)) {\n return this.getTabToSelect(nextSelected, start, end);\n }\n }\n\n nextSelected = clamp(\n nextSelected,\n Math.max(selected - 1, MIN_INDEX),\n Math.min(selected + 1, this.MAX_INDEX),\n );\n\n if (this.isTabDisabled(nextSelected)) {\n return selected;\n }\n\n return nextSelected;\n };\n\n swipedOverHalfOfContainer = (difference: number) => difference / this.containerWidth >= 0.5;\n\n switchTab = (index: number) => {\n const { onTabSelect } = this.props;\n onTabSelect(index);\n };\n\n animateLine = (index: number) => {\n this.setState((previousState) => ({\n translateLineX: previousState.fullWidthTabs\n ? `${index * 100}%`\n : `${this.getDistanceToSelectedTab(index)}px`,\n }));\n };\n\n disableScroll = (event: Event) => {\n const { isSwiping } = this.state;\n\n if (isSwiping) {\n event.preventDefault();\n }\n };\n\n handleTabClick = (index: number) => () => {\n this.switchTab(index);\n };\n\n onKeyDown = (index: number) => (event: React.KeyboardEvent<HTMLLIElement>) => {\n if (event && event.key === 'Enter') {\n this.switchTab(index);\n }\n };\n\n handleTouchStart: React.TouchEventHandler<HTMLDivElement> = (event) => {\n const start = {\n x: event.nativeEvent.touches[0].clientX,\n y: event.nativeEvent.touches[0].clientY,\n time: Date.now(),\n };\n this.setState({\n start,\n });\n };\n\n handleTouchMove: React.TouchEventHandler<HTMLDivElement> = (event) => {\n const { start } = this.state;\n if (start == null) {\n return;\n }\n\n const { selected: currentSelectedFromProps } = this.props;\n const end: Swipe = {\n x: event.nativeEvent.changedTouches[0].clientX,\n y: event.nativeEvent.changedTouches[0].clientY,\n time: Date.now(),\n };\n const difference = getSwipeDifference(start, end);\n const yAxisDifference = getSwipeDifference(start, end, 'y');\n let { isScrolling, isSwiping } = this.state;\n\n if (!isScrolling && !isSwiping) {\n if (difference > yAxisDifference) {\n isSwiping = true;\n } else {\n isScrolling = true;\n }\n }\n\n this.setState({ isScrolling, isSwiping });\n\n if (isSwiping) {\n const nextSelected = this.getTabToSelect(currentSelectedFromProps, start, end);\n this.animateLine(\n this.swipedOverHalfOfContainer(difference) ? nextSelected : currentSelectedFromProps,\n );\n }\n };\n\n handleTouchEnd: React.TouchEventHandler<HTMLDivElement> = (event) => {\n const { start, isSwiping } = this.state;\n if (start == null) {\n return;\n }\n\n const { selected } = this.props;\n const end: Swipe = {\n x: event.nativeEvent.changedTouches[0].clientX,\n y: event.nativeEvent.changedTouches[0].clientY,\n time: Date.now(),\n };\n const difference = getSwipeDifference(start, end);\n\n let nextSelected = selected;\n\n if (isSwiping) {\n if (swipeShouldChangeTab(start, end) || this.swipedOverHalfOfContainer(difference)) {\n nextSelected = this.getTabToSelect(nextSelected, start, end);\n }\n\n if (nextSelected !== selected) {\n this.switchTab(nextSelected);\n } else {\n this.animateLine(nextSelected);\n }\n }\n\n this.setState({ isSwiping: false, isScrolling: false });\n };\n\n render() {\n const { tabs, changeTabOnSwipe, name, selected, className, headerWidth } = this.props;\n const { translateLineX, fullWidthTabs } = this.state;\n\n const selectedTab = tabs[selected];\n\n return (\n <DirectionContext.Consumer>\n {(direction) => {\n const isRTL = direction === Direction.RTL;\n return (\n <div\n ref={this.containerReference}\n className={clsx('tabs', className, {\n 'tabs--auto-width': headerWidth === Width.AUTO,\n })}\n onTouchStart={changeTabOnSwipe ? this.handleTouchStart : undefined}\n onTouchEnd={changeTabOnSwipe ? this.handleTouchEnd : undefined}\n onTouchMove={changeTabOnSwipe ? this.handleTouchMove : undefined}\n >\n <TabList>\n {tabs.map(({ title, disabled }, index) => {\n return (\n <Tab\n key={title}\n ref={(node) => {\n this.tabRefs[index] = node;\n }}\n id={`${name}-tab-${index}`}\n panelId={`${name}-panel-${index}`}\n selected={selected === index}\n disabled={disabled}\n focusTab={() => {\n if (this.containerReference.current?.contains(document.activeElement)) {\n this.tabRefs[index]?.focus();\n }\n }}\n onClick={disabled ? undefined : this.handleTabClick(index)}\n onKeyDown={this.onKeyDown(index)}\n {...(fullWidthTabs\n ? { style: { width: `${(1 / tabs.length) * 100}%` } }\n : {})}\n >\n {title}\n </Tab>\n );\n })}\n {translateLineX ? (\n <li\n role=\"none\"\n className=\"tabs__line\"\n style={{\n width: this.getTabLineWidth(),\n transform: isRTL\n ? `translateX(-${translateLineX})`\n : `translateX(${translateLineX})`,\n }}\n />\n ) : null}\n </TabList>\n <div ref={this.setContainerRefAndWidth} className=\"tabs__panel-container\">\n {selectedTab && !selectedTab.disabled ? (\n <TabPanel\n key={selectedTab.title}\n tabId={`${name}-tab-${selected}`}\n id={`${name}-panel-${selected}`}\n style={{\n width: '100%',\n }}\n >\n {selectedTab.content}\n </TabPanel>\n ) : null}\n </div>\n </div>\n );\n }}\n </DirectionContext.Consumer>\n );\n }\n}\n"],"names":["MIN_INDEX","Tabs","Component","defaultProps","changeTabOnSwipe","headerWidth","Width","BLOCK","containerReference","createRef","constructor","props","state","start","translateLineX","isSwiping","isScrolling","fullWidthTabs","container","containerWidth","tabRefs","MAX_INDEX","tabs","length","componentDidMount","selected","setTabWidth","switchTab","clamp","animateLine","document","body","addEventListener","disableScroll","passive","window","handleResize","componentDidUpdate","previousProps","currentSelected","previousSelected","currentSelectedTab","currentSelectedTabIsDisabled","disabled","previousSelectedTab","previousSelectedTabIsDisabled","currentTabsLength","previousTabsLength","currentDisabledTabsLength","filter","tab","previousDisabledTabsLength","currentHeaderWidth","previousFullHeaderWidth","componentWillUnmount","removeEventListener","setContainerWidth","setContainerRefAndWidth","node","width","getBoundingClientRect","isTabDisabled","index","getAllTabsWidth","map","reference","reduce","a","b","getDistanceToSelectedTab","selectedTabIndex","_","idx","allTabsWidth","setState","AUTO","getTabLineWidth","getTabToSelect","end","nextSelected","swipedLeftToRight","swipedRightToLeft","Math","max","min","swipedOverHalfOfContainer","difference","onTabSelect","previousState","event","preventDefault","handleTabClick","onKeyDown","key","handleTouchStart","x","nativeEvent","touches","clientX","y","clientY","time","Date","now","handleTouchMove","currentSelectedFromProps","changedTouches","getSwipeDifference","yAxisDifference","handleTouchEnd","swipeShouldChangeTab","render","name","className","selectedTab","_jsx","DirectionContext","Consumer","children","direction","isRTL","Direction","RTL","_jsxs","ref","clsx","onTouchStart","undefined","onTouchEnd","onTouchMove","TabList","title","Tab","id","panelId","focusTab","current","contains","activeElement","focus","onClick","style","role","transform","TabPanel","tabId","content"],"mappings":"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"}
@@ -22,27 +22,9 @@ const swipeShouldChangeTab = (start, end) => {
22
22
  const velocity = getSwipeVelocity(start, end);
23
23
  return swipedSignificantDistance(difference) && swipedWithSignificantVelocity(velocity);
24
24
  };
25
- function getVelocity(coords) {
26
- try {
27
- const relevant = coords.slice(Math.max(coords.length - 5, 1));
28
- const first = relevant[0];
29
- const last = relevant[relevant.length - 1];
30
- return Math.abs(first.x - last.x) / (last.time - first.time);
31
- } catch {
32
- return 0;
33
- }
34
- }
35
- /*
36
- `elasticDrag` is the translateX value, which slows down as the difference increases
37
- `1 - Math.E ** (-0.005 * difference)` provides a % value of how far we want to translate (0.005 being the rate)
38
- `Math.min(150, window.innerWidth / 3)` provides the maximum translate value
39
- */
40
- const getElasticDragDifference = difference => Math.min(150, window.innerWidth / 3) * (1 - Math.E ** (-5e-3 * difference));
41
25
 
42
- exports.getElasticDragDifference = getElasticDragDifference;
43
26
  exports.getSwipeDifference = getSwipeDifference;
44
27
  exports.getSwipeVelocity = getSwipeVelocity;
45
- exports.getVelocity = getVelocity;
46
28
  exports.swipeShouldChangeTab = swipeShouldChangeTab;
47
29
  exports.swipedLeftToRight = swipedLeftToRight;
48
30
  exports.swipedRightToLeft = swipedRightToLeft;
@@ -1 +1 @@
1
- {"version":3,"file":"utils.js","sources":["../../src/tabs/utils.ts"],"sourcesContent":["const MIN_SWIPE_DISTANCE = 50;\nconst MIN_SWIPE_VELOCITY = 0.1;\n\nconst swipedSignificantDistance = (difference: number) => Math.abs(difference) > MIN_SWIPE_DISTANCE;\n\nconst swipedWithSignificantVelocity = (velocity: number) => velocity > MIN_SWIPE_VELOCITY;\n\nexport interface Swipe {\n x: number;\n y: number;\n time: number;\n}\n\nexport const getSwipeVelocity = (start: Swipe, end: Swipe) => {\n const timePassed = end.time - start.time;\n\n return getSwipeDifference(start, end) / timePassed;\n};\n\nexport const getSwipeDifference = (start: Swipe, end: Swipe, axis: 'x' | 'y' = 'x') => {\n return Math.abs(start[axis] - end[axis]);\n};\n\nexport const swipedLeftToRight = (start: Swipe, end: Swipe) => {\n return end.x > start.x;\n};\n\nexport const swipedRightToLeft = (start: Swipe, end: Swipe) => {\n return start.x > end.x;\n};\n\nexport const swipeShouldChangeTab = (start: Swipe, end: Swipe) => {\n const difference = getSwipeDifference(start, end);\n const velocity = getSwipeVelocity(start, end);\n\n return swipedSignificantDistance(difference) && swipedWithSignificantVelocity(velocity);\n};\n\nexport function getVelocity(coords: Swipe[]) {\n try {\n const relevant = coords.slice(Math.max(coords.length - 5, 1));\n const first = relevant[0];\n const last = relevant[relevant.length - 1];\n\n return Math.abs(first.x - last.x) / (last.time - first.time);\n } catch {\n return 0;\n }\n}\n\n/*\n `elasticDrag` is the translateX value, which slows down as the difference increases\n `1 - Math.E ** (-0.005 * difference)` provides a % value of how far we want to translate (0.005 being the rate)\n `Math.min(150, window.innerWidth / 3)` provides the maximum translate value\n*/\nexport const getElasticDragDifference = (difference: number) =>\n Math.min(150, window.innerWidth / 3) * (1 - Math.E ** (-0.005 * difference));\n"],"names":["MIN_SWIPE_DISTANCE","MIN_SWIPE_VELOCITY","swipedSignificantDistance","difference","Math","abs","swipedWithSignificantVelocity","velocity","getSwipeVelocity","start","end","timePassed","time","getSwipeDifference","axis","swipedLeftToRight","x","swipedRightToLeft","swipeShouldChangeTab","getVelocity","coords","relevant","slice","max","length","first","last","getElasticDragDifference","min","window","innerWidth","E"],"mappings":";;AAAA,MAAMA,kBAAkB,GAAG,EAAE;AAC7B,MAAMC,kBAAkB,GAAG,GAAG;AAE9B,MAAMC,yBAAyB,GAAIC,UAAkB,IAAKC,IAAI,CAACC,GAAG,CAACF,UAAU,CAAC,GAAGH,kBAAkB;AAEnG,MAAMM,6BAA6B,GAAIC,QAAgB,IAAKA,QAAQ,GAAGN,kBAAkB;MAQ5EO,gBAAgB,GAAGA,CAACC,KAAY,EAAEC,GAAU,KAAI;EAC3D,MAAMC,UAAU,GAAGD,GAAG,CAACE,IAAI,GAAGH,KAAK,CAACG,IAAI;AAExC,EAAA,OAAOC,kBAAkB,CAACJ,KAAK,EAAEC,GAAG,CAAC,GAAGC,UAAU;AACpD;AAEO,MAAME,kBAAkB,GAAGA,CAACJ,KAAY,EAAEC,GAAU,EAAEI,IAAA,GAAkB,GAAG,KAAI;AACpF,EAAA,OAAOV,IAAI,CAACC,GAAG,CAACI,KAAK,CAACK,IAAI,CAAC,GAAGJ,GAAG,CAACI,IAAI,CAAC,CAAC;AAC1C;MAEaC,iBAAiB,GAAGA,CAACN,KAAY,EAAEC,GAAU,KAAI;AAC5D,EAAA,OAAOA,GAAG,CAACM,CAAC,GAAGP,KAAK,CAACO,CAAC;AACxB;MAEaC,iBAAiB,GAAGA,CAACR,KAAY,EAAEC,GAAU,KAAI;AAC5D,EAAA,OAAOD,KAAK,CAACO,CAAC,GAAGN,GAAG,CAACM,CAAC;AACxB;MAEaE,oBAAoB,GAAGA,CAACT,KAAY,EAAEC,GAAU,KAAI;AAC/D,EAAA,MAAMP,UAAU,GAAGU,kBAAkB,CAACJ,KAAK,EAAEC,GAAG,CAAC;AACjD,EAAA,MAAMH,QAAQ,GAAGC,gBAAgB,CAACC,KAAK,EAAEC,GAAG,CAAC;EAE7C,OAAOR,yBAAyB,CAACC,UAAU,CAAC,IAAIG,6BAA6B,CAACC,QAAQ,CAAC;AACzF;AAEM,SAAUY,WAAWA,CAACC,MAAe,EAAA;EACzC,IAAI;AACF,IAAA,MAAMC,QAAQ,GAAGD,MAAM,CAACE,KAAK,CAAClB,IAAI,CAACmB,GAAG,CAACH,MAAM,CAACI,MAAM,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC;AAC7D,IAAA,MAAMC,KAAK,GAAGJ,QAAQ,CAAC,CAAC,CAAC;IACzB,MAAMK,IAAI,GAAGL,QAAQ,CAACA,QAAQ,CAACG,MAAM,GAAG,CAAC,CAAC;IAE1C,OAAOpB,IAAI,CAACC,GAAG,CAACoB,KAAK,CAACT,CAAC,GAAGU,IAAI,CAACV,CAAC,CAAC,IAAIU,IAAI,CAACd,IAAI,GAAGa,KAAK,CAACb,IAAI,CAAC;AAC9D,EAAA,CAAC,CAAC,MAAM;AACN,IAAA,OAAO,CAAC;AACV,EAAA;AACF;AAEA;;;;AAIE;AACK,MAAMe,wBAAwB,GAAIxB,UAAkB,IACzDC,IAAI,CAACwB,GAAG,CAAC,GAAG,EAAEC,MAAM,CAACC,UAAU,GAAG,CAAC,CAAC,IAAI,CAAC,GAAG1B,IAAI,CAAC2B,CAAC,KAAK,KAAM,GAAG5B,UAAU,CAAC;;;;;;;;;;"}
1
+ {"version":3,"file":"utils.js","sources":["../../src/tabs/utils.ts"],"sourcesContent":["const MIN_SWIPE_DISTANCE = 50;\nconst MIN_SWIPE_VELOCITY = 0.1;\n\nconst swipedSignificantDistance = (difference: number) => Math.abs(difference) > MIN_SWIPE_DISTANCE;\n\nconst swipedWithSignificantVelocity = (velocity: number) => velocity > MIN_SWIPE_VELOCITY;\n\nexport interface Swipe {\n x: number;\n y: number;\n time: number;\n}\n\nexport const getSwipeVelocity = (start: Swipe, end: Swipe) => {\n const timePassed = end.time - start.time;\n\n return getSwipeDifference(start, end) / timePassed;\n};\n\nexport const getSwipeDifference = (start: Swipe, end: Swipe, axis: 'x' | 'y' = 'x') => {\n return Math.abs(start[axis] - end[axis]);\n};\n\nexport const swipedLeftToRight = (start: Swipe, end: Swipe) => {\n return end.x > start.x;\n};\n\nexport const swipedRightToLeft = (start: Swipe, end: Swipe) => {\n return start.x > end.x;\n};\n\nexport const swipeShouldChangeTab = (start: Swipe, end: Swipe) => {\n const difference = getSwipeDifference(start, end);\n const velocity = getSwipeVelocity(start, end);\n\n return swipedSignificantDistance(difference) && swipedWithSignificantVelocity(velocity);\n};\n"],"names":["MIN_SWIPE_DISTANCE","MIN_SWIPE_VELOCITY","swipedSignificantDistance","difference","Math","abs","swipedWithSignificantVelocity","velocity","getSwipeVelocity","start","end","timePassed","time","getSwipeDifference","axis","swipedLeftToRight","x","swipedRightToLeft","swipeShouldChangeTab"],"mappings":";;AAAA,MAAMA,kBAAkB,GAAG,EAAE;AAC7B,MAAMC,kBAAkB,GAAG,GAAG;AAE9B,MAAMC,yBAAyB,GAAIC,UAAkB,IAAKC,IAAI,CAACC,GAAG,CAACF,UAAU,CAAC,GAAGH,kBAAkB;AAEnG,MAAMM,6BAA6B,GAAIC,QAAgB,IAAKA,QAAQ,GAAGN,kBAAkB;MAQ5EO,gBAAgB,GAAGA,CAACC,KAAY,EAAEC,GAAU,KAAI;EAC3D,MAAMC,UAAU,GAAGD,GAAG,CAACE,IAAI,GAAGH,KAAK,CAACG,IAAI;AAExC,EAAA,OAAOC,kBAAkB,CAACJ,KAAK,EAAEC,GAAG,CAAC,GAAGC,UAAU;AACpD;AAEO,MAAME,kBAAkB,GAAGA,CAACJ,KAAY,EAAEC,GAAU,EAAEI,IAAA,GAAkB,GAAG,KAAI;AACpF,EAAA,OAAOV,IAAI,CAACC,GAAG,CAACI,KAAK,CAACK,IAAI,CAAC,GAAGJ,GAAG,CAACI,IAAI,CAAC,CAAC;AAC1C;MAEaC,iBAAiB,GAAGA,CAACN,KAAY,EAAEC,GAAU,KAAI;AAC5D,EAAA,OAAOA,GAAG,CAACM,CAAC,GAAGP,KAAK,CAACO,CAAC;AACxB;MAEaC,iBAAiB,GAAGA,CAACR,KAAY,EAAEC,GAAU,KAAI;AAC5D,EAAA,OAAOD,KAAK,CAACO,CAAC,GAAGN,GAAG,CAACM,CAAC;AACxB;MAEaE,oBAAoB,GAAGA,CAACT,KAAY,EAAEC,GAAU,KAAI;AAC/D,EAAA,MAAMP,UAAU,GAAGU,kBAAkB,CAACJ,KAAK,EAAEC,GAAG,CAAC;AACjD,EAAA,MAAMH,QAAQ,GAAGC,gBAAgB,CAACC,KAAK,EAAEC,GAAG,CAAC;EAE7C,OAAOR,yBAAyB,CAACC,UAAU,CAAC,IAAIG,6BAA6B,CAACC,QAAQ,CAAC;AACzF;;;;;;;;"}
@@ -20,22 +20,6 @@ const swipeShouldChangeTab = (start, end) => {
20
20
  const velocity = getSwipeVelocity(start, end);
21
21
  return swipedSignificantDistance(difference) && swipedWithSignificantVelocity(velocity);
22
22
  };
23
- function getVelocity(coords) {
24
- try {
25
- const relevant = coords.slice(Math.max(coords.length - 5, 1));
26
- const first = relevant[0];
27
- const last = relevant[relevant.length - 1];
28
- return Math.abs(first.x - last.x) / (last.time - first.time);
29
- } catch {
30
- return 0;
31
- }
32
- }
33
- /*
34
- `elasticDrag` is the translateX value, which slows down as the difference increases
35
- `1 - Math.E ** (-0.005 * difference)` provides a % value of how far we want to translate (0.005 being the rate)
36
- `Math.min(150, window.innerWidth / 3)` provides the maximum translate value
37
- */
38
- const getElasticDragDifference = difference => Math.min(150, window.innerWidth / 3) * (1 - Math.E ** (-5e-3 * difference));
39
23
 
40
- export { getElasticDragDifference, getSwipeDifference, getSwipeVelocity, getVelocity, swipeShouldChangeTab, swipedLeftToRight, swipedRightToLeft };
24
+ export { getSwipeDifference, getSwipeVelocity, swipeShouldChangeTab, swipedLeftToRight, swipedRightToLeft };
41
25
  //# sourceMappingURL=utils.mjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"utils.mjs","sources":["../../src/tabs/utils.ts"],"sourcesContent":["const MIN_SWIPE_DISTANCE = 50;\nconst MIN_SWIPE_VELOCITY = 0.1;\n\nconst swipedSignificantDistance = (difference: number) => Math.abs(difference) > MIN_SWIPE_DISTANCE;\n\nconst swipedWithSignificantVelocity = (velocity: number) => velocity > MIN_SWIPE_VELOCITY;\n\nexport interface Swipe {\n x: number;\n y: number;\n time: number;\n}\n\nexport const getSwipeVelocity = (start: Swipe, end: Swipe) => {\n const timePassed = end.time - start.time;\n\n return getSwipeDifference(start, end) / timePassed;\n};\n\nexport const getSwipeDifference = (start: Swipe, end: Swipe, axis: 'x' | 'y' = 'x') => {\n return Math.abs(start[axis] - end[axis]);\n};\n\nexport const swipedLeftToRight = (start: Swipe, end: Swipe) => {\n return end.x > start.x;\n};\n\nexport const swipedRightToLeft = (start: Swipe, end: Swipe) => {\n return start.x > end.x;\n};\n\nexport const swipeShouldChangeTab = (start: Swipe, end: Swipe) => {\n const difference = getSwipeDifference(start, end);\n const velocity = getSwipeVelocity(start, end);\n\n return swipedSignificantDistance(difference) && swipedWithSignificantVelocity(velocity);\n};\n\nexport function getVelocity(coords: Swipe[]) {\n try {\n const relevant = coords.slice(Math.max(coords.length - 5, 1));\n const first = relevant[0];\n const last = relevant[relevant.length - 1];\n\n return Math.abs(first.x - last.x) / (last.time - first.time);\n } catch {\n return 0;\n }\n}\n\n/*\n `elasticDrag` is the translateX value, which slows down as the difference increases\n `1 - Math.E ** (-0.005 * difference)` provides a % value of how far we want to translate (0.005 being the rate)\n `Math.min(150, window.innerWidth / 3)` provides the maximum translate value\n*/\nexport const getElasticDragDifference = (difference: number) =>\n Math.min(150, window.innerWidth / 3) * (1 - Math.E ** (-0.005 * difference));\n"],"names":["MIN_SWIPE_DISTANCE","MIN_SWIPE_VELOCITY","swipedSignificantDistance","difference","Math","abs","swipedWithSignificantVelocity","velocity","getSwipeVelocity","start","end","timePassed","time","getSwipeDifference","axis","swipedLeftToRight","x","swipedRightToLeft","swipeShouldChangeTab","getVelocity","coords","relevant","slice","max","length","first","last","getElasticDragDifference","min","window","innerWidth","E"],"mappings":"AAAA,MAAMA,kBAAkB,GAAG,EAAE;AAC7B,MAAMC,kBAAkB,GAAG,GAAG;AAE9B,MAAMC,yBAAyB,GAAIC,UAAkB,IAAKC,IAAI,CAACC,GAAG,CAACF,UAAU,CAAC,GAAGH,kBAAkB;AAEnG,MAAMM,6BAA6B,GAAIC,QAAgB,IAAKA,QAAQ,GAAGN,kBAAkB;MAQ5EO,gBAAgB,GAAGA,CAACC,KAAY,EAAEC,GAAU,KAAI;EAC3D,MAAMC,UAAU,GAAGD,GAAG,CAACE,IAAI,GAAGH,KAAK,CAACG,IAAI;AAExC,EAAA,OAAOC,kBAAkB,CAACJ,KAAK,EAAEC,GAAG,CAAC,GAAGC,UAAU;AACpD;AAEO,MAAME,kBAAkB,GAAGA,CAACJ,KAAY,EAAEC,GAAU,EAAEI,IAAA,GAAkB,GAAG,KAAI;AACpF,EAAA,OAAOV,IAAI,CAACC,GAAG,CAACI,KAAK,CAACK,IAAI,CAAC,GAAGJ,GAAG,CAACI,IAAI,CAAC,CAAC;AAC1C;MAEaC,iBAAiB,GAAGA,CAACN,KAAY,EAAEC,GAAU,KAAI;AAC5D,EAAA,OAAOA,GAAG,CAACM,CAAC,GAAGP,KAAK,CAACO,CAAC;AACxB;MAEaC,iBAAiB,GAAGA,CAACR,KAAY,EAAEC,GAAU,KAAI;AAC5D,EAAA,OAAOD,KAAK,CAACO,CAAC,GAAGN,GAAG,CAACM,CAAC;AACxB;MAEaE,oBAAoB,GAAGA,CAACT,KAAY,EAAEC,GAAU,KAAI;AAC/D,EAAA,MAAMP,UAAU,GAAGU,kBAAkB,CAACJ,KAAK,EAAEC,GAAG,CAAC;AACjD,EAAA,MAAMH,QAAQ,GAAGC,gBAAgB,CAACC,KAAK,EAAEC,GAAG,CAAC;EAE7C,OAAOR,yBAAyB,CAACC,UAAU,CAAC,IAAIG,6BAA6B,CAACC,QAAQ,CAAC;AACzF;AAEM,SAAUY,WAAWA,CAACC,MAAe,EAAA;EACzC,IAAI;AACF,IAAA,MAAMC,QAAQ,GAAGD,MAAM,CAACE,KAAK,CAAClB,IAAI,CAACmB,GAAG,CAACH,MAAM,CAACI,MAAM,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC;AAC7D,IAAA,MAAMC,KAAK,GAAGJ,QAAQ,CAAC,CAAC,CAAC;IACzB,MAAMK,IAAI,GAAGL,QAAQ,CAACA,QAAQ,CAACG,MAAM,GAAG,CAAC,CAAC;IAE1C,OAAOpB,IAAI,CAACC,GAAG,CAACoB,KAAK,CAACT,CAAC,GAAGU,IAAI,CAACV,CAAC,CAAC,IAAIU,IAAI,CAACd,IAAI,GAAGa,KAAK,CAACb,IAAI,CAAC;AAC9D,EAAA,CAAC,CAAC,MAAM;AACN,IAAA,OAAO,CAAC;AACV,EAAA;AACF;AAEA;;;;AAIE;AACK,MAAMe,wBAAwB,GAAIxB,UAAkB,IACzDC,IAAI,CAACwB,GAAG,CAAC,GAAG,EAAEC,MAAM,CAACC,UAAU,GAAG,CAAC,CAAC,IAAI,CAAC,GAAG1B,IAAI,CAAC2B,CAAC,KAAK,KAAM,GAAG5B,UAAU,CAAC;;;;"}
1
+ {"version":3,"file":"utils.mjs","sources":["../../src/tabs/utils.ts"],"sourcesContent":["const MIN_SWIPE_DISTANCE = 50;\nconst MIN_SWIPE_VELOCITY = 0.1;\n\nconst swipedSignificantDistance = (difference: number) => Math.abs(difference) > MIN_SWIPE_DISTANCE;\n\nconst swipedWithSignificantVelocity = (velocity: number) => velocity > MIN_SWIPE_VELOCITY;\n\nexport interface Swipe {\n x: number;\n y: number;\n time: number;\n}\n\nexport const getSwipeVelocity = (start: Swipe, end: Swipe) => {\n const timePassed = end.time - start.time;\n\n return getSwipeDifference(start, end) / timePassed;\n};\n\nexport const getSwipeDifference = (start: Swipe, end: Swipe, axis: 'x' | 'y' = 'x') => {\n return Math.abs(start[axis] - end[axis]);\n};\n\nexport const swipedLeftToRight = (start: Swipe, end: Swipe) => {\n return end.x > start.x;\n};\n\nexport const swipedRightToLeft = (start: Swipe, end: Swipe) => {\n return start.x > end.x;\n};\n\nexport const swipeShouldChangeTab = (start: Swipe, end: Swipe) => {\n const difference = getSwipeDifference(start, end);\n const velocity = getSwipeVelocity(start, end);\n\n return swipedSignificantDistance(difference) && swipedWithSignificantVelocity(velocity);\n};\n"],"names":["MIN_SWIPE_DISTANCE","MIN_SWIPE_VELOCITY","swipedSignificantDistance","difference","Math","abs","swipedWithSignificantVelocity","velocity","getSwipeVelocity","start","end","timePassed","time","getSwipeDifference","axis","swipedLeftToRight","x","swipedRightToLeft","swipeShouldChangeTab"],"mappings":"AAAA,MAAMA,kBAAkB,GAAG,EAAE;AAC7B,MAAMC,kBAAkB,GAAG,GAAG;AAE9B,MAAMC,yBAAyB,GAAIC,UAAkB,IAAKC,IAAI,CAACC,GAAG,CAACF,UAAU,CAAC,GAAGH,kBAAkB;AAEnG,MAAMM,6BAA6B,GAAIC,QAAgB,IAAKA,QAAQ,GAAGN,kBAAkB;MAQ5EO,gBAAgB,GAAGA,CAACC,KAAY,EAAEC,GAAU,KAAI;EAC3D,MAAMC,UAAU,GAAGD,GAAG,CAACE,IAAI,GAAGH,KAAK,CAACG,IAAI;AAExC,EAAA,OAAOC,kBAAkB,CAACJ,KAAK,EAAEC,GAAG,CAAC,GAAGC,UAAU;AACpD;AAEO,MAAME,kBAAkB,GAAGA,CAACJ,KAAY,EAAEC,GAAU,EAAEI,IAAA,GAAkB,GAAG,KAAI;AACpF,EAAA,OAAOV,IAAI,CAACC,GAAG,CAACI,KAAK,CAACK,IAAI,CAAC,GAAGJ,GAAG,CAACI,IAAI,CAAC,CAAC;AAC1C;MAEaC,iBAAiB,GAAGA,CAACN,KAAY,EAAEC,GAAU,KAAI;AAC5D,EAAA,OAAOA,GAAG,CAACM,CAAC,GAAGP,KAAK,CAACO,CAAC;AACxB;MAEaC,iBAAiB,GAAGA,CAACR,KAAY,EAAEC,GAAU,KAAI;AAC5D,EAAA,OAAOD,KAAK,CAACO,CAAC,GAAGN,GAAG,CAACM,CAAC;AACxB;MAEaE,oBAAoB,GAAGA,CAACT,KAAY,EAAEC,GAAU,KAAI;AAC/D,EAAA,MAAMP,UAAU,GAAGU,kBAAkB,CAACJ,KAAK,EAAEC,GAAG,CAAC;AACjD,EAAA,MAAMH,QAAQ,GAAGC,gBAAgB,CAACC,KAAK,EAAEC,GAAG,CAAC;EAE7C,OAAOR,yBAAyB,CAACC,UAAU,CAAC,IAAIG,6BAA6B,CAACC,QAAQ,CAAC;AACzF;;;;"}