@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.
Files changed (51) hide show
  1. package/dist-package/src/Tab/Tab.d.ts +3 -3
  2. package/dist-package/src/Tab/Tab.d.ts.map +1 -1
  3. package/dist-package/src/Tab/Tab.js +14 -62
  4. package/dist-package/src/Tab/Tab.js.map +1 -1
  5. package/dist-package/src/Tab/styles.d.ts +4 -0
  6. package/dist-package/src/Tab/styles.d.ts.map +1 -0
  7. package/dist-package/src/Tab/styles.js +94 -0
  8. package/dist-package/src/Tab/styles.js.map +1 -0
  9. package/dist-package/src/TabScrollButton/TabScrollButton.d.ts +12 -0
  10. package/dist-package/src/TabScrollButton/TabScrollButton.d.ts.map +1 -0
  11. package/dist-package/src/TabScrollButton/TabScrollButton.js +40 -0
  12. package/dist-package/src/TabScrollButton/TabScrollButton.js.map +1 -0
  13. package/dist-package/src/TabScrollButton/index.d.ts +5 -0
  14. package/dist-package/src/TabScrollButton/index.d.ts.map +1 -0
  15. package/dist-package/src/TabScrollButton/index.js +2 -0
  16. package/dist-package/src/TabScrollButton/index.js.map +1 -0
  17. package/dist-package/src/TabScrollButton/styles.d.ts +4 -0
  18. package/dist-package/src/TabScrollButton/styles.d.ts.map +1 -0
  19. package/dist-package/src/TabScrollButton/styles.js +35 -0
  20. package/dist-package/src/TabScrollButton/styles.js.map +1 -0
  21. package/dist-package/src/Tabs/Tabs.d.ts +4 -13
  22. package/dist-package/src/Tabs/Tabs.d.ts.map +1 -1
  23. package/dist-package/src/Tabs/Tabs.js +21 -51
  24. package/dist-package/src/Tabs/Tabs.js.map +1 -1
  25. package/dist-package/src/Tabs/styles.d.ts +4 -0
  26. package/dist-package/src/Tabs/styles.d.ts.map +1 -0
  27. package/dist-package/src/Tabs/styles.js +41 -0
  28. package/dist-package/src/Tabs/styles.js.map +1 -0
  29. package/dist-package/src/Tabs/use-tab-action.d.ts +5 -0
  30. package/dist-package/src/Tabs/use-tab-action.d.ts.map +1 -0
  31. package/dist-package/src/Tabs/use-tab-action.js +21 -0
  32. package/dist-package/src/Tabs/use-tab-action.js.map +1 -0
  33. package/dist-package/src/TabsCompound/index.d.ts +2 -4
  34. package/dist-package/src/TabsCompound/index.d.ts.map +1 -1
  35. package/dist-package/src/index.d.ts +1 -0
  36. package/dist-package/src/index.d.ts.map +1 -1
  37. package/dist-package/src/index.js +1 -0
  38. package/dist-package/src/index.js.map +1 -1
  39. package/package.json +16 -16
  40. package/src/Tab/Tab.tsx +21 -99
  41. package/src/Tab/__snapshots__/test.tsx.snap +47 -32
  42. package/src/Tab/styles.ts +106 -0
  43. package/src/TabScrollButton/TabScrollButton.tsx +64 -0
  44. package/src/TabScrollButton/index.ts +6 -0
  45. package/src/TabScrollButton/styles.ts +37 -0
  46. package/src/Tabs/Tabs.tsx +42 -94
  47. package/src/Tabs/__snapshots__/test.tsx.snap +76 -61
  48. package/src/Tabs/styles.ts +45 -0
  49. package/src/Tabs/test.tsx +1 -1
  50. package/src/Tabs/use-tab-action.ts +27 -0
  51. package/src/index.ts +1 -0
