@transferwise/components 0.0.0-experimental-5cd0315 → 0.0.0-experimental-3cdcd93
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.
- package/build/inputs/SelectInput.js +3 -22
- package/build/inputs/SelectInput.js.map +1 -1
- package/build/inputs/SelectInput.mjs +3 -22
- package/build/inputs/SelectInput.mjs.map +1 -1
- package/build/tabs/Tabs.js +14 -171
- package/build/tabs/Tabs.js.map +1 -1
- package/build/tabs/Tabs.mjs +16 -173
- package/build/tabs/Tabs.mjs.map +1 -1
- package/build/tabs/utils.js +0 -18
- package/build/tabs/utils.js.map +1 -1
- package/build/tabs/utils.mjs +1 -17
- package/build/tabs/utils.mjs.map +1 -1
- package/build/types/inputs/SelectInput.d.ts.map +1 -1
- package/build/types/tabs/Tabs.d.ts +2 -24
- package/build/types/tabs/Tabs.d.ts.map +1 -1
- package/build/types/tabs/utils.d.ts +0 -2
- package/build/types/tabs/utils.d.ts.map +1 -1
- package/package.json +3 -4
- package/src/inputs/SelectInput.tsx +5 -24
- package/src/tabs/Tabs.story.tsx +1 -45
- package/src/tabs/Tabs.test.tsx +0 -22
- package/src/tabs/Tabs.tsx +23 -240
- package/src/tabs/utils.test.ts +0 -58
- package/src/tabs/utils.ts +0 -20
|
@@ -1,43 +1,31 @@
|
|
|
1
1
|
import { Component } from 'react';
|
|
2
|
-
import {
|
|
2
|
+
import { Width } from '../common';
|
|
3
3
|
import { Swipe } from './utils';
|
|
4
4
|
export interface TabItem {
|
|
5
5
|
title: string;
|
|
6
6
|
content: React.ReactNode;
|
|
7
7
|
disabled: boolean;
|
|
8
8
|
}
|
|
9
|
-
type TabsTransitionSpacing = 'default' | `${Size.EXTRA_SMALL | Size.SMALL | Size.MEDIUM | Size.LARGE}`;
|
|
10
9
|
export interface TabsProps {
|
|
11
10
|
tabs: TabItem[];
|
|
12
11
|
selected: number;
|
|
13
12
|
name: string;
|
|
14
|
-
animatePanelsOnClick?: boolean;
|
|
15
13
|
changeTabOnSwipe?: boolean;
|
|
16
14
|
className?: string;
|
|
17
|
-
transitionSpacing?: TabsTransitionSpacing;
|
|
18
15
|
headerWidth?: `${Width}`;
|
|
19
|
-
id?: string;
|
|
20
16
|
onTabSelect: (index: number) => void;
|
|
21
17
|
}
|
|
22
18
|
interface TabsState {
|
|
23
19
|
start: Swipe | null;
|
|
24
|
-
translateX: number;
|
|
25
|
-
translateFrom: number;
|
|
26
|
-
translateTo: number;
|
|
27
20
|
translateLineX: string | null;
|
|
28
|
-
isAnimating: boolean;
|
|
29
21
|
isSwiping: boolean;
|
|
30
22
|
isScrolling: boolean;
|
|
31
|
-
lastSwipeVelocity: number;
|
|
32
23
|
fullWidthTabs: boolean;
|
|
33
|
-
currentSwipe: Swipe[];
|
|
34
|
-
selectedTabIndex: number;
|
|
35
24
|
}
|
|
36
25
|
export default class Tabs extends Component<TabsProps, TabsState> {
|
|
37
26
|
props: TabsProps & Required<Pick<TabsProps, keyof typeof Tabs.defaultProps>>;
|
|
38
27
|
static defaultProps: {
|
|
39
28
|
changeTabOnSwipe: true;
|
|
40
|
-
transitionSpacing: "default";
|
|
41
29
|
headerWidth: Width.BLOCK;
|
|
42
30
|
};
|
|
43
31
|
containerReference: import("react").RefObject<HTMLDivElement>;
|
|
@@ -45,10 +33,9 @@ export default class Tabs extends Component<TabsProps, TabsState> {
|
|
|
45
33
|
container: HTMLDivElement | null;
|
|
46
34
|
containerWidth: number;
|
|
47
35
|
tabRefs: (HTMLLIElement | null)[];
|
|
48
|
-
get filteredTabsLength(): number;
|
|
49
36
|
get MAX_INDEX(): number;
|
|
50
37
|
componentDidMount(): void;
|
|
51
|
-
componentDidUpdate(previousProps: TabsProps
|
|
38
|
+
componentDidUpdate(previousProps: TabsProps): void;
|
|
52
39
|
componentWillUnmount(): void;
|
|
53
40
|
handleResize: () => void;
|
|
54
41
|
setContainerRefAndWidth: (node: HTMLDivElement | null) => void;
|
|
@@ -60,17 +47,8 @@ export default class Tabs extends Component<TabsProps, TabsState> {
|
|
|
60
47
|
getTabLineWidth: () => string;
|
|
61
48
|
getTabToSelect: (selected: number, start: Swipe, end: Swipe) => number;
|
|
62
49
|
swipedOverHalfOfContainer: (difference: number) => boolean;
|
|
63
|
-
calculateApplicableDragDifference: ({ currentSelected, nextSelected, start, end, }: {
|
|
64
|
-
currentSelected: number;
|
|
65
|
-
nextSelected: number;
|
|
66
|
-
start: Swipe;
|
|
67
|
-
end: Swipe;
|
|
68
|
-
}) => number | false;
|
|
69
50
|
switchTab: (index: number) => void;
|
|
70
|
-
getTabIndexWithoutDisabledTabs(index: number): number;
|
|
71
|
-
animateToTab: (index: number, instant?: boolean) => void;
|
|
72
51
|
animateLine: (index: number) => void;
|
|
73
|
-
animatePanel: (index: number, instant?: boolean) => void;
|
|
74
52
|
disableScroll: (event: Event) => void;
|
|
75
53
|
handleTabClick: (index: number) => () => void;
|
|
76
54
|
onKeyDown: (index: number) => (event: React.KeyboardEvent<HTMLLIElement>) => void;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Tabs.d.ts","sourceRoot":"","sources":["../../../src/tabs/Tabs.tsx"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"Tabs.d.ts","sourceRoot":"","sources":["../../../src/tabs/Tabs.tsx"],"names":[],"mappings":"AAEA,OAAO,EAAE,SAAS,EAAa,MAAM,OAAO,CAAC;AAE7C,OAAO,EAAE,KAAK,EAAa,MAAM,WAAW,CAAC;AAM7C,OAAO,EAKL,KAAK,EACN,MAAM,SAAS,CAAC;AAIjB,MAAM,WAAW,OAAO;IACtB,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,KAAK,CAAC,SAAS,CAAC;IACzB,QAAQ,EAAE,OAAO,CAAC;CACnB;AAED,MAAM,WAAW,SAAS;IACxB,IAAI,EAAE,OAAO,EAAE,CAAC;IAChB,QAAQ,EAAE,MAAM,CAAC;IACjB,IAAI,EAAE,MAAM,CAAC;IACb,gBAAgB,CAAC,EAAE,OAAO,CAAC;IAC3B,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,WAAW,CAAC,EAAE,GAAG,KAAK,EAAE,CAAC;IACzB,WAAW,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;CACtC;AAED,UAAU,SAAS;IACjB,KAAK,EAAE,KAAK,GAAG,IAAI,CAAC;IACpB,cAAc,EAAE,MAAM,GAAG,IAAI,CAAC;IAC9B,SAAS,EAAE,OAAO,CAAC;IACnB,WAAW,EAAE,OAAO,CAAC;IACrB,aAAa,EAAE,OAAO,CAAC;CACxB;AAED,MAAM,CAAC,OAAO,OAAO,IAAK,SAAQ,SAAS,CAAC,SAAS,EAAE,SAAS,CAAC;IACvD,KAAK,EAAE,SAAS,GAAG,QAAQ,CAAC,IAAI,CAAC,SAAS,EAAE,MAAM,OAAO,IAAI,CAAC,YAAY,CAAC,CAAC,CAAC;IAErF,MAAM,CAAC,YAAY;;;MAGY;IAE/B,kBAAkB,4CAA+B;gBAErC,KAAK,EAAE,IAAI,CAAC,OAAO,CAAC;IAWhC,SAAS,EAAE,cAAc,GAAG,IAAI,CAAQ;IAExC,cAAc,SAAK;IAEnB,OAAO,EAAE,CAAC,aAAa,GAAG,IAAI,CAAC,EAAE,CAAM;IAEvC,IAAI,SAAS,WAEZ;IAED,iBAAiB;IAWjB,kBAAkB,CAAC,aAAa,EAAE,SAAS;IA8B3C,oBAAoB;IAMpB,YAAY,aAEV;IAEF,uBAAuB,GAAI,MAAM,cAAc,GAAG,IAAI,UAGpD;IAEF,iBAAiB,GAAI,MAAM,cAAc,GAAG,IAAI,UAQ9C;IAEF,aAAa,GAAI,OAAO,MAAM,aAI5B;IAEF,eAAe,eAMb;IAEF,wBAAwB,GAAI,kBAAkB,MAAM,YAKlD;IAEF,WAAW,aAeT;IAEF,eAAe,eAWb;IAMF,cAAc,GAAI,UAAU,MAAM,EAAE,OAAO,KAAK,EAAE,KAAK,KAAK,KAAG,MAAM,CA4BnE;IAEF,yBAAyB,GAAI,YAAY,MAAM,aAA6C;IAE5F,SAAS,GAAI,OAAO,MAAM,UAGxB;IAEF,WAAW,GAAI,OAAO,MAAM,UAM1B;IAEF,aAAa,GAAI,OAAO,KAAK,UAM3B;IAEF,cAAc,GAAI,OAAO,MAAM,gBAE7B;IAEF,SAAS,GAAI,OAAO,MAAM,MAAM,OAAO,KAAK,CAAC,aAAa,CAAC,aAAa,CAAC,UAIvE;IAEF,gBAAgB,EAAE,KAAK,CAAC,iBAAiB,CAAC,cAAc,CAAC,CASvD;IAEF,eAAe,EAAE,KAAK,CAAC,iBAAiB,CAAC,cAAc,CAAC,CAgCtD;IAEF,cAAc,EAAE,KAAK,CAAC,iBAAiB,CAAC,cAAc,CAAC,CA6BrD;IAEF,MAAM;CAgFP"}
|
|
@@ -8,6 +8,4 @@ export declare const getSwipeDifference: (start: Swipe, end: Swipe, axis?: "x" |
|
|
|
8
8
|
export declare const swipedLeftToRight: (start: Swipe, end: Swipe) => boolean;
|
|
9
9
|
export declare const swipedRightToLeft: (start: Swipe, end: Swipe) => boolean;
|
|
10
10
|
export declare const swipeShouldChangeTab: (start: Swipe, end: Swipe) => boolean;
|
|
11
|
-
export declare function getVelocity(coords: Swipe[]): number;
|
|
12
|
-
export declare const getElasticDragDifference: (difference: number) => number;
|
|
13
11
|
//# sourceMappingURL=utils.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"utils.d.ts","sourceRoot":"","sources":["../../../src/tabs/utils.ts"],"names":[],"mappings":"AAOA,MAAM,WAAW,KAAK;IACpB,CAAC,EAAE,MAAM,CAAC;IACV,CAAC,EAAE,MAAM,CAAC;IACV,IAAI,EAAE,MAAM,CAAC;CACd;AAED,eAAO,MAAM,gBAAgB,GAAI,OAAO,KAAK,EAAE,KAAK,KAAK,WAIxD,CAAC;AAEF,eAAO,MAAM,kBAAkB,GAAI,OAAO,KAAK,EAAE,KAAK,KAAK,EAAE,OAAM,GAAG,GAAG,GAAS,WAEjF,CAAC;AAEF,eAAO,MAAM,iBAAiB,GAAI,OAAO,KAAK,EAAE,KAAK,KAAK,YAEzD,CAAC;AAEF,eAAO,MAAM,iBAAiB,GAAI,OAAO,KAAK,EAAE,KAAK,KAAK,YAEzD,CAAC;AAEF,eAAO,MAAM,oBAAoB,GAAI,OAAO,KAAK,EAAE,KAAK,KAAK,YAK5D,CAAC
|
|
1
|
+
{"version":3,"file":"utils.d.ts","sourceRoot":"","sources":["../../../src/tabs/utils.ts"],"names":[],"mappings":"AAOA,MAAM,WAAW,KAAK;IACpB,CAAC,EAAE,MAAM,CAAC;IACV,CAAC,EAAE,MAAM,CAAC;IACV,IAAI,EAAE,MAAM,CAAC;CACd;AAED,eAAO,MAAM,gBAAgB,GAAI,OAAO,KAAK,EAAE,KAAK,KAAK,WAIxD,CAAC;AAEF,eAAO,MAAM,kBAAkB,GAAI,OAAO,KAAK,EAAE,KAAK,KAAK,EAAE,OAAM,GAAG,GAAG,GAAS,WAEjF,CAAC;AAEF,eAAO,MAAM,iBAAiB,GAAI,OAAO,KAAK,EAAE,KAAK,KAAK,YAEzD,CAAC;AAEF,eAAO,MAAM,iBAAiB,GAAI,OAAO,KAAK,EAAE,KAAK,KAAK,YAEzD,CAAC;AAEF,eAAO,MAAM,oBAAoB,GAAI,OAAO,KAAK,EAAE,KAAK,KAAK,YAK5D,CAAC"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@transferwise/components",
|
|
3
|
-
"version": "0.0.0-experimental-
|
|
3
|
+
"version": "0.0.0-experimental-3cdcd93",
|
|
4
4
|
"description": "Neptune React components",
|
|
5
5
|
"license": "Apache-2.0",
|
|
6
6
|
"repository": {
|
|
@@ -87,9 +87,9 @@
|
|
|
87
87
|
"storybook-addon-tag-badges": "^3.0.4",
|
|
88
88
|
"storybook-addon-test-codegen": "^3.0.1",
|
|
89
89
|
"@transferwise/less-config": "3.1.2",
|
|
90
|
-
"@wise/components-theming": "1.10.1",
|
|
91
90
|
"@transferwise/neptune-css": "14.26.1",
|
|
92
|
-
"@wise/wds-configs": "0.0.0"
|
|
91
|
+
"@wise/wds-configs": "0.0.0",
|
|
92
|
+
"@wise/components-theming": "1.10.1"
|
|
93
93
|
},
|
|
94
94
|
"peerDependencies": {
|
|
95
95
|
"@transferwise/icons": "^3 || ^4",
|
|
@@ -108,7 +108,6 @@
|
|
|
108
108
|
"@popperjs/core": "^2.11.8",
|
|
109
109
|
"@react-aria/focus": "^3.21.3",
|
|
110
110
|
"@react-aria/overlays": "^3.31.0",
|
|
111
|
-
"@react-spring/web": "~10.0.3",
|
|
112
111
|
"@transferwise/formatting": "^2.13.4",
|
|
113
112
|
"@transferwise/neptune-validation": "^3.3.1",
|
|
114
113
|
"clsx": "^2.1.1",
|
|
@@ -741,35 +741,15 @@ function SelectInputOptions<T = string>({
|
|
|
741
741
|
return items;
|
|
742
742
|
}
|
|
743
743
|
|
|
744
|
-
const
|
|
744
|
+
const filtered = filterSelectInputItems(dedupeSelectInputItems(items, compareValues), (item) =>
|
|
745
|
+
selectInputOptionItemIncludesNeedle(item, needle),
|
|
746
|
+
);
|
|
745
747
|
|
|
746
748
|
if (sortFilteredOptions) {
|
|
747
|
-
// When sorting, filter out non-matching items completely to avoid ghost items
|
|
748
|
-
const filtered = dedupedItems.map((item) => {
|
|
749
|
-
if (item.type === 'option') {
|
|
750
|
-
return selectInputOptionItemIncludesNeedle(item, needle)
|
|
751
|
-
? item
|
|
752
|
-
: { ...item, value: undefined };
|
|
753
|
-
}
|
|
754
|
-
if (item.type === 'group') {
|
|
755
|
-
return {
|
|
756
|
-
...item,
|
|
757
|
-
options: item.options.map((option) =>
|
|
758
|
-
selectInputOptionItemIncludesNeedle(option, needle)
|
|
759
|
-
? option
|
|
760
|
-
: { ...option, value: undefined },
|
|
761
|
-
),
|
|
762
|
-
};
|
|
763
|
-
}
|
|
764
|
-
return item;
|
|
765
|
-
});
|
|
766
|
-
|
|
767
749
|
return sortSelectInputItems(filtered, sortFilteredOptions, filterQuery);
|
|
768
750
|
}
|
|
769
751
|
|
|
770
|
-
return
|
|
771
|
-
selectInputOptionItemIncludesNeedle(item, needle),
|
|
772
|
-
);
|
|
752
|
+
return filtered;
|
|
773
753
|
// eslint-disable-next-line react-hooks/exhaustive-deps
|
|
774
754
|
}, [needle, items, compareValues]);
|
|
775
755
|
const resultsEmpty = needle != null && filteredItems.length === 0;
|
|
@@ -947,6 +927,7 @@ function SelectInputOptions<T = string>({
|
|
|
947
927
|
) : (
|
|
948
928
|
<Virtualizer
|
|
949
929
|
ref={virtualiserHandlerRef}
|
|
930
|
+
key={needle}
|
|
950
931
|
data={filteredItems}
|
|
951
932
|
keepMounted={mountedIndexes}
|
|
952
933
|
scrollRef={listboxRef} // `VList` doesn't expose this
|
package/src/tabs/Tabs.story.tsx
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { useState } from 'react';
|
|
2
2
|
|
|
3
|
-
import {
|
|
3
|
+
import { Width } from '../common';
|
|
4
4
|
|
|
5
5
|
import Tabs from './Tabs';
|
|
6
6
|
|
|
@@ -15,7 +15,6 @@ export const Basic = () => {
|
|
|
15
15
|
<Tabs
|
|
16
16
|
className="tabs-custom-class"
|
|
17
17
|
name="tabs-docs"
|
|
18
|
-
transitionSpacing={Size.MEDIUM}
|
|
19
18
|
tabs={[
|
|
20
19
|
{
|
|
21
20
|
title: 'Title 1',
|
|
@@ -44,7 +43,6 @@ export const Basic = () => {
|
|
|
44
43
|
},
|
|
45
44
|
]}
|
|
46
45
|
selected={selected}
|
|
47
|
-
animatePanelsOnClick
|
|
48
46
|
onTabSelect={(index) => setSelected(index)}
|
|
49
47
|
/>
|
|
50
48
|
);
|
|
@@ -56,7 +54,6 @@ export const AutoTabHeaderWidth = () => {
|
|
|
56
54
|
<Tabs
|
|
57
55
|
className="tabs-custom-class"
|
|
58
56
|
name="tabs-docs"
|
|
59
|
-
transitionSpacing={Size.MEDIUM}
|
|
60
57
|
headerWidth={Width.AUTO}
|
|
61
58
|
tabs={[
|
|
62
59
|
{
|
|
@@ -92,44 +89,3 @@ export const AutoTabHeaderWidth = () => {
|
|
|
92
89
|
/>
|
|
93
90
|
);
|
|
94
91
|
};
|
|
95
|
-
|
|
96
|
-
export const NoPanelAnimation = () => {
|
|
97
|
-
const [selected, setSelected] = useState(0);
|
|
98
|
-
return (
|
|
99
|
-
<Tabs
|
|
100
|
-
animatePanelsOnClick={false}
|
|
101
|
-
className="tabs-custom-class"
|
|
102
|
-
name="tabs-docs"
|
|
103
|
-
transitionSpacing={Size.MEDIUM}
|
|
104
|
-
tabs={[
|
|
105
|
-
{
|
|
106
|
-
title: 'Title 1',
|
|
107
|
-
disabled: false,
|
|
108
|
-
content: (
|
|
109
|
-
<div className="p-a-2">
|
|
110
|
-
Lorem ipsum dolor, sit amet consectetur adipisicing elit. Cum totam debitis similique
|
|
111
|
-
</div>
|
|
112
|
-
),
|
|
113
|
-
},
|
|
114
|
-
{
|
|
115
|
-
title: 'Title 2',
|
|
116
|
-
disabled: false,
|
|
117
|
-
content: (
|
|
118
|
-
<div className="p-a-2">Lorem ipsum dolor, sit amet consectetur adipisicing elit.</div>
|
|
119
|
-
),
|
|
120
|
-
},
|
|
121
|
-
{
|
|
122
|
-
title: 'Title 3',
|
|
123
|
-
disabled: true,
|
|
124
|
-
content: (
|
|
125
|
-
<div className="p-a-2">
|
|
126
|
-
Lorem ipsum dolor, sit amet consectetur adipisicing elit. Cum totam debitis similique
|
|
127
|
-
</div>
|
|
128
|
-
),
|
|
129
|
-
},
|
|
130
|
-
]}
|
|
131
|
-
selected={selected}
|
|
132
|
-
onTabSelect={(index) => setSelected(index)}
|
|
133
|
-
/>
|
|
134
|
-
);
|
|
135
|
-
};
|
package/src/tabs/Tabs.test.tsx
CHANGED
|
@@ -1,4 +1,3 @@
|
|
|
1
|
-
import { Globals } from '@react-spring/web';
|
|
2
1
|
import { render, screen, userEvent } from '../test-utils';
|
|
3
2
|
import Tabs, { TabsProps } from './Tabs';
|
|
4
3
|
|
|
@@ -18,21 +17,13 @@ function generateTabs(tabsStatus = defaultTabsStatus) {
|
|
|
18
17
|
}));
|
|
19
18
|
}
|
|
20
19
|
|
|
21
|
-
beforeAll(() => {
|
|
22
|
-
Globals.assign({
|
|
23
|
-
skipAnimation: true,
|
|
24
|
-
});
|
|
25
|
-
});
|
|
26
|
-
|
|
27
20
|
describe('Tabs', () => {
|
|
28
21
|
const initialProps: TabsProps = {
|
|
29
|
-
animatePanelsOnClick: true,
|
|
30
22
|
tabs: generateTabs(),
|
|
31
23
|
changeTabOnSwipe: true,
|
|
32
24
|
name: 'testName',
|
|
33
25
|
headerWidth: 'block',
|
|
34
26
|
selected: 0,
|
|
35
|
-
transitionSpacing: 'default',
|
|
36
27
|
onTabSelect: jest.fn(),
|
|
37
28
|
className: 'custom-class-name',
|
|
38
29
|
};
|
|
@@ -65,19 +56,6 @@ describe('Tabs', () => {
|
|
|
65
56
|
expect(screen.getByRole('tabpanel')).toHaveAttribute('id', controlsTarget);
|
|
66
57
|
});
|
|
67
58
|
|
|
68
|
-
describe('transitionSpacing', () => {
|
|
69
|
-
test.each([
|
|
70
|
-
['default', '100%'],
|
|
71
|
-
['xs', '8px'],
|
|
72
|
-
['sm', '16px'],
|
|
73
|
-
['md', '24px'],
|
|
74
|
-
['lg', '32px'],
|
|
75
|
-
] as const)('should respect `%s`', (input, width) => {
|
|
76
|
-
render(<Tabs {...initialProps} transitionSpacing={input} />);
|
|
77
|
-
expect(screen.getByRole('tabpanel').nextSibling).toHaveStyle({ width });
|
|
78
|
-
});
|
|
79
|
-
});
|
|
80
|
-
|
|
81
59
|
it('should render correct number of tabs', () => {
|
|
82
60
|
render(<Tabs {...initialProps} />);
|
|
83
61
|
expect(screen.getAllByRole('tab')).toHaveLength(defaultTabsStatus.length);
|