@toptal/picasso-tabs 3.0.2-alpha-fx-5726-create-base-preset-package-7cdb4a4dd.32 → 3.0.2-alpha-fx-null-revert-tabs-b3f67a2fa.31
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/dist-package/src/Tab/Tab.d.ts +3 -3
- package/dist-package/src/Tab/Tab.d.ts.map +1 -1
- package/dist-package/src/Tab/Tab.js +14 -62
- package/dist-package/src/Tab/Tab.js.map +1 -1
- package/dist-package/src/Tab/styles.d.ts +4 -0
- package/dist-package/src/Tab/styles.d.ts.map +1 -0
- package/dist-package/src/Tab/styles.js +94 -0
- package/dist-package/src/Tab/styles.js.map +1 -0
- package/dist-package/src/TabScrollButton/TabScrollButton.d.ts +12 -0
- package/dist-package/src/TabScrollButton/TabScrollButton.d.ts.map +1 -0
- package/dist-package/src/TabScrollButton/TabScrollButton.js +40 -0
- package/dist-package/src/TabScrollButton/TabScrollButton.js.map +1 -0
- package/dist-package/src/TabScrollButton/index.d.ts +5 -0
- package/dist-package/src/TabScrollButton/index.d.ts.map +1 -0
- package/dist-package/src/TabScrollButton/index.js +2 -0
- package/dist-package/src/TabScrollButton/index.js.map +1 -0
- package/dist-package/src/TabScrollButton/styles.d.ts +4 -0
- package/dist-package/src/TabScrollButton/styles.d.ts.map +1 -0
- package/dist-package/src/TabScrollButton/styles.js +35 -0
- package/dist-package/src/TabScrollButton/styles.js.map +1 -0
- package/dist-package/src/Tabs/Tabs.d.ts +4 -13
- package/dist-package/src/Tabs/Tabs.d.ts.map +1 -1
- package/dist-package/src/Tabs/Tabs.js +21 -51
- package/dist-package/src/Tabs/Tabs.js.map +1 -1
- package/dist-package/src/Tabs/styles.d.ts +4 -0
- package/dist-package/src/Tabs/styles.d.ts.map +1 -0
- package/dist-package/src/Tabs/styles.js +41 -0
- package/dist-package/src/Tabs/styles.js.map +1 -0
- package/dist-package/src/Tabs/use-tab-action.d.ts +5 -0
- package/dist-package/src/Tabs/use-tab-action.d.ts.map +1 -0
- package/dist-package/src/Tabs/use-tab-action.js +21 -0
- package/dist-package/src/Tabs/use-tab-action.js.map +1 -0
- package/dist-package/src/TabsCompound/index.d.ts +2 -4
- package/dist-package/src/TabsCompound/index.d.ts.map +1 -1
- package/dist-package/src/index.d.ts +1 -0
- package/dist-package/src/index.d.ts.map +1 -1
- package/dist-package/src/index.js +1 -0
- package/dist-package/src/index.js.map +1 -1
- package/package.json +16 -16
- package/src/Tab/Tab.tsx +21 -99
- package/src/Tab/__snapshots__/test.tsx.snap +47 -32
- package/src/Tab/styles.ts +106 -0
- package/src/TabScrollButton/TabScrollButton.tsx +64 -0
- package/src/TabScrollButton/index.ts +6 -0
- package/src/TabScrollButton/styles.ts +37 -0
- package/src/Tabs/Tabs.tsx +42 -94
- package/src/Tabs/__snapshots__/test.tsx.snap +76 -61
- package/src/Tabs/styles.ts +45 -0
- package/src/Tabs/test.tsx +1 -1
- package/src/Tabs/use-tab-action.ts +27 -0
- package/src/index.ts +1 -0
package/src/Tabs/Tabs.tsx
CHANGED
@@ -1,9 +1,13 @@
|
|
1
|
-
import type {
|
2
|
-
import React, { forwardRef
|
3
|
-
import {
|
4
|
-
import {
|
1
|
+
import type { ForwardedRef, ReactNode } from 'react'
|
2
|
+
import React, { forwardRef } from 'react'
|
3
|
+
import type { Theme } from '@material-ui/core/styles'
|
4
|
+
import { makeStyles } from '@material-ui/core/styles'
|
5
|
+
import { Tabs as MUITabs } from '@material-ui/core'
|
5
6
|
import type { BaseProps } from '@toptal/picasso-shared'
|
6
|
-
|
7
|
+
|
8
|
+
import { TabScrollButton } from '../TabScrollButton'
|
9
|
+
import styles from './styles'
|
10
|
+
import useTabAction from './use-tab-action'
|
7
11
|
|
8
12
|
export type TabsValueType = string | number | null
|
9
13
|
|
@@ -14,10 +18,7 @@ export interface Props<V extends TabsValueType> extends BaseProps {
|
|
14
18
|
/** Callback fired when the value changes. */
|
15
19
|
onChange?: (event: React.ChangeEvent<{}> | null, value: V) => void
|
16
20
|
|
17
|
-
/**
|
18
|
-
* The value of the currently selected Tab.
|
19
|
-
* If you don't want any selected Tab, you can set this property to null.
|
20
|
-
*/
|
21
|
+
/** The value of the currently selected Tab. If you don't want any selected Tab, you can set this property to false. */
|
21
22
|
value: V
|
22
23
|
|
23
24
|
/** The tabs orientation (layout flow direction). */
|
@@ -27,108 +28,55 @@ export interface Props<V extends TabsValueType> extends BaseProps {
|
|
27
28
|
variant?: 'scrollable' | 'fullWidth'
|
28
29
|
}
|
29
30
|
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
}>({ orientation: 'horizontal', variant: 'scrollable' })
|
34
|
-
|
35
|
-
const indicatorClasses = [
|
36
|
-
'after:absolute',
|
37
|
-
'after:content-[""]',
|
38
|
-
'after:bottom-0',
|
39
|
-
'after:left-0',
|
40
|
-
'after:right-0',
|
41
|
-
'after:h-[1px]',
|
42
|
-
'after:bg-gray-500',
|
43
|
-
'after:z-0',
|
44
|
-
]
|
45
|
-
|
46
|
-
const classesByOrientation = {
|
47
|
-
vertical: {
|
48
|
-
root: 'w-[200px] m-0 flex-col',
|
49
|
-
scroller: 'pl-2',
|
50
|
-
},
|
51
|
-
horizontal: {
|
52
|
-
root: '',
|
53
|
-
scroller: indicatorClasses,
|
54
|
-
},
|
55
|
-
} as const
|
31
|
+
const useStyles = makeStyles<Theme>(styles, {
|
32
|
+
name: 'Tabs',
|
33
|
+
})
|
56
34
|
|
57
|
-
const
|
58
|
-
|
59
|
-
|
60
|
-
scroller: '',
|
61
|
-
},
|
62
|
-
fullWidth: {
|
63
|
-
root: '',
|
64
|
-
scroller: 'w-full overflow-hidden',
|
65
|
-
},
|
66
|
-
} as const
|
35
|
+
export const TabsOrientationContext = React.createContext<
|
36
|
+
'horizontal' | 'vertical'
|
37
|
+
>('horizontal')
|
67
38
|
|
68
|
-
|
39
|
+
// eslint-disable-next-line react/display-name
|
40
|
+
export const Tabs = forwardRef(
|
69
41
|
<V extends TabsValueType = TabsValueType>(
|
70
|
-
|
42
|
+
props: Props<V>,
|
43
|
+
ref: ForwardedRef<HTMLButtonElement>
|
44
|
+
) => {
|
45
|
+
const {
|
71
46
|
children,
|
72
|
-
orientation
|
47
|
+
orientation,
|
73
48
|
onChange,
|
74
49
|
value,
|
75
50
|
variant = 'scrollable',
|
76
|
-
className,
|
77
51
|
...rest
|
78
|
-
}
|
79
|
-
|
80
|
-
|
81
|
-
const contextValue = useMemo(
|
82
|
-
() => ({
|
83
|
-
orientation,
|
84
|
-
variant,
|
85
|
-
}),
|
86
|
-
[orientation, variant]
|
87
|
-
)
|
88
|
-
|
89
|
-
const isVertical = orientation === 'vertical'
|
52
|
+
} = props
|
53
|
+
const classes = useStyles(props)
|
54
|
+
const action = useTabAction()
|
90
55
|
|
91
56
|
return (
|
92
|
-
<
|
57
|
+
<TabsOrientationContext.Provider value={orientation!}>
|
93
58
|
<MUITabs
|
94
59
|
{...rest}
|
95
|
-
|
96
|
-
|
97
|
-
|
98
|
-
className: twMerge(
|
99
|
-
'relative min-h-0 flex overflow-hidden',
|
100
|
-
classesByOrientation[orientation].root,
|
101
|
-
classesByVariant[variant].root,
|
102
|
-
className
|
103
|
-
),
|
104
|
-
},
|
105
|
-
}}
|
106
|
-
onChange={
|
107
|
-
onChange as (
|
108
|
-
event: React.ChangeEvent<{}> | null,
|
109
|
-
value: TabsValueType
|
110
|
-
) => void
|
111
|
-
}
|
60
|
+
classes={{ root: classes[orientation!] }}
|
61
|
+
ref={ref}
|
62
|
+
onChange={onChange}
|
112
63
|
value={value}
|
64
|
+
action={action}
|
65
|
+
scrollButtons='auto'
|
66
|
+
ScrollButtonComponent={TabScrollButton}
|
113
67
|
orientation={orientation}
|
68
|
+
variant={variant}
|
114
69
|
>
|
115
|
-
|
116
|
-
className={twJoin(
|
117
|
-
classesByVariant[variant].scroller,
|
118
|
-
classesByOrientation[orientation].scroller,
|
119
|
-
'flex-auto inline-block relative whitespace-nowrap'
|
120
|
-
)}
|
121
|
-
>
|
122
|
-
<TabsList className={twJoin('flex', isVertical && 'flex-col')}>
|
123
|
-
{children}
|
124
|
-
</TabsList>
|
125
|
-
</div>
|
70
|
+
{children}
|
126
71
|
</MUITabs>
|
127
|
-
</
|
72
|
+
</TabsOrientationContext.Provider>
|
128
73
|
)
|
129
74
|
}
|
130
|
-
)
|
131
|
-
|
132
|
-
|
75
|
+
)
|
76
|
+
|
77
|
+
Tabs.displayName = 'Tabs'
|
78
|
+
Tabs.defaultProps = {
|
79
|
+
orientation: 'horizontal',
|
80
|
+
}
|
133
81
|
|
134
82
|
export default Tabs
|
@@ -6,28 +6,30 @@ exports[`Tabs renders 1`] = `
|
|
6
6
|
class="Picasso-root"
|
7
7
|
>
|
8
8
|
<div
|
9
|
-
class="
|
9
|
+
class="MuiTabs-root Tabs-horizontal"
|
10
10
|
>
|
11
11
|
<div
|
12
|
-
class="
|
12
|
+
class="MuiTabs-scrollable"
|
13
|
+
style="width: 99px; height: 99px; position: absolute; top: -9999px; overflow: scroll;"
|
14
|
+
/>
|
15
|
+
<div
|
16
|
+
class="MuiTabs-scroller MuiTabs-scrollable"
|
17
|
+
style="margin-bottom: 0px;"
|
13
18
|
>
|
14
19
|
<div
|
15
|
-
class="
|
20
|
+
class="MuiTabs-flexContainer"
|
16
21
|
role="tablist"
|
17
|
-
tabindex="-1"
|
18
22
|
>
|
19
23
|
<button
|
20
|
-
aria-disabled="false"
|
21
24
|
aria-selected="false"
|
22
|
-
class="
|
25
|
+
class="MuiButtonBase-root MuiTab-root PicassoTab-horizontal MuiTab-textColorInherit"
|
23
26
|
data-testid="tab-1"
|
24
|
-
id=":r0:"
|
25
27
|
role="tab"
|
26
28
|
tabindex="0"
|
27
29
|
type="button"
|
28
30
|
>
|
29
31
|
<span
|
30
|
-
class="
|
32
|
+
class="MuiTab-wrapper PicassoTab-wrapper"
|
31
33
|
>
|
32
34
|
<div
|
33
35
|
class="m-0 text-sm text-inherit font-semibold"
|
@@ -37,17 +39,15 @@ exports[`Tabs renders 1`] = `
|
|
37
39
|
</span>
|
38
40
|
</button>
|
39
41
|
<button
|
40
|
-
aria-disabled="false"
|
41
42
|
aria-selected="false"
|
42
|
-
class="
|
43
|
+
class="MuiButtonBase-root MuiTab-root PicassoTab-horizontal MuiTab-textColorInherit"
|
43
44
|
data-testid="tab-2"
|
44
|
-
id=":r1:"
|
45
45
|
role="tab"
|
46
46
|
tabindex="0"
|
47
47
|
type="button"
|
48
48
|
>
|
49
49
|
<span
|
50
|
-
class="
|
50
|
+
class="MuiTab-wrapper PicassoTab-wrapper"
|
51
51
|
>
|
52
52
|
<div
|
53
53
|
class="m-0 text-sm text-inherit font-semibold"
|
@@ -57,6 +57,10 @@ exports[`Tabs renders 1`] = `
|
|
57
57
|
</span>
|
58
58
|
</button>
|
59
59
|
</div>
|
60
|
+
<span
|
61
|
+
class="PrivateTabIndicator-root PrivateTabIndicator-colorSecondary MuiTabs-indicator"
|
62
|
+
style="left: 0px; width: 0px;"
|
63
|
+
/>
|
60
64
|
</div>
|
61
65
|
</div>
|
62
66
|
</div>
|
@@ -69,28 +73,26 @@ exports[`Tabs renders in full width 1`] = `
|
|
69
73
|
class="Picasso-root"
|
70
74
|
>
|
71
75
|
<div
|
72
|
-
class="
|
76
|
+
class="MuiTabs-root Tabs-horizontal"
|
73
77
|
>
|
74
78
|
<div
|
75
|
-
class="
|
79
|
+
class="MuiTabs-scroller MuiTabs-fixed"
|
80
|
+
style="overflow: hidden;"
|
76
81
|
>
|
77
82
|
<div
|
78
|
-
class="
|
83
|
+
class="MuiTabs-flexContainer"
|
79
84
|
role="tablist"
|
80
|
-
tabindex="-1"
|
81
85
|
>
|
82
86
|
<button
|
83
|
-
aria-disabled="false"
|
84
87
|
aria-selected="false"
|
85
|
-
class="
|
88
|
+
class="MuiButtonBase-root MuiTab-root PicassoTab-horizontal MuiTab-textColorInherit MuiTab-fullWidth"
|
86
89
|
data-testid="tab-1"
|
87
|
-
id=":re:"
|
88
90
|
role="tab"
|
89
91
|
tabindex="0"
|
90
92
|
type="button"
|
91
93
|
>
|
92
94
|
<span
|
93
|
-
class="
|
95
|
+
class="MuiTab-wrapper PicassoTab-wrapper"
|
94
96
|
>
|
95
97
|
<div
|
96
98
|
class="m-0 text-sm text-inherit font-semibold"
|
@@ -100,17 +102,15 @@ exports[`Tabs renders in full width 1`] = `
|
|
100
102
|
</span>
|
101
103
|
</button>
|
102
104
|
<button
|
103
|
-
aria-disabled="false"
|
104
105
|
aria-selected="false"
|
105
|
-
class="
|
106
|
+
class="MuiButtonBase-root MuiTab-root PicassoTab-horizontal MuiTab-textColorInherit MuiTab-fullWidth"
|
106
107
|
data-testid="tab-2"
|
107
|
-
id=":rf:"
|
108
108
|
role="tab"
|
109
109
|
tabindex="0"
|
110
110
|
type="button"
|
111
111
|
>
|
112
112
|
<span
|
113
|
-
class="
|
113
|
+
class="MuiTab-wrapper PicassoTab-wrapper"
|
114
114
|
>
|
115
115
|
<div
|
116
116
|
class="m-0 text-sm text-inherit font-semibold"
|
@@ -120,6 +120,10 @@ exports[`Tabs renders in full width 1`] = `
|
|
120
120
|
</span>
|
121
121
|
</button>
|
122
122
|
</div>
|
123
|
+
<span
|
124
|
+
class="PrivateTabIndicator-root PrivateTabIndicator-colorSecondary MuiTabs-indicator"
|
125
|
+
style="left: 0px; width: 0px;"
|
126
|
+
/>
|
123
127
|
</div>
|
124
128
|
</div>
|
125
129
|
</div>
|
@@ -132,29 +136,30 @@ exports[`Tabs renders in vertical orientation 1`] = `
|
|
132
136
|
class="Picasso-root"
|
133
137
|
>
|
134
138
|
<div
|
135
|
-
class="
|
139
|
+
class="MuiTabs-root Tabs-vertical MuiTabs-vertical"
|
136
140
|
>
|
137
141
|
<div
|
138
|
-
class="
|
142
|
+
class="MuiTabs-scrollable"
|
143
|
+
style="width: 99px; height: 99px; position: absolute; top: -9999px; overflow: scroll;"
|
144
|
+
/>
|
145
|
+
<div
|
146
|
+
class="MuiTabs-scroller MuiTabs-scrollable"
|
147
|
+
style="margin-bottom: 0px;"
|
139
148
|
>
|
140
149
|
<div
|
141
|
-
|
142
|
-
class="base-TabsList base-TabsList flex flex-col"
|
150
|
+
class="MuiTabs-flexContainer MuiTabs-flexContainerVertical"
|
143
151
|
role="tablist"
|
144
|
-
tabindex="-1"
|
145
152
|
>
|
146
153
|
<button
|
147
|
-
aria-disabled="false"
|
148
154
|
aria-selected="false"
|
149
|
-
class="
|
155
|
+
class="MuiButtonBase-root MuiTab-root PicassoTab-vertical MuiTab-textColorInherit"
|
150
156
|
data-testid="tab-1"
|
151
|
-
id=":r2:"
|
152
157
|
role="tab"
|
153
158
|
tabindex="0"
|
154
159
|
type="button"
|
155
160
|
>
|
156
161
|
<span
|
157
|
-
class="
|
162
|
+
class="MuiTab-wrapper PicassoTab-wrapper"
|
158
163
|
>
|
159
164
|
<div
|
160
165
|
class="m-0 text-md text-inherit font-semibold whitespace-nowrap overflow-ellipsis overflow-hidden inline TypographyOverflow-wrapper !block !whitespace-nowrap"
|
@@ -164,17 +169,15 @@ exports[`Tabs renders in vertical orientation 1`] = `
|
|
164
169
|
</span>
|
165
170
|
</button>
|
166
171
|
<button
|
167
|
-
aria-disabled="false"
|
168
172
|
aria-selected="false"
|
169
|
-
class="
|
173
|
+
class="MuiButtonBase-root MuiTab-root PicassoTab-vertical MuiTab-textColorInherit"
|
170
174
|
data-testid="tab-2"
|
171
|
-
id=":r3:"
|
172
175
|
role="tab"
|
173
176
|
tabindex="0"
|
174
177
|
type="button"
|
175
178
|
>
|
176
179
|
<span
|
177
|
-
class="
|
180
|
+
class="MuiTab-wrapper PicassoTab-wrapper"
|
178
181
|
>
|
179
182
|
<div
|
180
183
|
class="m-0 text-md text-inherit font-semibold whitespace-nowrap overflow-ellipsis overflow-hidden inline TypographyOverflow-wrapper !block !whitespace-nowrap"
|
@@ -184,6 +187,10 @@ exports[`Tabs renders in vertical orientation 1`] = `
|
|
184
187
|
</span>
|
185
188
|
</button>
|
186
189
|
</div>
|
190
|
+
<span
|
191
|
+
class="PrivateTabIndicator-root PrivateTabIndicator-colorSecondary MuiTabs-indicator PrivateTabIndicator-vertical"
|
192
|
+
style="top: 0px; height: 0px;"
|
193
|
+
/>
|
187
194
|
</div>
|
188
195
|
</div>
|
189
196
|
</div>
|
@@ -196,28 +203,30 @@ exports[`Tabs renders with a pre-selected option 1`] = `
|
|
196
203
|
class="Picasso-root"
|
197
204
|
>
|
198
205
|
<div
|
199
|
-
class="
|
206
|
+
class="MuiTabs-root Tabs-horizontal"
|
200
207
|
>
|
201
208
|
<div
|
202
|
-
class="
|
209
|
+
class="MuiTabs-scrollable"
|
210
|
+
style="width: 99px; height: 99px; position: absolute; top: -9999px; overflow: scroll;"
|
211
|
+
/>
|
212
|
+
<div
|
213
|
+
class="MuiTabs-scroller MuiTabs-scrollable"
|
214
|
+
style="margin-bottom: 0px;"
|
203
215
|
>
|
204
216
|
<div
|
205
|
-
class="
|
217
|
+
class="MuiTabs-flexContainer"
|
206
218
|
role="tablist"
|
207
|
-
tabindex="-1"
|
208
219
|
>
|
209
220
|
<button
|
210
|
-
aria-disabled="false"
|
211
221
|
aria-selected="false"
|
212
|
-
class="
|
222
|
+
class="MuiButtonBase-root MuiTab-root PicassoTab-horizontal MuiTab-textColorInherit"
|
213
223
|
data-testid="tab-1"
|
214
|
-
id=":r4:"
|
215
224
|
role="tab"
|
216
225
|
tabindex="0"
|
217
226
|
type="button"
|
218
227
|
>
|
219
228
|
<span
|
220
|
-
class="
|
229
|
+
class="MuiTab-wrapper PicassoTab-wrapper"
|
221
230
|
>
|
222
231
|
<div
|
223
232
|
class="m-0 text-sm text-inherit font-semibold"
|
@@ -227,17 +236,15 @@ exports[`Tabs renders with a pre-selected option 1`] = `
|
|
227
236
|
</span>
|
228
237
|
</button>
|
229
238
|
<button
|
230
|
-
aria-disabled="false"
|
231
239
|
aria-selected="true"
|
232
|
-
class="
|
240
|
+
class="MuiButtonBase-root MuiTab-root PicassoTab-horizontal MuiTab-textColorInherit Mui-selected PicassoTab-selected"
|
233
241
|
data-testid="tab-2"
|
234
|
-
id=":r5:"
|
235
242
|
role="tab"
|
236
243
|
tabindex="0"
|
237
244
|
type="button"
|
238
245
|
>
|
239
246
|
<span
|
240
|
-
class="
|
247
|
+
class="MuiTab-wrapper PicassoTab-wrapper"
|
241
248
|
>
|
242
249
|
<div
|
243
250
|
class="m-0 text-sm text-inherit font-semibold"
|
@@ -247,6 +254,10 @@ exports[`Tabs renders with a pre-selected option 1`] = `
|
|
247
254
|
</span>
|
248
255
|
</button>
|
249
256
|
</div>
|
257
|
+
<span
|
258
|
+
class="PrivateTabIndicator-root PrivateTabIndicator-colorSecondary MuiTabs-indicator"
|
259
|
+
style="left: 0px; width: 0px;"
|
260
|
+
/>
|
250
261
|
</div>
|
251
262
|
</div>
|
252
263
|
<div
|
@@ -266,28 +277,30 @@ exports[`Tabs renders with a pre-selected option using custom value 1`] = `
|
|
266
277
|
class="Picasso-root"
|
267
278
|
>
|
268
279
|
<div
|
269
|
-
class="
|
280
|
+
class="MuiTabs-root Tabs-horizontal"
|
270
281
|
>
|
271
282
|
<div
|
272
|
-
class="
|
283
|
+
class="MuiTabs-scrollable"
|
284
|
+
style="width: 99px; height: 99px; position: absolute; top: -9999px; overflow: scroll;"
|
285
|
+
/>
|
286
|
+
<div
|
287
|
+
class="MuiTabs-scroller MuiTabs-scrollable"
|
288
|
+
style="margin-bottom: 0px;"
|
273
289
|
>
|
274
290
|
<div
|
275
|
-
class="
|
291
|
+
class="MuiTabs-flexContainer"
|
276
292
|
role="tablist"
|
277
|
-
tabindex="-1"
|
278
293
|
>
|
279
294
|
<button
|
280
|
-
aria-disabled="false"
|
281
295
|
aria-selected="true"
|
282
|
-
class="
|
296
|
+
class="MuiButtonBase-root MuiTab-root PicassoTab-horizontal MuiTab-textColorInherit Mui-selected PicassoTab-selected"
|
283
297
|
data-testid="tab-1"
|
284
|
-
id=":r6:"
|
285
298
|
role="tab"
|
286
299
|
tabindex="0"
|
287
300
|
type="button"
|
288
301
|
>
|
289
302
|
<span
|
290
|
-
class="
|
303
|
+
class="MuiTab-wrapper PicassoTab-wrapper"
|
291
304
|
>
|
292
305
|
<div
|
293
306
|
class="m-0 text-sm text-inherit font-semibold"
|
@@ -297,17 +310,15 @@ exports[`Tabs renders with a pre-selected option using custom value 1`] = `
|
|
297
310
|
</span>
|
298
311
|
</button>
|
299
312
|
<button
|
300
|
-
aria-disabled="false"
|
301
313
|
aria-selected="false"
|
302
|
-
class="
|
314
|
+
class="MuiButtonBase-root MuiTab-root PicassoTab-horizontal MuiTab-textColorInherit"
|
303
315
|
data-testid="tab-2"
|
304
|
-
id=":r7:"
|
305
316
|
role="tab"
|
306
317
|
tabindex="0"
|
307
318
|
type="button"
|
308
319
|
>
|
309
320
|
<span
|
310
|
-
class="
|
321
|
+
class="MuiTab-wrapper PicassoTab-wrapper"
|
311
322
|
>
|
312
323
|
<div
|
313
324
|
class="m-0 text-sm text-inherit font-semibold"
|
@@ -317,6 +328,10 @@ exports[`Tabs renders with a pre-selected option using custom value 1`] = `
|
|
317
328
|
</span>
|
318
329
|
</button>
|
319
330
|
</div>
|
331
|
+
<span
|
332
|
+
class="PrivateTabIndicator-root PrivateTabIndicator-colorSecondary MuiTabs-indicator"
|
333
|
+
style="left: 0px; width: 0px;"
|
334
|
+
/>
|
320
335
|
</div>
|
321
336
|
</div>
|
322
337
|
<div
|
@@ -0,0 +1,45 @@
|
|
1
|
+
import type { Theme } from '@material-ui/core/styles'
|
2
|
+
import { createStyles } from '@material-ui/core/styles'
|
3
|
+
import { PicassoProvider } from '@toptal/picasso-provider'
|
4
|
+
|
5
|
+
PicassoProvider.override(({ palette }: Theme) => ({
|
6
|
+
MuiTabs: {
|
7
|
+
root: {
|
8
|
+
position: 'relative',
|
9
|
+
minHeight: 0,
|
10
|
+
},
|
11
|
+
vertical: {
|
12
|
+
width: 200,
|
13
|
+
margin: 0,
|
14
|
+
'& $scroller': {
|
15
|
+
// We need a bit of padding to allow active tab's shadow to be visible
|
16
|
+
paddingLeft: '0.5em',
|
17
|
+
},
|
18
|
+
|
19
|
+
'& $indicator': {
|
20
|
+
display: 'none',
|
21
|
+
},
|
22
|
+
},
|
23
|
+
indicator: {
|
24
|
+
backgroundColor: palette.blue.main,
|
25
|
+
zIndex: 1,
|
26
|
+
},
|
27
|
+
},
|
28
|
+
}))
|
29
|
+
|
30
|
+
export default ({ palette }: Theme) =>
|
31
|
+
createStyles({
|
32
|
+
horizontal: {
|
33
|
+
'&::after': {
|
34
|
+
position: 'absolute',
|
35
|
+
content: '""',
|
36
|
+
bottom: 0,
|
37
|
+
left: 0,
|
38
|
+
right: 0,
|
39
|
+
height: 1,
|
40
|
+
backgroundColor: palette.grey.main,
|
41
|
+
zIndex: 0,
|
42
|
+
},
|
43
|
+
},
|
44
|
+
vertical: {},
|
45
|
+
})
|
package/src/Tabs/test.tsx
CHANGED
@@ -0,0 +1,27 @@
|
|
1
|
+
import type { Ref } from 'react'
|
2
|
+
import { useEffect, useRef } from 'react'
|
3
|
+
import type { TabsActions } from '@material-ui/core'
|
4
|
+
|
5
|
+
/*
|
6
|
+
* MuiTabs break when the size of a tab changes without rendering with React.
|
7
|
+
* This issue happens when the font is loaded after the initial render of the component.
|
8
|
+
* To solve this issue, we imperatively update the indicator and scroll buttons when it happens.
|
9
|
+
*/
|
10
|
+
const useTabAction = (): Ref<TabsActions> => {
|
11
|
+
const ref = useRef<TabsActions>(null)
|
12
|
+
|
13
|
+
useEffect(() => {
|
14
|
+
const listener = () => {
|
15
|
+
ref.current?.updateIndicator()
|
16
|
+
ref.current?.updateScrollButtons()
|
17
|
+
}
|
18
|
+
|
19
|
+
window.addEventListener('load', listener)
|
20
|
+
|
21
|
+
return () => window.removeEventListener('load', listener)
|
22
|
+
}, [])
|
23
|
+
|
24
|
+
return ref
|
25
|
+
}
|
26
|
+
|
27
|
+
export default useTabAction
|
package/src/index.ts
CHANGED