@toptal/picasso-tabs 2.0.9 → 3.0.1

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 (64) 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 +62 -14
  4. package/dist-package/src/Tab/Tab.js.map +1 -1
  5. package/dist-package/src/TabLabel/TabLabel.d.ts.map +1 -1
  6. package/dist-package/src/TabLabel/TabLabel.js +2 -3
  7. package/dist-package/src/TabLabel/TabLabel.js.map +1 -1
  8. package/dist-package/src/Tabs/Tabs.d.ts +19 -10
  9. package/dist-package/src/Tabs/Tabs.d.ts.map +1 -1
  10. package/dist-package/src/Tabs/Tabs.js +51 -21
  11. package/dist-package/src/Tabs/Tabs.js.map +1 -1
  12. package/dist-package/src/Tabs/index.d.ts +3 -2
  13. package/dist-package/src/Tabs/index.d.ts.map +1 -1
  14. package/dist-package/src/TabsCompound/index.d.ts +4 -2
  15. package/dist-package/src/TabsCompound/index.d.ts.map +1 -1
  16. package/dist-package/src/index.d.ts +0 -1
  17. package/dist-package/src/index.d.ts.map +1 -1
  18. package/dist-package/src/index.js +0 -1
  19. package/dist-package/src/index.js.map +1 -1
  20. package/package.json +11 -10
  21. package/src/Tab/Tab.tsx +100 -21
  22. package/src/Tab/__snapshots__/test.tsx.snap +91 -37
  23. package/src/Tab/story/CustomValue.example.tsx +2 -2
  24. package/src/Tab/test.tsx +9 -1
  25. package/src/TabLabel/TabLabel.tsx +10 -4
  26. package/src/Tabs/Tabs.tsx +114 -61
  27. package/src/Tabs/__snapshots__/test.tsx.snap +61 -76
  28. package/src/Tabs/index.ts +3 -2
  29. package/src/Tabs/story/Default.example.tsx +1 -1
  30. package/src/Tabs/story/FullWidth.example.tsx +1 -1
  31. package/src/Tabs/story/ScrollButtons.example.tsx +1 -1
  32. package/src/Tabs/story/Vertical.example.tsx +1 -1
  33. package/src/Tabs/test.tsx +11 -8
  34. package/src/index.ts +1 -2
  35. package/dist-package/src/Tab/styles.d.ts +0 -4
  36. package/dist-package/src/Tab/styles.d.ts.map +0 -1
  37. package/dist-package/src/Tab/styles.js +0 -94
  38. package/dist-package/src/Tab/styles.js.map +0 -1
  39. package/dist-package/src/TabScrollButton/TabScrollButton.d.ts +0 -12
  40. package/dist-package/src/TabScrollButton/TabScrollButton.d.ts.map +0 -1
  41. package/dist-package/src/TabScrollButton/TabScrollButton.js +0 -40
  42. package/dist-package/src/TabScrollButton/TabScrollButton.js.map +0 -1
  43. package/dist-package/src/TabScrollButton/index.d.ts +0 -5
  44. package/dist-package/src/TabScrollButton/index.d.ts.map +0 -1
  45. package/dist-package/src/TabScrollButton/index.js +0 -2
  46. package/dist-package/src/TabScrollButton/index.js.map +0 -1
  47. package/dist-package/src/TabScrollButton/styles.d.ts +0 -4
  48. package/dist-package/src/TabScrollButton/styles.d.ts.map +0 -1
  49. package/dist-package/src/TabScrollButton/styles.js +0 -35
  50. package/dist-package/src/TabScrollButton/styles.js.map +0 -1
  51. package/dist-package/src/Tabs/styles.d.ts +0 -4
  52. package/dist-package/src/Tabs/styles.d.ts.map +0 -1
  53. package/dist-package/src/Tabs/styles.js +0 -41
  54. package/dist-package/src/Tabs/styles.js.map +0 -1
  55. package/dist-package/src/Tabs/use-tab-action.d.ts +0 -5
  56. package/dist-package/src/Tabs/use-tab-action.d.ts.map +0 -1
  57. package/dist-package/src/Tabs/use-tab-action.js +0 -21
  58. package/dist-package/src/Tabs/use-tab-action.js.map +0 -1
  59. package/src/Tab/styles.ts +0 -106
  60. package/src/TabScrollButton/TabScrollButton.tsx +0 -64
  61. package/src/TabScrollButton/index.ts +0 -6
  62. package/src/TabScrollButton/styles.ts +0 -37
  63. package/src/Tabs/styles.ts +0 -45
  64. package/src/Tabs/use-tab-action.ts +0 -27
@@ -1,8 +1,8 @@
1
1
  import type { ReactNode, HTMLAttributes, ReactElement } from 'react';
2
2
  import React from 'react';
3
- import type { TabProps } from '@material-ui/core';
3
+ import type { TabProps } from '@mui/base/Tab';
4
4
  import type { BaseProps, TextLabelProps } from '@toptal/picasso-shared';