package/src/Tabs/Tabs.tsx CHANGED
@@ -1,9 +1,13 @@
1
- import type { ReactNode, ForwardedRef } from 'react'
2
- import React, { forwardRef, useMemo } from 'react'
3
- import { Tabs as MUITabs } from '@mui/base/Tabs'
4
- import { TabsList } from '@mui/base/TabsList'
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
- import { twJoin, twMerge } from '@toptal/picasso-tailwind-merge'
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
- export const TabsContext = React.createContext<{
31
- orientation: 'horizontal' | 'vertical'
32
- variant: 'scrollable' | 'fullWidth'
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 classesByVariant = {
58
- scrollable: {
59
- root: 'overflow-x-auto',
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
- const Tabs = forwardRef(
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 = 'horizontal',
47
+ orientation,
73
48
  onChange,
74
49
  value,
75
50
  variant = 'scrollable',
76
- className,
77
51
  ...rest
78
- }: Props<V>,
79
- ref: ForwardedRef<HTMLDivElement>
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
- <TabsContext.Provider value={contextValue}>
57
+ <TabsOrientationContext.Provider value={orientation!}>
93
58
  <MUITabs
94
59
  {...rest}
95
- slotProps={{
96
- root: {
97
- ref,
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
- <div
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
- </TabsContext.Provider>
72
+ </TabsOrientationContext.Provider>
128
73
  )
129
74
  }
130
- ) as <V extends TabsValueType = TabsValueType>(
131
- props: Props<V> & { ref?: ForwardedRef<HTMLDivElement> }
132
- ) => ReturnType<typeof MUITabs>
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="base-Tabs base-Tabs relative min-h flex overflow-hidden overflow-x"
9
+ class="MuiTabs-root Tabs-horizontal"
10
10
  >
11
11
  <div
12
- class="after:absolute after:content-[""] after:bottom-0 after:left-0 after:right-0 after:h-[1px] after:bg-gray after:z-0 flex-auto inline-block relative whitespace-nowrap"
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="base-TabsList base-TabsList flex"
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="base-Tab opacity-70 m-0 [&:not(:last-child)]:mr-8 pt-[0.5625rem] pb-[0.4375rem] px-0 text-center bg-transparent transition-shadow z-10 rounded-none text-inheritColor shrink-0 max-w min-w sm:min-w md:min-w border-0 cursor-pointer inline-flex outline-none items-center select-none align-middle appearance-none justify-center no-underline [-webkit-tap-highlight normal-case whitespace-normal leading-4 relative"
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="w-full inline-flex items-center flex-col justify-center"
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="base-Tab opacity-70 m-0 [&:not(:last-child)]:mr-8 pt-[0.5625rem] pb-[0.4375rem] px-0 text-center bg-transparent transition-shadow z-10 rounded-none text-inheritColor shrink-0 max-w min-w sm:min-w md:min-w border-0 cursor-pointer inline-flex outline-none items-center select-none align-middle appearance-none justify-center no-underline [-webkit-tap-highlight normal-case whitespace-normal leading-4 relative"
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="w-full inline-flex items-center flex-col justify-center"
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="base-Tabs base-Tabs relative min-h flex overflow-hidden"
76
+ class="MuiTabs-root Tabs-horizontal"
73
77
  >
74
78
  <div
75
- class="w-full overflow-hidden after:absolute after:content-[""] after:bottom-0 after:left-0 after:right-0 after:h-[1px] after:bg-gray after:z-0 flex-auto inline-block relative whitespace-nowrap"
79
+ class="MuiTabs-scroller MuiTabs-fixed"
80
+ style="overflow: hidden;"
76
81
  >
77
82
  <div
78
- class="base-TabsList base-TabsList flex"
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="base-Tab opacity-70 m-0 [&:not(:last-child)]:mr-8 pt-[0.5625rem] pb-[0.4375rem] px-0 text-center bg-transparent transition-shadow z-10 rounded-none text-inheritColor shrink flex-grow basis-0 min-w sm:min-w md:min-w border-0 cursor-pointer inline-flex outline-none items-center select-none align-middle appearance-none justify-center no-underline [-webkit-tap-highlight normal-case whitespace-normal leading-4 relative"
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="w-full inline-flex items-center flex-col justify-center"
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="base-Tab opacity-70 m-0 [&:not(:last-child)]:mr-8 pt-[0.5625rem] pb-[0.4375rem] px-0 text-center bg-transparent transition-shadow z-10 rounded-none text-inheritColor shrink flex-grow basis-0 min-w sm:min-w md:min-w border-0 cursor-pointer inline-flex outline-none items-center select-none align-middle appearance-none justify-center no-underline [-webkit-tap-highlight normal-case whitespace-normal leading-4 relative"
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="w-full inline-flex items-center flex-col justify-center"
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="base-Tabs base-Tabs relative min-h flex overflow-hidden w-[200px] m-0 flex-col overflow-x"
139
+ class="MuiTabs-root Tabs-vertical MuiTabs-vertical"
136
140
  >
137
141
  <div
138
- class="pl-2 flex-auto inline-block relative whitespace-nowrap"
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
- aria-orientation="vertical"
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="base-Tab opacity-100 first:mt-4 last:mb-4 my-1 mx-0 py-2 px-4 text-left rounded-l rounded-r transition-all w-full overflow-hidden bg-gray hover:bg-gray text-graphite hover:text-black shrink-0 max-w min-w sm:min-w md:min-w border-0 cursor-pointer inline-flex outline-none items-center select-none align-middle appearance-none justify-center no-underline [-webkit-tap-highlight normal-case whitespace-normal leading-4 relative"
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="w-full block"
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="base-Tab opacity-100 first:mt-4 last:mb-4 my-1 mx-0 py-2 px-4 text-left rounded-l rounded-r transition-all w-full overflow-hidden bg-gray hover:bg-gray text-graphite hover:text-black shrink-0 max-w min-w sm:min-w md:min-w border-0 cursor-pointer inline-flex outline-none items-center select-none align-middle appearance-none justify-center no-underline [-webkit-tap-highlight normal-case whitespace-normal leading-4 relative"
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="w-full block"
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="base-Tabs base-Tabs relative min-h flex overflow-hidden overflow-x"
206
+ class="MuiTabs-root Tabs-horizontal"
200
207
  >
201
208
  <div
202
- class="after:absolute after:content-[""] after:bottom-0 after:left-0 after:right-0 after:h-[1px] after:bg-gray after:z-0 flex-auto inline-block relative whitespace-nowrap"
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="base-TabsList base-TabsList flex"
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="base-Tab opacity-70 m-0 [&:not(:last-child)]:mr-8 pt-[0.5625rem] pb-[0.4375rem] px-0 text-center bg-transparent transition-shadow z-10 rounded-none text-inheritColor shrink-0 max-w min-w sm:min-w md:min-w border-0 cursor-pointer inline-flex outline-none items-center select-none align-middle appearance-none justify-center no-underline [-webkit-tap-highlight normal-case whitespace-normal leading-4 relative"
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="w-full inline-flex items-center flex-col justify-center"
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="base-Tab base- opacity-100 m-0 [&:not(:last-child)]:mr-8 pt-[0.5625rem] pb-[0.4375rem] px-0 text-center bg-transparent transition-shadow z-10 rounded-none text-black shadow-blue shadow-[inset_0_-2px_0] shrink-0 max-w min-w sm:min-w md:min-w border-0 cursor-pointer inline-flex outline-none items-center select-none align-middle appearance-none justify-center no-underline [-webkit-tap-highlight normal-case whitespace-normal leading-4 relative"
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="w-full inline-flex items-center flex-col justify-center"
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="base-Tabs base-Tabs relative min-h flex overflow-hidden overflow-x"
280
+ class="MuiTabs-root Tabs-horizontal"
270
281
  >
271
282
  <div
272
- class="after:absolute after:content-[""] after:bottom-0 after:left-0 after:right-0 after:h-[1px] after:bg-gray after:z-0 flex-auto inline-block relative whitespace-nowrap"
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="base-TabsList base-TabsList flex"
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="base-Tab base- opacity-100 m-0 [&:not(:last-child)]:mr-8 pt-[0.5625rem] pb-[0.4375rem] px-0 text-center bg-transparent transition-shadow z-10 rounded-none text-black shadow-blue shadow-[inset_0_-2px_0] shrink-0 max-w min-w sm:min-w md:min-w border-0 cursor-pointer inline-flex outline-none items-center select-none align-middle appearance-none justify-center no-underline [-webkit-tap-highlight normal-case whitespace-normal leading-4 relative"
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="w-full inline-flex items-center flex-col justify-center"
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="base-Tab opacity-70 m-0 [&:not(:last-child)]:mr-8 pt-[0.5625rem] pb-[0.4375rem] px-0 text-center bg-transparent transition-shadow z-10 rounded-none text-inheritColor shrink-0 max-w min-w sm:min-w md:min-w border-0 cursor-pointer inline-flex outline-none items-center select-none align-middle appearance-none justify-center no-underline [-webkit-tap-highlight normal-case whitespace-normal leading-4 relative"
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="w-full inline-flex items-center flex-col justify-center"
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
@@ -116,7 +116,7 @@ describe('Tabs', () => {
116
116
  const { getByTestId } = renderTabs(
117
117
  [{ label: 'Tab 1' }, { label: 'Tab 2' }],
118
118
  {
119
- value: 0,
119
+ value: 1,
120
120
  onChange,
121
121
  }
122
122
  )
@@ -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
@@ -1,3 +1,4 @@
1
+ export * from './TabScrollButton'
1
2
  export * from './Tabs'
2
3
  export * from './Tab'
3
4
  export * from './TabDescription'