5
- export interface Props extends BaseProps, TextLabelProps, Omit<HTMLAttributes<HTMLDivElement>, 'onChange'> {
5
+ export interface Props extends BaseProps, TextLabelProps, Omit<HTMLAttributes<HTMLButtonElement>, 'onChange'> {
6
6
  /**
7
7
  * If true, the tab will be disabled
8
8
  * @default false
@@ -22,6 +22,6 @@ export interface Props extends BaseProps, TextLabelProps, Omit<HTMLAttributes<HT
22
22
  onChange?: TabProps['onChange'];
23
23
  onClick?: TabProps['onClick'];
24
24
  }
25
- export declare const Tab: React.ForwardRefExoticComponent<Props & React.RefAttributes<HTMLDivElement>>;
25
+ export declare const Tab: React.ForwardRefExoticComponent<Props & React.RefAttributes<HTMLButtonElement>>;
26
26
  export default Tab;
27
27
  //# sourceMappingURL=Tab.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"Tab.d.ts","sourceRoot":"","sources":["../../../src/Tab/Tab.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,cAAc,EAAE,YAAY,EAAE,MAAM,OAAO,CAAA;AACpE,OAAO,KAAiC,MAAM,OAAO,CAAA;AAGrD,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,mBAAmB,CAAA;AAEjD,OAAO,KAAK,EAAE,SAAS,EAAE,cAAc,EAAE,MAAM,wBAAwB,CAAA;AASvE,MAAM,WAAW,KACf,SAAQ,SAAS,EACf,cAAc,EACd,IAAI,CAAC,cAAc,CAAC,cAAc,CAAC,EAAE,UAAU,CAAC;IAClD;;;OAGG;IACH,QAAQ,CAAC,EAAE,OAAO,CAAA;IAElB,yFAAyF;IACzF,KAAK,CAAC,EAAE,QAAQ,CAAC,OAAO,CAAC,CAAA;IAEzB,wBAAwB;IACxB,KAAK,CAAC,EAAE,SAAS,CAAA;IAEjB,uBAAuB;IACvB,IAAI,CAAC,EAAE,YAAY,CAAA;IAEnB,gBAAgB;IAChB,MAAM,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;IAEtB,kBAAkB;IAClB,WAAW,CAAC,EAAE,MAAM,CAAA;IAIpB,QAAQ,CAAC,EAAE,OAAO,CAAA;IAClB,QAAQ,CAAC,EAAE,QAAQ,CAAC,UAAU,CAAC,CAAA;IAC/B,OAAO,CAAC,EAAE,QAAQ,CAAC,SAAS,CAAC,CAAA;CAC9B;AAID,eAAO,MAAM,GAAG,8EA8Cd,CAAA;AAyDF,eAAe,GAAG,CAAA"}
1
+ {"version":3,"file":"Tab.d.ts","sourceRoot":"","sources":["../../../src/Tab/Tab.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,cAAc,EAAE,YAAY,EAAE,MAAM,OAAO,CAAA;AACpE,OAAO,KAAiC,MAAM,OAAO,CAAA;AACrD,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAA;AAE7C,OAAO,KAAK,EAAE,SAAS,EAAE,cAAc,EAAE,MAAM,wBAAwB,CAAA;AASvE,MAAM,WAAW,KACf,SAAQ,SAAS,EACf,cAAc,EACd,IAAI,CAAC,cAAc,CAAC,iBAAiB,CAAC,EAAE,UAAU,CAAC;IACrD;;;OAGG;IACH,QAAQ,CAAC,EAAE,OAAO,CAAA;IAElB,yFAAyF;IACzF,KAAK,CAAC,EAAE,QAAQ,CAAC,OAAO,CAAC,CAAA;IAEzB,wBAAwB;IACxB,KAAK,CAAC,EAAE,SAAS,CAAA;IAEjB,uBAAuB;IACvB,IAAI,CAAC,EAAE,YAAY,CAAA;IAEnB,gBAAgB;IAChB,MAAM,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;IAEtB,kBAAkB;IAClB,WAAW,CAAC,EAAE,MAAM,CAAA;IAIpB,QAAQ,CAAC,EAAE,OAAO,CAAA;IAClB,QAAQ,CAAC,EAAE,QAAQ,CAAC,UAAU,CAAC,CAAA;IAC/B,OAAO,CAAC,EAAE,QAAQ,CAAC,SAAS,CAAC,CAAA;CAC9B;AAuDD,eAAO,MAAM,GAAG,iFA4Ed,CAAA;AAyDF,eAAe,GAAG,CAAA"}
@@ -10,21 +10,62 @@ var __rest = (this && this.__rest) || function (s, e) {
10
10
  return t;
11
11
  };
12
12
  import React, { forwardRef, useContext } from 'react';
13
- import { makeStyles } from '@material-ui/core/styles';
14
- import { Tab as MUITab } from '@material-ui/core';
13
+ import { Tab as MUITab } from '@mui/base/Tab';
15
14
  import { useTitleCase } from '@toptal/picasso-shared';
16
15
  import { UserBadge } from '@toptal/picasso-user-badge';
17
- import styles from './styles';
18
- import { TabsOrientationContext } from '../Tabs/Tabs';
16
+ import { twJoin, twMerge } from '@toptal/picasso-tailwind-merge';
17
+ import { TabsContext } from '../Tabs/Tabs';
19
18
  import { TabLabel } from '../TabLabel';
20
19
  import { TabDescription } from '../TabDescription';
21
- const useStyles = makeStyles(styles, { name: 'PicassoTab' });
20
+ const getOpacityClass = (selected, disabled, orientation) => {
21
+ if (disabled) {
22
+ return 'opacity-50';
23
+ }
24
+ if (selected || orientation === 'vertical') {
25
+ return 'opacity-100 ';
26
+ }
27
+ return 'opacity-70';
28
+ };
29
+ const wrapperClassesByOrientation = {
30
+ horizontal: 'inline-flex items-center flex-col justify-center',
31
+ vertical: 'block',
32
+ };
33
+ const rootClassesByOrientation = (selected) => ({
34
+ horizontal: [
35
+ 'm-0 [&:not(:last-child)]:mr-8 pt-[0.5625rem] pb-[0.4375rem] px-0',
36
+ 'text-center bg-transparent transition-shadow z-10 rounded-none',
37
+ selected ? 'text-black' : 'text-inheritColor',
38
+ selected && 'shadow-blue-500 shadow-[inset_0_-2px_0]',
39
+ ],
40
+ vertical: [
41
+ ' first:mt-4 last:mb-4 my-1 mx-0 py-2 px-4',
42
+ 'text-left rounded-l-sm rounded-r-none transition-all',
43
+ 'w-full overflow-hidden',
44
+ selected && 'shadow-1',
45
+ selected && [
46
+ 'before:absolute',
47
+ 'before:content-[""]',
48
+ 'before:bottom-0',
49
+ 'before:left-0',
50
+ 'before:top-0',
51
+ 'before:w-[3px]',
52
+ 'before:bg-blue-500',
53
+ ],
54
+ selected
55
+ ? 'bg-gray-50 text-black'
56
+ : 'bg-gray-100 hover:bg-gray-200 text-graphite-700 hover:text-black',
57
+ ],
58
+ });
59
+ const classesByVariant = {
60
+ scrollable: 'shrink-0 max-w-[264px]',
61
+ fullWidth: 'shrink flex-grow basis-0',
62
+ };
22
63
  export const Tab = forwardRef(function Tab(props, ref) {
23
- const { disabled, value, label, icon, selected, onChange, onClick, titleCase: propsTitleCase, description, avatar } = props, rest = __rest(props, ["disabled", "value", "label", "icon", "selected", "onChange", "onClick", "titleCase", "description", "avatar"]);
24
- const classes = useStyles();
64
+ const { disabled, value, label, icon, onChange, onClick, titleCase: propsTitleCase, description, avatar, className } = props, rest = __rest(props, ["disabled", "value", "label", "icon", "onChange", "onClick", "titleCase", "description", "avatar", "className"]);
25
65
  const titleCase = useTitleCase(propsTitleCase);
26
- const orientation = useContext(TabsOrientationContext);
27
- const labelComponent = getLabelComponent({
66
+ const { orientation, variant } = useContext(TabsContext);
67
+ const isHorizontal = orientation === 'horizontal';
68
+ const renderLabel = getLabelComponent({
28
69
  avatar,
29
70
  description,
30
71
  disabled,
@@ -32,11 +73,18 @@ export const Tab = forwardRef(function Tab(props, ref) {
32
73
  orientation,
33
74
  titleCase,
34
75
  });
35
- return (React.createElement(MUITab, Object.assign({}, rest, { ref: ref, tabIndex: 0, disabled: disabled, label: labelComponent, icon: icon, value: value, selected: selected, onChange: onChange, onClick: onClick, classes: {
36
- root: classes[orientation],
37
- selected: classes.selected,
38
- wrapper: classes.wrapper,
39
- } })));
76
+ return (React.createElement(MUITab, Object.assign({ className: '' }, rest, { ref: ref, tabIndex: 0, disabled: disabled, value: value, onChange: onChange, onClick: onClick, slotProps: {
77
+ root: ownerState => {
78
+ return {
79
+ className: twMerge(getOpacityClass(ownerState.selected, ownerState.disabled, orientation), rootClassesByOrientation(ownerState.selected)[orientation], classesByVariant[variant], ownerState.disabled
80
+ ? 'cursor-default text-gray-500'
81
+ : 'cursor-pointer', ownerState.disabled && 'pointer-events-none', icon && isHorizontal && 'min-h-0 pt-[0.5625rem] pr-6', 'min-w-0 sm:min-w-[160px] md:min-w-[auto]', 'border-0 cursor-pointer inline-flex outline-none', 'items-center select-none align-middle appearance-none', 'justify-center no-underline [-webkit-tap-highlight-color:transparent]', 'normal-case whitespace-normal leading-4', 'relative ', className),
82
+ };
83
+ },
84
+ } }),
85
+ React.createElement("span", { className: twJoin('w-full', wrapperClassesByOrientation[orientation]) },
86
+ renderLabel,
87
+ icon && React.createElement("span", { className: 'absolute right-0 mb-0 h-4' }, icon))));
40
88
  });
41
89
  Tab.defaultProps = {};
42
90
  Tab.displayName = 'Tab';
@@ -1 +1 @@
1
- {"version":3,"file":"Tab.js","sourceRoot":"","sources":["../../../src/Tab/Tab.tsx"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"Tab.js","sourceRoot":"","sources":["../../../src/Tab/Tab.tsx"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"TabLabel.d.ts","sourceRoot":"","sources":["../../../src/TabLabel/TabLabel.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAA;AAKzB,UAAU,KAAK;IACb,KAAK,CAAC,EAAE,KAAK,CAAC,SAAS,CAAA;IACvB,WAAW,EAAE,YAAY,GAAG,UAAU,CAAA;IACtC,SAAS,CAAC,EAAE,OAAO,CAAA;CACpB;AAED,QAAA,MAAM,QAAQ,sCAAuC,KAAK,gBAqBzD,CAAA;AAED,eAAe,QAAQ,CAAA"}
1
+ {"version":3,"file":"TabLabel.d.ts","sourceRoot":"","sources":["../../../src/TabLabel/TabLabel.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAA;AAIzB,UAAU,KAAK;IACb,KAAK,CAAC,EAAE,KAAK,CAAC,SAAS,CAAA;IACvB,WAAW,EAAE,YAAY,GAAG,UAAU,CAAA;IACtC,SAAS,CAAC,EAAE,OAAO,CAAA;CACpB;AAED,QAAA,MAAM,QAAQ,sCAAuC,KAAK,gBA4BzD,CAAA;AAED,eAAe,QAAQ,CAAA"}
@@ -1,12 +1,11 @@
1
1
  import React from 'react';
2
2
  import { TypographyOverflow } from '@toptal/picasso-typography-overflow';
3
3
  import { Typography } from '@toptal/picasso-typography';
4
- import { toTitleCase } from '@toptal/picasso-utils';
5
4
  const TabLabel = ({ label, orientation, titleCase }) => {
6
5
  if (orientation === 'horizontal') {
7
- return (React.createElement(Typography, { as: 'div', size: 'small', weight: 'semibold', color: 'inherit' }, titleCase ? toTitleCase(label) : label));
6
+ return (React.createElement(Typography, { as: 'div', size: 'small', weight: 'semibold', color: 'inherit', titleCase: titleCase }, label));
8
7
  }
9
- return (React.createElement(TypographyOverflow, { as: 'div', color: 'inherit', inline: true, size: 'medium', variant: 'body', weight: 'semibold' }, titleCase ? toTitleCase(label) : label));
8
+ return (React.createElement(TypographyOverflow, { as: 'div', color: 'inherit', inline: true, size: 'medium', variant: 'body', weight: 'semibold', titleCase: titleCase }, label));
10
9
  };
11
10
  export default TabLabel;
12
11
  //# sourceMappingURL=TabLabel.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"TabLabel.js","sourceRoot":"","sources":["../../../src/TabLabel/TabLabel.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAA;AACzB,OAAO,EAAE,kBAAkB,EAAE,MAAM,qCAAqC,CAAA;AACxE,OAAO,EAAE,UAAU,EAAE,MAAM,4BAA4B,CAAA;AACvD,OAAO,EAAE,WAAW,EAAE,MAAM,uBAAuB,CAAA;AAQnD,MAAM,QAAQ,GAAG,CAAC,EAAE,KAAK,EAAE,WAAW,EAAE,SAAS,EAAS,EAAE,EAAE;IAC5D,IAAI,WAAW,KAAK,YAAY,EAAE;QAChC,OAAO,CACL,oBAAC,UAAU,IAAC,EAAE,EAAC,KAAK,EAAC,IAAI,EAAC,OAAO,EAAC,MAAM,EAAC,UAAU,EAAC,KAAK,EAAC,SAAS,IAChE,SAAS,CAAC,CAAC,CAAC,WAAW,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,CAC5B,CACd,CAAA;KACF;IAED,OAAO,CACL,oBAAC,kBAAkB,IACjB,EAAE,EAAC,KAAK,EACR,KAAK,EAAC,SAAS,EACf,MAAM,QACN,IAAI,EAAC,QAAQ,EACb,OAAO,EAAC,MAAM,EACd,MAAM,EAAC,UAAU,IAEhB,SAAS,CAAC,CAAC,CAAC,WAAW,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,CACpB,CACtB,CAAA;AACH,CAAC,CAAA;AAED,eAAe,QAAQ,CAAA"}
1
+ {"version":3,"file":"TabLabel.js","sourceRoot":"","sources":["../../../src/TabLabel/TabLabel.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAA;AACzB,OAAO,EAAE,kBAAkB,EAAE,MAAM,qCAAqC,CAAA;AACxE,OAAO,EAAE,UAAU,EAAE,MAAM,4BAA4B,CAAA;AAQvD,MAAM,QAAQ,GAAG,CAAC,EAAE,KAAK,EAAE,WAAW,EAAE,SAAS,EAAS,EAAE,EAAE;IAC5D,IAAI,WAAW,KAAK,YAAY,EAAE;QAChC,OAAO,CACL,oBAAC,UAAU,IACT,EAAE,EAAC,KAAK,EACR,IAAI,EAAC,OAAO,EACZ,MAAM,EAAC,UAAU,EACjB,KAAK,EAAC,SAAS,EACf,SAAS,EAAE,SAAS,IAEnB,KAAK,CACK,CACd,CAAA;KACF;IAED,OAAO,CACL,oBAAC,kBAAkB,IACjB,EAAE,EAAC,KAAK,EACR,KAAK,EAAC,SAAS,EACf,MAAM,QACN,IAAI,EAAC,QAAQ,EACb,OAAO,EAAC,MAAM,EACd,MAAM,EAAC,UAAU,EACjB,SAAS,EAAE,SAAS,IAEnB,KAAK,CACa,CACtB,CAAA;AACH,CAAC,CAAA;AAED,eAAe,QAAQ,CAAA"}
@@ -1,20 +1,29 @@
1
- import type { ReactNode } from 'react';
1
+ import type { ReactNode, ForwardedRef } from 'react';
2
2
  import React from 'react';
3
- import type { TabsProps } from '@material-ui/core';
4
- import type { ButtonOrAnchorProps, BaseProps } from '@toptal/picasso-shared';
5
- export interface Props extends BaseProps, Omit<ButtonOrAnchorProps, 'onChange'> {
3
+ import { Tabs as MUITabs } from '@mui/base/Tabs';
4
+ import type { BaseProps } from '@toptal/picasso-shared';
5
+ export declare type TabsValueType = string | number | null;
6
+ export interface Props<V extends TabsValueType> extends BaseProps {
6
7
  /** Tabs content containing Tab components */
7
8
  children: ReactNode;
8
9
  /** Callback fired when the value changes. */
9
- onChange?: (event: React.ChangeEvent<{}>, value: TabsProps['value']) => void;
10
- /** The value of the currently selected Tab. If you don't want any selected Tab, you can set this property to false. */
11
- value: TabsProps['value'];
10
+ onChange?: (event: React.ChangeEvent<{}> | null, value: V) => void;
11
+ /**
12
+ * The value of the currently selected Tab.
13
+ * If you don't want any selected Tab, you can set this property to null.
14
+ */
15
+ value: V;
12
16
  /** The tabs orientation (layout flow direction). */
13
17
  orientation?: 'horizontal' | 'vertical';
14
18
  /** Determines additional display behavior of the tabs */
15
- variant?: Extract<TabsProps['variant'], 'scrollable' | 'fullWidth'>;
19
+ variant?: 'scrollable' | 'fullWidth';
16
20
  }
17
- export declare const TabsOrientationContext: React.Context<"horizontal" | "vertical">;
18
- export declare const Tabs: React.ForwardRefExoticComponent<Props & React.RefAttributes<HTMLButtonElement>>;
21
+ export declare const TabsContext: React.Context<{
22
+ orientation: 'horizontal' | 'vertical';
23
+ variant: 'scrollable' | 'fullWidth';
24
+ }>;
25
+ declare const Tabs: <V extends TabsValueType = TabsValueType>(props: Props<V> & {
26
+ ref?: ForwardedRef<HTMLDivElement> | undefined;
27
+ }) => ReturnType<typeof MUITabs>;
19
28
  export default Tabs;
20
29
  //# sourceMappingURL=Tabs.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"Tabs.d.ts","sourceRoot":"","sources":["../../../src/Tabs/Tabs.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,OAAO,CAAA;AACtC,OAAO,KAAqB,MAAM,OAAO,CAAA;AAGzC,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,mBAAmB,CAAA;AAElD,OAAO,KAAK,EAAE,mBAAmB,EAAE,SAAS,EAAE,MAAM,wBAAwB,CAAA;AAM5E,MAAM,WAAW,KACf,SAAQ,SAAS,EACf,IAAI,CAAC,mBAAmB,EAAE,UAAU,CAAC;IACvC,6CAA6C;IAC7C,QAAQ,EAAE,SAAS,CAAA;IAEnB,6CAA6C;IAC7C,QAAQ,CAAC,EAAE,CAAC,KAAK,EAAE,KAAK,CAAC,WAAW,CAAC,EAAE,CAAC,EAAE,KAAK,EAAE,SAAS,CAAC,OAAO,CAAC,KAAK,IAAI,CAAA;IAE5E,uHAAuH;IACvH,KAAK,EAAE,SAAS,CAAC,OAAO,CAAC,CAAA;IAEzB,oDAAoD;IACpD,WAAW,CAAC,EAAE,YAAY,GAAG,UAAU,CAAA;IAEvC,yDAAyD;IACzD,OAAO,CAAC,EAAE,OAAO,CAAC,SAAS,CAAC,SAAS,CAAC,EAAE,YAAY,GAAG,WAAW,CAAC,CAAA;CACpE;AAMD,eAAO,MAAM,sBAAsB,0CAEpB,CAAA;AAGf,eAAO,MAAM,IAAI,iFAiCf,CAAA;AAOF,eAAe,IAAI,CAAA"}
1
+ {"version":3,"file":"Tabs.d.ts","sourceRoot":"","sources":["../../../src/Tabs/Tabs.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,YAAY,EAAE,MAAM,OAAO,CAAA;AACpD,OAAO,KAA8B,MAAM,OAAO,CAAA;AAClD,OAAO,EAAE,IAAI,IAAI,OAAO,EAAE,MAAM,gBAAgB,CAAA;AAEhD,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,wBAAwB,CAAA;AAGvD,oBAAY,aAAa,GAAG,MAAM,GAAG,MAAM,GAAG,IAAI,CAAA;AAElD,MAAM,WAAW,KAAK,CAAC,CAAC,SAAS,aAAa,CAAE,SAAQ,SAAS;IAC/D,6CAA6C;IAC7C,QAAQ,EAAE,SAAS,CAAA;IAEnB,6CAA6C;IAC7C,QAAQ,CAAC,EAAE,CAAC,KAAK,EAAE,KAAK,CAAC,WAAW,CAAC,EAAE,CAAC,GAAG,IAAI,EAAE,KAAK,EAAE,CAAC,KAAK,IAAI,CAAA;IAElE;;;OAGG;IACH,KAAK,EAAE,CAAC,CAAA;IAER,oDAAoD;IACpD,WAAW,CAAC,EAAE,YAAY,GAAG,UAAU,CAAA;IAEvC,yDAAyD;IACzD,OAAO,CAAC,EAAE,YAAY,GAAG,WAAW,CAAA;CACrC;AAED,eAAO,MAAM,WAAW;iBACT,YAAY,GAAG,UAAU;aAC7B,YAAY,GAAG,WAAW;EACmB,CAAA;AAmCxD,QAAA,MAAM,IAAI;;MAgEL,WAAW,cAAc,CAAC,CAAA;AAE/B,eAAe,IAAI,CAAA"}
@@ -9,27 +9,57 @@ var __rest = (this && this.__rest) || function (s, e) {
9
9
  }
10
10
  return t;
11
11
  };
12
- import React, { forwardRef } from 'react';
13
- import { makeStyles } from '@material-ui/core/styles';
14
- import { Tabs as MUITabs } from '@material-ui/core';
15
- import { TabScrollButton } from '../TabScrollButton';
16
- import styles from './styles';
17
- import useTabAction from './use-tab-action';
18
- const useStyles = makeStyles(styles, {
19
- name: 'Tabs',
20
- });
21
- export const TabsOrientationContext = React.createContext('horizontal');
22
- // eslint-disable-next-line react/display-name
23
- export const Tabs = forwardRef(function Tabs(props, ref) {
24
- const { children, orientation, onChange, value, variant = 'scrollable' } = props, rest = __rest(props, ["children", "orientation", "onChange", "value", "variant"]);
25
- const classes = useStyles(props);
26
- const action = useTabAction();
27
- return (React.createElement(TabsOrientationContext.Provider, { value: orientation },
28
- React.createElement(MUITabs, Object.assign({}, rest, { classes: { root: classes[orientation] }, ref: ref, onChange: onChange, value: value, action: action, scrollButtons: 'auto', ScrollButtonComponent: TabScrollButton, orientation: orientation, variant: variant }), children)));
29
- });
30
- Tabs.displayName = 'Tabs';
31
- Tabs.defaultProps = {
32
- orientation: 'horizontal',
12
+ import React, { forwardRef, useMemo } from 'react';
13
+ import { Tabs as MUITabs } from '@mui/base/Tabs';
14
+ import { TabsList } from '@mui/base/TabsList';
15
+ import { twJoin, twMerge } from '@toptal/picasso-tailwind-merge';
16
+ export const TabsContext = React.createContext({ orientation: 'horizontal', variant: 'scrollable' });
17
+ const indicatorClasses = [
18
+ 'after:absolute',
19
+ 'after:content-[""]',
20
+ 'after:bottom-0',
21
+ 'after:left-0',
22
+ 'after:right-0',
23
+ 'after:h-[1px]',
24
+ 'after:bg-gray-500',
25
+ 'after:z-0',
26
+ ];
27
+ const classesByOrientation = {
28
+ vertical: {
29
+ root: 'w-[200px] m-0 flex-col',
30
+ scroller: 'pl-2',
31
+ },
32
+ horizontal: {
33
+ root: '',
34
+ scroller: indicatorClasses,
35
+ },
33
36
  };
37
+ const classesByVariant = {
38
+ scrollable: {
39
+ root: 'overflow-x-auto',
40
+ scroller: '',
41
+ },
42
+ fullWidth: {
43
+ root: '',
44
+ scroller: 'w-full overflow-hidden',
45
+ },
46
+ };
47
+ const Tabs = forwardRef((_a, ref) => {
48
+ var { children, orientation = 'horizontal', onChange, value, variant = 'scrollable', className } = _a, rest = __rest(_a, ["children", "orientation", "onChange", "value", "variant", "className"]);
49
+ const contextValue = useMemo(() => ({
50
+ orientation,
51
+ variant,
52
+ }), [orientation, variant]);
53
+ const isVertical = orientation === 'vertical';
54
+ return (React.createElement(TabsContext.Provider, { value: contextValue },
55
+ React.createElement(MUITabs, Object.assign({}, rest, { slotProps: {
56
+ root: {
57
+ ref,
58
+ className: twMerge('relative min-h-0 flex overflow-hidden', classesByOrientation[orientation].root, classesByVariant[variant].root, className),
59
+ },
60
+ }, onChange: onChange, value: value, orientation: orientation }),
61
+ React.createElement("div", { className: twJoin(classesByVariant[variant].scroller, classesByOrientation[orientation].scroller, 'flex-auto inline-block relative whitespace-nowrap') },
62
+ React.createElement(TabsList, { className: twJoin('flex', isVertical && 'flex-col') }, children)))));
63
+ });
34
64
  export default Tabs;
35
65
  //# sourceMappingURL=Tabs.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"Tabs.js","sourceRoot":"","sources":["../../../src/Tabs/Tabs.tsx"],"names":[],"mappings":";;;;;;;;;;;AACA,OAAO,KAAK,EAAE,EAAE,UAAU,EAAE,MAAM,OAAO,CAAA;AAEzC,OAAO,EAAE,UAAU,EAAE,MAAM,0BAA0B,CAAA;AAErD,OAAO,EAAE,IAAI,IAAI,OAAO,EAAE,MAAM,mBAAmB,CAAA;AAGnD,OAAO,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAA;AACpD,OAAO,MAAM,MAAM,UAAU,CAAA;AAC7B,OAAO,YAAY,MAAM,kBAAkB,CAAA;AAqB3C,MAAM,SAAS,GAAG,UAAU,CAAQ,MAAM,EAAE;IAC1C,IAAI,EAAE,MAAM;CACb,CAAC,CAAA;AAEF,MAAM,CAAC,MAAM,sBAAsB,GAAG,KAAK,CAAC,aAAa,CAEvD,YAAY,CAAC,CAAA;AAEf,8CAA8C;AAC9C,MAAM,CAAC,MAAM,IAAI,GAAG,UAAU,CAA2B,SAAS,IAAI,CACpE,KAAK,EACL,GAAG;IAEH,MAAM,EACJ,QAAQ,EACR,WAAW,EACX,QAAQ,EACR,KAAK,EACL,OAAO,GAAG,YAAY,KAEpB,KAAK,EADJ,IAAI,UACL,KAAK,EAPH,2DAOL,CAAQ,CAAA;IACT,MAAM,OAAO,GAAG,SAAS,CAAC,KAAK,CAAC,CAAA;IAChC,MAAM,MAAM,GAAG,YAAY,EAAE,CAAA;IAE7B,OAAO,CACL,oBAAC,sBAAsB,CAAC,QAAQ,IAAC,KAAK,EAAE,WAAY;QAClD,oBAAC,OAAO,oBACF,IAAI,IACR,OAAO,EAAE,EAAE,IAAI,EAAE,OAAO,CAAC,WAAY,CAAC,EAAE,EACxC,GAAG,EAAE,GAAG,EACR,QAAQ,EAAE,QAAQ,EAClB,KAAK,EAAE,KAAK,EACZ,MAAM,EAAE,MAAM,EACd,aAAa,EAAC,MAAM,EACpB,qBAAqB,EAAE,eAAe,EACtC,WAAW,EAAE,WAAW,EACxB,OAAO,EAAE,OAAO,KAEf,QAAQ,CACD,CACsB,CACnC,CAAA;AACH,CAAC,CAAC,CAAA;AAEF,IAAI,CAAC,WAAW,GAAG,MAAM,CAAA;AACzB,IAAI,CAAC,YAAY,GAAG;IAClB,WAAW,EAAE,YAAY;CAC1B,CAAA;AAED,eAAe,IAAI,CAAA"}
1
+ {"version":3,"file":"Tabs.js","sourceRoot":"","sources":["../../../src/Tabs/Tabs.tsx"],"names":[],"mappings":";;;;;;;;;;;AACA,OAAO,KAAK,EAAE,EAAE,UAAU,EAAE,OAAO,EAAE,MAAM,OAAO,CAAA;AAClD,OAAO,EAAE,IAAI,IAAI,OAAO,EAAE,MAAM,gBAAgB,CAAA;AAChD,OAAO,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAA;AAE7C,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,gCAAgC,CAAA;AAwBhE,MAAM,CAAC,MAAM,WAAW,GAAG,KAAK,CAAC,aAAa,CAG3C,EAAE,WAAW,EAAE,YAAY,EAAE,OAAO,EAAE,YAAY,EAAE,CAAC,CAAA;AAExD,MAAM,gBAAgB,GAAG;IACvB,gBAAgB;IAChB,oBAAoB;IACpB,gBAAgB;IAChB,cAAc;IACd,eAAe;IACf,eAAe;IACf,mBAAmB;IACnB,WAAW;CACZ,CAAA;AAED,MAAM,oBAAoB,GAAG;IAC3B,QAAQ,EAAE;QACR,IAAI,EAAE,wBAAwB;QAC9B,QAAQ,EAAE,MAAM;KACjB;IACD,UAAU,EAAE;QACV,IAAI,EAAE,EAAE;QACR,QAAQ,EAAE,gBAAgB;KAC3B;CACO,CAAA;AAEV,MAAM,gBAAgB,GAAG;IACvB,UAAU,EAAE;QACV,IAAI,EAAE,iBAAiB;QACvB,QAAQ,EAAE,EAAE;KACb;IACD,SAAS,EAAE;QACT,IAAI,EAAE,EAAE;QACR,QAAQ,EAAE,wBAAwB;KACnC;CACO,CAAA;AAEV,MAAM,IAAI,GAAG,UAAU,CACrB,CACE,EAQW,EACX,GAAiC,EACjC,EAAE;QAVF,EACE,QAAQ,EACR,WAAW,GAAG,YAAY,EAC1B,QAAQ,EACR,KAAK,EACL,OAAO,GAAG,YAAY,EACtB,SAAS,OAEA,EADN,IAAI,cAPT,wEAQC,CADQ;IAIT,MAAM,YAAY,GAAG,OAAO,CAC1B,GAAG,EAAE,CAAC,CAAC;QACL,WAAW;QACX,OAAO;KACR,CAAC,EACF,CAAC,WAAW,EAAE,OAAO,CAAC,CACvB,CAAA;IAED,MAAM,UAAU,GAAG,WAAW,KAAK,UAAU,CAAA;IAE7C,OAAO,CACL,oBAAC,WAAW,CAAC,QAAQ,IAAC,KAAK,EAAE,YAAY;QACvC,oBAAC,OAAO,oBACF,IAAI,IACR,SAAS,EAAE;gBACT,IAAI,EAAE;oBACJ,GAAG;oBACH,SAAS,EAAE,OAAO,CAChB,uCAAuC,EACvC,oBAAoB,CAAC,WAAW,CAAC,CAAC,IAAI,EACtC,gBAAgB,CAAC,OAAO,CAAC,CAAC,IAAI,EAC9B,SAAS,CACV;iBACF;aACF,EACD,QAAQ,EACN,QAGS,EAEX,KAAK,EAAE,KAAK,EACZ,WAAW,EAAE,WAAW;YAExB,6BACE,SAAS,EAAE,MAAM,CACf,gBAAgB,CAAC,OAAO,CAAC,CAAC,QAAQ,EAClC,oBAAoB,CAAC,WAAW,CAAC,CAAC,QAAQ,EAC1C,mDAAmD,CACpD;gBAED,oBAAC,QAAQ,IAAC,SAAS,EAAE,MAAM,CAAC,MAAM,EAAE,UAAU,IAAI,UAAU,CAAC,IAC1D,QAAQ,CACA,CACP,CACE,CACW,CACxB,CAAA;AACH,CAAC,CAG4B,CAAA;AAE/B,eAAe,IAAI,CAAA"}
@@ -1,5 +1,6 @@
1
1
  import type { OmitInternalProps } from '@toptal/picasso-shared';
2
- import type { Props } from './Tabs';
2
+ import type { Props, TabsValueType } from './Tabs';
3
3
  export { default as Tabs } from './Tabs';
4
- export declare type TabsProps = OmitInternalProps<Props>;
4
+ export declare type TabsProps = OmitInternalProps<Props<TabsValueType>>;
5
+ export type { TabsValueType } from './Tabs';
5
6
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/Tabs/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,wBAAwB,CAAA;AAE/D,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,QAAQ,CAAA;AAEnC,OAAO,EAAE,OAAO,IAAI,IAAI,EAAE,MAAM,QAAQ,CAAA;AACxC,oBAAY,SAAS,GAAG,iBAAiB,CAAC,KAAK,CAAC,CAAA"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/Tabs/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,wBAAwB,CAAA;AAE/D,OAAO,KAAK,EAAE,KAAK,EAAE,aAAa,EAAE,MAAM,QAAQ,CAAA;AAElD,OAAO,EAAE,OAAO,IAAI,IAAI,EAAE,MAAM,QAAQ,CAAA;AACxC,oBAAY,SAAS,GAAG,iBAAiB,CAAC,KAAK,CAAC,aAAa,CAAC,CAAC,CAAA;AAC/D,YAAY,EAAE,aAAa,EAAE,MAAM,QAAQ,CAAA"}
@@ -1,5 +1,7 @@
1
1
  /// <reference types="react" />
2
- export declare const TabsCompound: import("react").ForwardRefExoticComponent<import("../Tabs/Tabs").Props & import("react").RefAttributes<HTMLButtonElement>> & {
3
- Tab: import("react").ForwardRefExoticComponent<import("../Tab/Tab").Props & import("react").RefAttributes<HTMLDivElement>>;
2
+ export declare const TabsCompound: (<V extends import("../Tabs").TabsValueType = import("../Tabs").TabsValueType>(props: import("../Tabs/Tabs").Props<V> & {
3
+ ref?: import("react").ForwardedRef<HTMLDivElement> | undefined;
4
+ }) => JSX.Element | null) & {
5
+ Tab: import("react").ForwardRefExoticComponent<import("../Tab/Tab").Props & import("react").RefAttributes<HTMLButtonElement>>;
4
6
  };
5
7
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/TabsCompound/index.ts"],"names":[],"mappings":";AAGA,eAAO,MAAM,YAAY;;CAEvB,CAAA"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/TabsCompound/index.ts"],"names":[],"mappings":";AAGA,eAAO,MAAM,YAAY;;;;CAEvB,CAAA"}
@@ -1,4 +1,3 @@
1
- export * from './TabScrollButton';
2
1
  export * from './Tabs';
3
2
  export * from './Tab';
4
3
  export * from './TabDescription';
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,mBAAmB,CAAA;AACjC,cAAc,QAAQ,CAAA;AACtB,cAAc,OAAO,CAAA;AACrB,cAAc,kBAAkB,CAAA;AAChC,cAAc,gBAAgB,CAAA;AAC9B,cAAc,YAAY,CAAA"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,QAAQ,CAAA;AACtB,cAAc,OAAO,CAAA;AACrB,cAAc,kBAAkB,CAAA;AAChC,cAAc,gBAAgB,CAAA;AAC9B,cAAc,YAAY,CAAA"}
@@ -1,4 +1,3 @@
1
- export * from './TabScrollButton';
2
1
  export * from './Tabs';
3
2
  export * from './Tab';
4
3
  export * from './TabDescription';
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,mBAAmB,CAAA;AACjC,cAAc,QAAQ,CAAA;AACtB,cAAc,OAAO,CAAA;AACrB,cAAc,kBAAkB,CAAA;AAChC,cAAc,gBAAgB,CAAA;AAC9B,cAAc,YAAY,CAAA"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,QAAQ,CAAA;AACtB,cAAc,OAAO,CAAA;AACrB,cAAc,kBAAkB,CAAA;AAChC,cAAc,gBAAgB,CAAA;AAC9B,cAAc,YAAY,CAAA"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@toptal/picasso-tabs",
3
- "version": "2.0.9",
3
+ "version": "3.0.1",
4
4
  "description": "Toptal UI components library - Tabs",
5
5
  "publishConfig": {
6
6
  "access": "public"
@@ -22,12 +22,13 @@
22
22
  },
23
23
  "homepage": "https://github.com/toptal/picasso/tree/master/packages/picasso#readme",
24
24
  "dependencies": {
25
- "@toptal/picasso-container": "1.0.3",
26
- "@toptal/picasso-icons": "1.5.0",
25
+ "@mui/base": "5.0.0-beta.40",
26
+ "@toptal/picasso-container": "2.0.0",
27
+ "@toptal/picasso-icons": "1.6.0",
27
28
  "@toptal/picasso-shared": "15.0.0",
28
- "@toptal/picasso-typography": "2.0.2",
29
- "@toptal/picasso-typography-overflow": "2.0.3",
30
- "@toptal/picasso-user-badge": "2.0.8",
29
+ "@toptal/picasso-typography": "3.0.0",
30
+ "@toptal/picasso-typography-overflow": "2.0.4",
31
+ "@toptal/picasso-user-badge": "3.0.1",
31
32
  "@toptal/picasso-utils": "1.0.3",
32
33
  "ap-style-title-case": "^1.1.2",
33
34
  "classnames": "^2.5.1"
@@ -37,16 +38,16 @@
37
38
  "**/styles.js"
38
39
  ],
39
40
  "peerDependencies": {
40
- "@material-ui/core": "4.12.4",
41
- "@toptal/picasso-provider": "*",
42
- "tailwindcss": ">=3",
41
+ "@toptal/picasso-tailwind-merge": "1.2.0",
42
+ "@toptal/picasso-tailwind": ">=2.7",
43
43
  "react": ">=16.12.0 < 19.0.0"
44
44
  },
45
45
  "exports": {
46
46
  ".": "./dist-package/src/index.js"
47
47
  },
48
48
  "devDependencies": {
49
- "@toptal/picasso-provider": "4.2.1",
49
+ "@toptal/picasso-provider": "5.0.0",
50
+ "@toptal/picasso-tailwind-merge": "1.2.0",
50
51
  "@toptal/picasso-test-utils": "1.1.1"
51
52
  },
52
53
  "files": [
package/src/Tab/Tab.tsx CHANGED
@@ -1,22 +1,20 @@
1
1
  import type { ReactNode, HTMLAttributes, ReactElement } from 'react'
2
2
  import React, { forwardRef, useContext } from 'react'
3
- import type { Theme } from '@material-ui/core/styles'
4
- import { makeStyles } from '@material-ui/core/styles'
5
- import type { TabProps } from '@material-ui/core'
6
- import { Tab as MUITab } from '@material-ui/core'
3
+ import type { TabProps } from '@mui/base/Tab'
4
+ import { Tab as MUITab } from '@mui/base/Tab'
7
5
  import type { BaseProps, TextLabelProps } from '@toptal/picasso-shared'
8
6
  import { useTitleCase } from '@toptal/picasso-shared'
9
7
  import { UserBadge } from '@toptal/picasso-user-badge'
8
+ import { twJoin, twMerge } from '@toptal/picasso-tailwind-merge'
10
9
 
11
- import styles from './styles'
12
- import { TabsOrientationContext } from '../Tabs/Tabs'
10
+ import { TabsContext } from '../Tabs/Tabs'
13
11
  import { TabLabel } from '../TabLabel'
14
12
  import { TabDescription } from '../TabDescription'
15
13
 
16
14
  export interface Props
17
15
  extends BaseProps,
18
16
  TextLabelProps,
19
- Omit<HTMLAttributes<HTMLDivElement>, 'onChange'> {
17
+ Omit<HTMLAttributes<HTMLButtonElement>, 'onChange'> {
20
18
  /**
21
19
  * If true, the tab will be disabled
22
20
  * @default false
@@ -45,27 +43,81 @@ export interface Props
45
43
  onClick?: TabProps['onClick']
46
44
  }
47
45
 
48
- const useStyles = makeStyles<Theme>(styles, { name: 'PicassoTab' })
46
+ const getOpacityClass = (
47
+ selected: boolean,
48
+ disabled: boolean,
49
+ orientation: 'horizontal' | 'vertical'
50
+ ) => {
51
+ if (disabled) {
52
+ return 'opacity-50'
53
+ }
54
+
55
+ if (selected || orientation === 'vertical') {
56
+ return 'opacity-100 '
57
+ }
49
58
 
50
- export const Tab = forwardRef<HTMLDivElement, Props>(function Tab(props, ref) {
59
+ return 'opacity-70'
60
+ }
61
+
62
+ const wrapperClassesByOrientation = {
63
+ horizontal: 'inline-flex items-center flex-col justify-center',
64
+ vertical: 'block',
65
+ }
66
+
67
+ const rootClassesByOrientation = (selected: boolean) => ({
68
+ horizontal: [
69
+ 'm-0 [&:not(:last-child)]:mr-8 pt-[0.5625rem] pb-[0.4375rem] px-0',
70
+ 'text-center bg-transparent transition-shadow z-10 rounded-none',
71
+ selected ? 'text-black' : 'text-inheritColor',
72
+ selected && 'shadow-blue-500 shadow-[inset_0_-2px_0]',
73
+ ],
74
+ vertical: [
75
+ ' first:mt-4 last:mb-4 my-1 mx-0 py-2 px-4',
76
+ 'text-left rounded-l-sm rounded-r-none transition-all',
77
+ 'w-full overflow-hidden',
78
+ selected && 'shadow-1',
79
+ selected && [
80
+ 'before:absolute',
81
+ 'before:content-[""]',
82
+ 'before:bottom-0',
83
+ 'before:left-0',
84
+ 'before:top-0',
85
+ 'before:w-[3px]',
86
+ 'before:bg-blue-500',
87
+ ],
88
+ selected
89
+ ? 'bg-gray-50 text-black'
90
+ : 'bg-gray-100 hover:bg-gray-200 text-graphite-700 hover:text-black',
91
+ ],
92
+ })
93
+
94
+ const classesByVariant = {
95
+ scrollable: 'shrink-0 max-w-[264px]',
96
+ fullWidth: 'shrink flex-grow basis-0',
97
+ }
98
+
99
+ export const Tab = forwardRef<HTMLButtonElement, Props>(function Tab(
100
+ props,
101
+ ref
102
+ ) {
51
103
  const {
52
104
  disabled,
53
105
  value,
54
106
  label,
55
107
  icon,
56
- selected,
57
108
  onChange,
58
109
  onClick,
59
110
  titleCase: propsTitleCase,
60
111
  description,
61
112
  avatar,
113
+ className,
62
114
  ...rest
63
115
  } = props
64
- const classes = useStyles()
65
116
  const titleCase = useTitleCase(propsTitleCase)
66
- const orientation = useContext(TabsOrientationContext)
117
+ const { orientation, variant } = useContext(TabsContext)
118
+ const isHorizontal = orientation === 'horizontal'
67
119
 
68
- const labelComponent = getLabelComponent({
120
+ const renderLabel = getLabelComponent({
69
121
  avatar,
70
122
  description,
71
123
  disabled,
@@ -76,22 +128,49 @@ export const Tab = forwardRef<HTMLDivElement, Props>(function Tab(props, ref) {
76
128
 
77
129
  return (
78
130
  <MUITab
131
+ className=''
79
132
  {...rest}
80
133
  ref={ref}
81
134
  tabIndex={0}
82
135
  disabled={disabled}
83
- label={labelComponent}
84
- icon={icon}
85
136
  value={value}
86
- selected={selected}
87
137
  onChange={onChange}
88
138
  onClick={onClick}
89
- classes={{
90
- root: classes[orientation],
91
- selected: classes.selected,
92
- wrapper: classes.wrapper,
139
+ slotProps={{
140
+ root: ownerState => {
141
+ return {
142
+ className: twMerge(
143
+ getOpacityClass(
144
+ ownerState.selected,
145
+ ownerState.disabled,
146
+ orientation
147
+ ),
148
+ rootClassesByOrientation(ownerState.selected)[orientation],
149
+ classesByVariant[variant],
150
+ ownerState.disabled
151
+ ? 'cursor-default text-gray-500'
152
+ : 'cursor-pointer',
153
+ ownerState.disabled && 'pointer-events-none',
154
+ icon && isHorizontal && 'min-h-0 pt-[0.5625rem] pr-6',
155
+ 'min-w-0 sm:min-w-[160px] md:min-w-[auto]',
156
+ 'border-0 cursor-pointer inline-flex outline-none',
157
+ 'items-center select-none align-middle appearance-none',
158
+ 'justify-center no-underline [-webkit-tap-highlight-color:transparent]',
159
+ 'normal-case whitespace-normal leading-4',
160
+ 'relative ',
161
+ className
162
+ ),
163
+ }
164
+ },
93
165
  }}
94
- />
166
+ >
167
+ <span
168
+ className={twJoin('w-full', wrapperClassesByOrientation[orientation])}
169
+ >
170
+ {renderLabel}
171
+ {icon && <span className='absolute right-0 mb-0 h-4'>{icon}</span>}
172
+ </span>
173
+ </MUITab>
95
174
  )
96
175
  })
97
176