@toptal/picasso-button 1.0.13-alpha-fx-5263-merge-feature-branch-d124b1f9a.10 → 1.0.13-alpha-fx-4594-migrate-griditem-4e798b92d.27

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 (90) hide show
  1. package/dist-package/src/Button/Button.d.ts.map +1 -1
  2. package/dist-package/src/Button/Button.js +47 -39
  3. package/dist-package/src/Button/Button.js.map +1 -1
  4. package/dist-package/src/Button/styles.d.ts +45 -19
  5. package/dist-package/src/Button/styles.d.ts.map +1 -1
  6. package/dist-package/src/Button/styles.js +178 -161
  7. package/dist-package/src/Button/styles.js.map +1 -1
  8. package/dist-package/src/ButtonAction/ButtonAction.d.ts.map +1 -1
  9. package/dist-package/src/ButtonAction/ButtonAction.js +28 -20
  10. package/dist-package/src/ButtonAction/ButtonAction.js.map +1 -1
  11. package/dist-package/src/ButtonAction/styles.d.ts +3 -11
  12. package/dist-package/src/ButtonAction/styles.d.ts.map +1 -1
  13. package/dist-package/src/ButtonAction/styles.js +55 -36
  14. package/dist-package/src/ButtonAction/styles.js.map +1 -1
  15. package/dist-package/src/ButtonCircular/ButtonCircular.d.ts.map +1 -1
  16. package/dist-package/src/ButtonCircular/ButtonCircular.js +26 -12
  17. package/dist-package/src/ButtonCircular/ButtonCircular.js.map +1 -1
  18. package/dist-package/src/ButtonCircular/styles.d.ts +3 -15
  19. package/dist-package/src/ButtonCircular/styles.d.ts.map +1 -1
  20. package/dist-package/src/ButtonCircular/styles.js +57 -92
  21. package/dist-package/src/ButtonCircular/styles.js.map +1 -1
  22. package/dist-package/src/ButtonCompound/index.d.ts +1 -1
  23. package/dist-package/src/ButtonControlLabel/ButtonControlLabel.d.ts.map +1 -1
  24. package/dist-package/src/ButtonControlLabel/ButtonControlLabel.js +13 -4
  25. package/dist-package/src/ButtonControlLabel/ButtonControlLabel.js.map +1 -1
  26. package/dist-package/src/ButtonControlLabel/styles.d.ts +2 -2
  27. package/dist-package/src/ButtonControlLabel/styles.d.ts.map +1 -1
  28. package/dist-package/src/ButtonControlLabel/styles.js +25 -16
  29. package/dist-package/src/ButtonControlLabel/styles.js.map +1 -1
  30. package/dist-package/src/ButtonGroup/ButtonGroup.d.ts +1 -1
  31. package/dist-package/src/ButtonGroup/ButtonGroup.d.ts.map +1 -1
  32. package/dist-package/src/ButtonGroup/ButtonGroup.js +27 -5
  33. package/dist-package/src/ButtonGroup/ButtonGroup.js.map +1 -1
  34. package/dist-package/src/ButtonGroup/styles.d.ts +2 -1
  35. package/dist-package/src/ButtonGroup/styles.d.ts.map +1 -1
  36. package/dist-package/src/ButtonGroup/styles.js +47 -20
  37. package/dist-package/src/ButtonGroup/styles.js.map +1 -1
  38. package/dist-package/src/ButtonGroupItem/ButtonGroupItem.d.ts +1 -1
  39. package/dist-package/src/ButtonGroupItem/ButtonGroupItem.d.ts.map +1 -1
  40. package/dist-package/src/ButtonGroupItem/ButtonGroupItem.js +12 -17
  41. package/dist-package/src/ButtonGroupItem/ButtonGroupItem.js.map +1 -1
  42. package/dist-package/src/ButtonGroupItem/styles.d.ts +3 -13
  43. package/dist-package/src/ButtonGroupItem/styles.d.ts.map +1 -1
  44. package/dist-package/src/ButtonGroupItem/styles.js +17 -39
  45. package/dist-package/src/ButtonGroupItem/styles.js.map +1 -1
  46. package/dist-package/src/ButtonSplit/ButtonSplit.d.ts.map +1 -1
  47. package/dist-package/src/ButtonSplit/ButtonSplit.js +24 -28
  48. package/dist-package/src/ButtonSplit/ButtonSplit.js.map +1 -1
  49. package/dist-package/src/ButtonSplit/styles.d.ts +3 -9
  50. package/dist-package/src/ButtonSplit/styles.d.ts.map +1 -1
  51. package/dist-package/src/ButtonSplit/styles.js +50 -13
  52. package/dist-package/src/ButtonSplit/styles.js.map +1 -1
  53. package/package.json +15 -19
  54. package/src/Button/Button.tsx +100 -69
  55. package/src/Button/__snapshots__/test.tsx.snap +4 -8
  56. package/src/Button/styles.ts +221 -214
  57. package/src/Button/test.tsx +1 -3
  58. package/src/ButtonAction/ButtonAction.tsx +48 -36
  59. package/src/ButtonAction/styles.ts +57 -57
  60. package/src/ButtonCheckbox/__snapshots__/test.tsx.snap +3 -4
  61. package/src/ButtonCircular/ButtonCircular.tsx +37 -22
  62. package/src/ButtonCircular/styles.ts +75 -127
  63. package/src/ButtonControlLabel/ButtonControlLabel.tsx +16 -7
  64. package/src/ButtonControlLabel/styles.ts +26 -30
  65. package/src/ButtonGroup/ButtonGroup.tsx +44 -9
  66. package/src/ButtonGroup/__snapshots__/test.tsx.snap +7 -13
  67. package/src/ButtonGroup/styles.ts +63 -21
  68. package/src/ButtonGroupItem/ButtonGroupItem.tsx +15 -24
  69. package/src/ButtonGroupItem/styles.ts +28 -62
  70. package/src/ButtonRadio/__snapshots__/test.tsx.snap +3 -4
  71. package/src/ButtonSplit/ButtonSplit.tsx +42 -46
  72. package/src/ButtonSplit/__snapshots__/test.tsx.snap +9 -13
  73. package/src/ButtonSplit/styles.ts +56 -37
  74. package/dist-package/src/ButtonBase/ButtonBase.d.ts +0 -29
  75. package/dist-package/src/ButtonBase/ButtonBase.d.ts.map +0 -1
  76. package/dist-package/src/ButtonBase/ButtonBase.js +0 -78
  77. package/dist-package/src/ButtonBase/ButtonBase.js.map +0 -1
  78. package/dist-package/src/ButtonBase/index.d.ts +0 -5
  79. package/dist-package/src/ButtonBase/index.d.ts.map +0 -1
  80. package/dist-package/src/ButtonBase/index.js +0 -2
  81. package/dist-package/src/ButtonBase/index.js.map +0 -1
  82. package/dist-package/src/ButtonBase/styles.d.ts +0 -6
  83. package/dist-package/src/ButtonBase/styles.d.ts.map +0 -1
  84. package/dist-package/src/ButtonBase/styles.js +0 -29
  85. package/dist-package/src/ButtonBase/styles.js.map +0 -1
  86. package/src/ButtonBase/ButtonBase.tsx +0 -182
  87. package/src/ButtonBase/__snapshots__/test.tsx.snap +0 -262
  88. package/src/ButtonBase/index.ts +0 -5
  89. package/src/ButtonBase/styles.ts +0 -36
  90. package/src/ButtonBase/test.tsx +0 -212
@@ -6,46 +6,40 @@ exports[`ButtonGroup render 1`] = `
6
6
  class="Picasso-root"
7
7
  >
8
8
  <div
9
- class="flex justify-start [&>[data-component-type="button"]:hover]:z [&>[data-component-type="button"]:first-child:not(:last-child)]:rounded-r [&>[data-component-type="button"]:first-child:not(:last-child)]:ml [&>[data-component-type="button"]:not(:first-child):not(:last-child)]:rounded [&>[data-component-type="button"]:not(:first-child):not(:last-child)]:ml-[ [&>[data-component-type="button"]:last-child:not(:first-child)]:rounded-l [&>[data-component-type="button"]:last-child:not(:first-child)]:ml-[ [&_:first-child:not(:last-child)_[data-component-type="button"]]:rounded-r [&_:first-child:not(:last-child)_[data-component-type="button"]]:ml [&_:not(:first-child):not(:last-child)_[data-component-type="button"]]:rounded [&_:not(:first-child):not(:last-child)_[data-component-type="button"]]:ml-[ [&_:last-child:not(:first-child)_[data-component-type="button"]]:rounded-l [&_:last-child:not(:first-child)_[data-component-type="button"]]:ml-["
9
+ class="PicassoButtonGroup-root"
10
10
  >
11
11
  <button
12
- aria-disabled="false"
13
- class="base-Button text-lg inline-flex items-center justify-center select-none appearance-none m-0 relative normal-case align-middle duration-350 ease-out shrink-0 outline-none [&+&]:ml-4 cursor-pointer no-underline rounded-sm shadow-none focus-visible:shadow-[0_0_0_3px_rgba(32,78,207,0.48)] focus-within:shadow-[0_0_0_3px_rgba(32,78,207,0.48)] border bg-white min-w h-8 py-0 px-4 transition-[color,background] active:z-[1] hover:z-[1] focus-visible:z-[1] disabled:z-[1] visited:text-black border-solid active:bg-graphite active:border-graphite active:text-white hover:border-black border-gray text-black"
12
+ class="MuiButtonBase-root PicassoButton-medium PicassoButton-secondary PicassoButton-root PicassoButtonGroupItem-root PicassoButtonGroupItem-group"
14
13
  data-component-type="button"
15
- role="button"
16
14
  tabindex="0"
17
15
  type="button"
18
16
  >
19
17
  <span
20
- class="PicassoContainer-centerAlignItems PicassoContainer-flex PicassoContainer-inline font-semibold whitespace-nowrap text-button"
18
+ class="PicassoContainer-centerAlignItems PicassoContainer-flex PicassoContainer-inline PicassoButton-content"
21
19
  >
22
20
  One
23
21
  </span>
24
22
  </button>
25
23
  <button
26
- aria-disabled="false"
27
- class="base-Button text-lg inline-flex items-center justify-center select-none appearance-none m-0 relative normal-case align-middle duration-350 ease-out shrink-0 outline-none [&+&]:ml-4 cursor-pointer no-underline rounded-sm focus-visible:shadow-[0_0_0_3px_rgba(32,78,207,0.48)] focus-within:shadow-[0_0_0_3px_rgba(32,78,207,0.48)] border min-w h-8 py-0 px-4 transition-[color,background] active:z-[1] hover:z-[1] focus-visible:z-[1] disabled:z-[1] z-[1] visited:text-black border-solid active:bg-graphite active:border-graphite active:text-white hover:border-black bg-graphite border-graphite text-white shadow-none"
24
+ class="MuiButtonBase-root PicassoButton-active PicassoButton-medium PicassoButton-secondary PicassoButton-root PicassoButtonGroupItem-root PicassoButtonGroupItem-group PicassoButtonGroupItem-active"
28
25
  data-component-type="button"
29
- role="button"
30
26
  tabindex="0"
31
27
  type="button"
32
28
  >
33
29
  <span
34
- class="PicassoContainer-centerAlignItems PicassoContainer-flex PicassoContainer-inline font-semibold whitespace-nowrap text-button"
30
+ class="PicassoContainer-centerAlignItems PicassoContainer-flex PicassoContainer-inline PicassoButton-content"
35
31
  >
36
32
  Two
37
33
  </span>
38
34
  </button>
39
35
  <button
40
- aria-disabled="false"
41
- class="base-Button text-lg inline-flex items-center justify-center select-none appearance-none m-0 relative normal-case align-middle duration-350 ease-out shrink-0 outline-none [&+&]:ml-4 cursor-pointer no-underline rounded-sm shadow-none focus-visible:shadow-[0_0_0_3px_rgba(32,78,207,0.48)] focus-within:shadow-[0_0_0_3px_rgba(32,78,207,0.48)] border bg-white min-w h-8 py-0 px-4 transition-[color,background] active:z-[1] hover:z-[1] focus-visible:z-[1] disabled:z-[1] visited:text-black border-solid active:bg-graphite active:border-graphite active:text-white hover:border-black border-gray text-black"
36
+ class="MuiButtonBase-root PicassoButton-medium PicassoButton-secondary PicassoButton-root PicassoButtonGroupItem-root PicassoButtonGroupItem-group"
42
37
  data-component-type="button"
43
- role="button"
44
38
  tabindex="0"
45
39
  type="button"
46
40
  >
47
41
  <span
48
- class="PicassoContainer-centerAlignItems PicassoContainer-flex PicassoContainer-inline font-semibold whitespace-nowrap text-button"
42
+ class="PicassoContainer-centerAlignItems PicassoContainer-flex PicassoContainer-inline PicassoButton-content"
49
43
  >
50
44
  Three
51
45
  </span>
@@ -1,29 +1,71 @@
1
- export const createRootClassNames = () => {
2
- const classNames: string[] = [
3
- 'flex',
4
- 'justify-start',
1
+ import { createStyles } from '@material-ui/core/styles'
5
2
 
6
- '[&>[data-component-type="button"]:hover]:z-[1]',
3
+ const baseButtonProps = {
4
+ transitionProperty: 'color, background',
7
5
 
8
- '[&>[data-component-type="button"]:first-child:not(:last-child)]:rounded-r-none',
9
- '[&>[data-component-type="button"]:first-child:not(:last-child)]:ml-0',
6
+ '&:active, &$active, &:hover, &$hovered, &:focus, &$focused': {
7
+ // border overlap to keep proper border width, but on state change
8
+ // we need to move up overlapped border
9
+ zIndex: 1,
10
+ },
11
+ }
12
+
13
+ const firstButtonProps = {
14
+ borderTopRightRadius: 0,
15
+ borderBottomRightRadius: 0,
16
+ marginLeft: '0rem',
17
+ }
18
+
19
+ const middleButtonProps = {
20
+ borderRadius: 0,
21
+ // prevents border between 2 buttons to be wider then specified
22
+ marginLeft: '-1px',
23
+ }
24
+
25
+ const lastButtonProps = {
26
+ borderTopLeftRadius: 0,
27
+ borderBottomLeftRadius: 0,
28
+ // prevents border between 2 buttons to be wider then specified
29
+ marginLeft: '-1px',
30
+ }
10
31
 
11
- '[&>[data-component-type="button"]:not(:first-child):not(:last-child)]:rounded-none',
12
- '[&>[data-component-type="button"]:not(:first-child):not(:last-child)]:ml-[-1px]',
32
+ export default () =>
33
+ createStyles({
34
+ root: {
35
+ display: 'flex',
36
+ justifyContent: 'flex-start',
13
37
 
14
- '[&>[data-component-type="button"]:last-child:not(:first-child)]:rounded-l-none',
15
- '[&>[data-component-type="button"]:last-child:not(:first-child)]:ml-[-1px]',
38
+ // default case
39
+ '& [data-component-type="button"]': {
40
+ ...baseButtonProps,
16
41
 
17
- // nested buttons
18
- '[&_:first-child:not(:last-child)_[data-component-type="button"]]:rounded-r-none',
19
- '[&_:first-child:not(:last-child)_[data-component-type="button"]]:ml-0',
42
+ // first item
43
+ '&:first-child:not(:last-child)': firstButtonProps,
44
+ // middle item
45
+ '&:not(:first-child):not(:last-child)': middleButtonProps,
46
+ // last item
47
+ '&:last-child:not(:first-child)': lastButtonProps,
48
+ },
20
49
 
21
- '[&_:not(:first-child):not(:last-child)_[data-component-type="button"]]:rounded-none',
22
- '[&_:not(:first-child):not(:last-child)_[data-component-type="button"]]:ml-[-1px]',
50
+ // nested case when button is nested in first item in ButtonGroup
51
+ '& :first-child:not(:last-child) [data-component-type="button"]': {
52
+ ...baseButtonProps,
53
+ ...firstButtonProps,
54
+ },
23
55
 
24
- '[&_:last-child:not(:first-child)_[data-component-type="button"]]:rounded-l-none',
25
- '[&_:last-child:not(:first-child)_[data-component-type="button"]]:ml-[-1px]',
26
- ]
56
+ // nested case when button is nested in middle item in ButtonGroup
57
+ '& :not(:first-child):not(:last-child) [data-component-type="button"]': {
58
+ ...baseButtonProps,
59
+ ...middleButtonProps,
60
+ },
27
61
 
28
- return classNames
29
- }
62
+ // nested case when button is nested in last item in ButtonGroup
63
+ '& :last-child:not(:first-child) [data-component-type="button"]': {
64
+ ...baseButtonProps,
65
+ ...lastButtonProps,
66
+ },
67
+ },
68
+ active: {},
69
+ focused: {},
70
+ hovered: {},
71
+ })
@@ -1,37 +1,28 @@
1
1
  import React from 'react'
2
- import { twMerge } from 'tailwind-merge'
2
+ import type { Theme } from '@material-ui/core'
3
+ import { makeStyles } from '@material-ui/core'
4
+ import cx from 'classnames'
3
5
 
4
6
  import type { ButtonProps } from '../Button'
5
7
  import { Button } from '../Button'
6
- import {
7
- createButtonGroupItemClassNames,
8
- createGroupVariantClassNames,
9
- } from './styles'
8
+ import styles from './styles'
9
+
10
+ const useStyles = makeStyles<Theme>(styles, {
11
+ name: 'PicassoButtonGroupItem',
12
+ })
10
13
 
11
14
  export interface Props extends ButtonProps {}
12
15
 
13
- const ButtonGroupItem = ({
14
- active,
15
- disabled,
16
- focused,
17
- hovered,
18
- className,
19
- ...rest
20
- }: Props) => {
21
- const finalClassName = twMerge(
22
- createButtonGroupItemClassNames({ active, disabled, focused, hovered }),
23
- createGroupVariantClassNames({ active, disabled, hovered }),
24
- className
25
- )
16
+ const ButtonGroupItem = (props: Props) => {
17
+ const classes = useStyles()
26
18
 
27
19
  return (
28
20
  <Button
29
- {...rest}
30
- active={active}
31
- disabled={disabled}
32
- focused={focused}
33
- hovered={hovered}
34
- className={finalClassName}
21
+ {...props}
22
+ className={cx(props.className, classes.root, classes.group, {
23
+ [classes.active]: props.active,
24
+ [classes.disabled]: props.disabled,
25
+ })}
35
26
  variant='secondary'
36
27
  />
37
28
  )
@@ -1,64 +1,30 @@
1
- export const createButtonGroupItemClassNames = ({
2
- disabled,
3
- focused,
4
- hovered,
5
- active,
6
- }: {
7
- disabled?: boolean
8
- focused?: boolean
9
- hovered?: boolean
10
- active?: boolean
11
- loading?: boolean
12
- }) => {
13
- const classNames = [
14
- 'border-solid',
15
- 'transition-[color,background]',
16
- 'active:z-[1] hover:z-[1] focus-visible:z-[1] disabled:z-[1]',
17
- ]
1
+ import type { Theme } from '@material-ui/core/styles'
2
+ import { createStyles } from '@material-ui/core/styles'
18
3
 
19
- if (active || hovered || focused || disabled) {
20
- classNames.push('z-[1]')
21
- }
4
+ import {
5
+ createOutlineCommons,
6
+ activeGroup,
7
+ disabledGroup,
8
+ } from '../Button/styles'
22
9
 
23
- return classNames
24
- }
25
-
26
- export const createGroupVariantClassNames = ({
27
- disabled,
28
- hovered,
29
- active,
30
- }: {
31
- disabled?: boolean
32
- hovered?: boolean
33
- active?: boolean
34
- loading?: boolean
35
- }): string[] => {
36
- const classNames = ['visited:text-black', 'border-solid']
37
-
38
- if (disabled) {
39
- classNames.push('cursor-not-allowed')
40
- classNames.push('text-gray-500')
41
-
42
- if (active) {
43
- classNames.push('bg-graphite-700 border-graphite-700')
44
- } else {
45
- classNames.push('border-gray-500')
46
- }
47
- } else {
48
- classNames.push(
49
- 'active:bg-graphite-700 active:border-graphite-700 active:text-white'
50
- )
51
- classNames.push('hover:border-black')
52
-
53
- if (hovered) {
54
- classNames.push('border-black text-black')
55
- } else if (active) {
56
- classNames.push('bg-graphite-700 border-graphite-700 text-white')
57
- classNames.push('shadow-none')
58
- } else {
59
- classNames.push('border-gray-400 text-black')
60
- }
61
- }
62
-
63
- return classNames
64
- }
10
+ export default (theme: Theme) =>
11
+ createStyles({
12
+ root: {
13
+ '&:active, &$active, &:hover, &$hovered, &:focus, &$focused, &:disabled, &$disabled':
14
+ {
15
+ // border overlap to keep proper border width, but on state change
16
+ // we need to move up overlapped border
17
+ zIndex: 1,
18
+ },
19
+ '&$group': {
20
+ ...createOutlineCommons(theme),
21
+ '&:active, &$active': activeGroup(theme),
22
+ '&:disabled, &$disabled': disabledGroup(theme),
23
+ },
24
+ },
25
+ active: {},
26
+ hovered: {},
27
+ focused: {},
28
+ disabled: {},
29
+ group: {},
30
+ })
@@ -7,14 +7,13 @@ exports[`ButtonRadio renders 1`] = `
7
7
  >
8
8
  <label
9
9
  aria-disabled="false"
10
- class="base-Button text-lg inline-flex items-center justify-center select-none appearance-none m-0 relative normal-case align-middle transition-colors duration-350 ease-out shrink-0 outline-none [&+&]:ml-4 cursor-pointer no-underline rounded-sm shadow-none focus-visible:shadow-[0_0_0_3px_rgba(32,78,207,0.48)] focus-within:shadow-[0_0_0_3px_rgba(32,78,207,0.48)] border border-solid text-black hover:border-black visited:text-black active:bg-gray active:border-black bg-white border-gray min-w h-8 px-4 text-center py-2 pr-6 pl-4"
10
+ class="MuiButtonBase-root PicassoButton-medium PicassoButton-secondary PicassoButton-root PicassoButtonControlLabel-root PicassoButtonControlLabel-medium"
11
11
  data-component-type="button"
12
12
  role="button"
13
13
  tabindex="0"
14
- type="button"
15
14
  >
16
15
  <span
17
- class="PicassoContainer-centerAlignItems PicassoContainer-flex PicassoContainer-inline font-semibold whitespace-nowrap text-button"
16
+ class="PicassoContainer-centerAlignItems PicassoContainer-flex PicassoContainer-inline PicassoButton-content"
18
17
  >
19
18
  <span
20
19
  aria-disabled="false"
@@ -34,7 +33,7 @@ exports[`ButtonRadio renders 1`] = `
34
33
  </span>
35
34
  </span>
36
35
  <div
37
- class="min-w"
36
+ class="PicassoButtonControlLabel-content"
38
37
  style="margin-left: 0.5rem;"
39
38
  >
40
39
  Click me!
@@ -1,18 +1,16 @@
1
1
  import type { ReactNode, MouseEvent, HTMLAttributes } from 'react'
2
2
  import React, { forwardRef } from 'react'
3
+ import type { Theme } from '@material-ui/core/styles'
4
+ import { makeStyles } from '@material-ui/core/styles'
3
5
  import type { SizeType, BaseProps } from '@toptal/picasso-shared'
4
- import { twMerge } from 'tailwind-merge'
6
+ import cx from 'classnames'
5
7
  import { ArrowDownMinor24, ArrowDownMinor16 } from '@toptal/picasso-icons'
6
8
  import { Dropdown } from '@toptal/picasso-dropdown'
7
9
 
8
10
  import type { ButtonProps } from '../Button'
9
11
  import { Button } from '../Button'
10
12
  import { ButtonGroup } from '../ButtonGroup'
11
- import { createButtonGroupItemClassNames } from '../ButtonGroupItem/styles'
12
- import {
13
- createActionButtonClassNames,
14
- createMenuButtonClassNames,
15
- } from './styles'
13
+ import styles from './styles'
16
14
 
17
15
  export interface Props
18
16
  extends BaseProps,
@@ -37,6 +35,13 @@ export interface Props
37
35
  menuButton?: string
38
36
  }
39
37
  }
38
+ // Using { index: -1 } to inject CSS link to the bottom of the head
39
+ // in order to prevent Button's styles to override ButtonSplit's ones
40
+ // Related Jira issue: https://toptal-core.atlassian.net/browse/FX-1520
41
+ const useStyles = makeStyles<Theme>(styles, {
42
+ name: 'PicassoButtonSplit',
43
+ index: -1,
44
+ })
40
45
 
41
46
  const DropdownIcon = ({
42
47
  size,
@@ -78,35 +83,37 @@ export const ButtonSplit = forwardRef<HTMLDivElement, Props>(
78
83
  testIds = {},
79
84
  ...rest
80
85
  } = props
86
+ const classes = useStyles()
81
87
 
82
- const renderMenuButton = ({ isOpen }: { isOpen: boolean }) => {
83
- const menuButtonClassName = twMerge(
84
- createButtonGroupItemClassNames({
85
- active: menuButtonProps?.active,
86
- hovered: menuButtonProps?.hovered,
87
- disabled: menuButtonProps?.disabled || disabled,
88
- focused: menuButtonProps?.focused,
89
- }),
90
- createMenuButtonClassNames({
91
- variant,
92
- size,
93
- disabled: menuButtonProps?.disabled || disabled,
94
- }),
95
- menuButtonProps?.className
96
- )
97
-
98
- const iconClassName = isOpen ? 'rotate-180' : ''
88
+ const commonClasses = cx(classes.button, {
89
+ [classes.primaryVariant]: variant === 'primary',
90
+ [classes.disabled]: disabled,
91
+ })
99
92
 
93
+ const renderMenuButton = ({
94
+ isOpen,
95
+ disabled,
96
+ }: {
97
+ isOpen: boolean
98
+ disabled?: boolean
99
+ }) => {
100
100
  const menuButton = (
101
101
  <Button
102
102
  {...menuButtonProps}
103
103
  variant={variant}
104
- className={menuButtonClassName}
104
+ className={`${commonClasses} ${classes.menuButton} ${
105
+ classes[`${size}Size`]
106
+ }`}
105
107
  size={size}
106
108
  disabled={disabled}
107
109
  data-testid={testIds.menuButton}
108
110
  >
109
- <DropdownIcon className={iconClassName} size={size} />
111
+ <DropdownIcon
112
+ className={cx({
113
+ [classes.rotated]: isOpen,
114
+ })}
115
+ size={size}
116
+ />
110
117
  </Button>
111
118
  )
112
119
 
@@ -117,29 +124,11 @@ export const ButtonSplit = forwardRef<HTMLDivElement, Props>(
117
124
  )
118
125
  }
119
126
 
120
- const actionButtonClassName = twMerge(
121
- createButtonGroupItemClassNames({
122
- active: actionButtonProps?.active,
123
- hovered: actionButtonProps?.hovered,
124
- disabled: actionButtonProps?.disabled || disabled,
125
- focused: actionButtonProps?.focused,
126
- }),
127
- createActionButtonClassNames({
128
- variant,
129
- }),
130
- actionButtonProps?.className
131
- )
132
-
133
- const dropdownClassName = twMerge(
134
- 'block cursor-pointer',
135
- disabled && '[&>div]:cursor-auto'
136
- )
137
-
138
127
  return (
139
128
  <ButtonGroup {...rest} ref={ref} style={style} className={className}>
140
129
  <Button
141
130
  {...actionButtonProps}
142
- className={actionButtonClassName}
131
+ className={`${commonClasses} ${classes.actionButton}`}
143
132
  size={size}
144
133
  variant={variant}
145
134
  disabled={disabled}
@@ -148,8 +137,15 @@ export const ButtonSplit = forwardRef<HTMLDivElement, Props>(
148
137
  >
149
138
  {children}
150
139
  </Button>
151
- <Dropdown content={menu} className={dropdownClassName}>
152
- {({ isOpen }: { isOpen: boolean }) => renderMenuButton({ isOpen })}
140
+ <Dropdown
141
+ content={menu}
142
+ className={cx(classes.dropdown, {
143
+ [classes.disabled]: disabled,
144
+ })}
145
+ >
146
+ {({ isOpen }: { isOpen: boolean }) =>
147
+ renderMenuButton({ isOpen, disabled })
148
+ }
153
149
  </Dropdown>
154
150
  </ButtonGroup>
155
151
  )
@@ -2,7 +2,7 @@
2
2
 
3
3
  exports[`ButtonSplit closes menu on click to the item 1`] = `
4
4
  <svg
5
- class="PicassoSvgArrowDownMinor24-root-172"
5
+ class="PicassoSvgArrowDownMinor24-root-206"
6
6
  style="min-width: 24px; min-height: 24px;"
7
7
  viewBox="0 0 24 24"
8
8
  >
@@ -18,38 +18,34 @@ exports[`ButtonSplit default render 1`] = `
18
18
  class="Picasso-root"
19
19
  >
20
20
  <div
21
- class="flex justify-start [&>[data-component-type="button"]:hover]:z [&>[data-component-type="button"]:first-child:not(:last-child)]:rounded-r [&>[data-component-type="button"]:first-child:not(:last-child)]:ml [&>[data-component-type="button"]:not(:first-child):not(:last-child)]:rounded [&>[data-component-type="button"]:not(:first-child):not(:last-child)]:ml-[ [&>[data-component-type="button"]:last-child:not(:first-child)]:rounded-l [&>[data-component-type="button"]:last-child:not(:first-child)]:ml-[ [&_:first-child:not(:last-child)_[data-component-type="button"]]:rounded-r [&_:first-child:not(:last-child)_[data-component-type="button"]]:ml [&_:not(:first-child):not(:last-child)_[data-component-type="button"]]:rounded [&_:not(:first-child):not(:last-child)_[data-component-type="button"]]:ml-[ [&_:last-child:not(:first-child)_[data-component-type="button"]]:rounded-l [&_:last-child:not(:first-child)_[data-component-type="button"]]:ml-["
21
+ class="PicassoButtonGroup-root"
22
22
  >
23
23
  <button
24
- aria-disabled="false"
25
- class="base-Button text-lg inline-flex items-center justify-center select-none appearance-none m-0 relative normal-case align-middle duration-350 ease-out shrink-0 outline-none [&+&]:ml-4 cursor-pointer no-underline rounded-sm shadow-none focus-visible:shadow-[0_0_0_3px_rgba(32,78,207,0.48)] focus-within:shadow-[0_0_0_3px_rgba(32,78,207,0.48)] text-white visited:text-white hover:bg-[#4269D6] active:bg-[#1A41AB] bg-blue min-w h-8 py-0 px-4 active:z-[1] hover:z-[1] focus-visible:z-[1] disabled:z-[1] transition-[color,background] border-r border-l border-y border-solid border-blue"
24
+ class="MuiButtonBase-root PicassoButton-medium PicassoButton-primary PicassoButton-root PicassoButtonSplit-primaryVariant PicassoButtonSplit-actionButton"
26
25
  data-component-type="button"
27
- role="button"
28
26
  tabindex="0"
29
27
  type="button"
30
28
  >
31
29
  <span
32
- class="PicassoContainer-centerAlignItems PicassoContainer-flex PicassoContainer-inline font-semibold whitespace-nowrap text-button"
30
+ class="PicassoContainer-centerAlignItems PicassoContainer-flex PicassoContainer-inline PicassoButton-content"
33
31
  >
34
32
  Action
35
33
  </span>
36
34
  </button>
37
35
  <div
38
- class="PicassoDropdown-root block cursor-pointer"
36
+ class="PicassoDropdown-root PicassoButtonSplit-dropdown"
39
37
  >
40
38
  <div
41
39
  class="PicassoDropdown-anchor"
42
40
  >
43
41
  <button
44
- aria-disabled="false"
45
- class="base-Button text-lg inline-flex items-center justify-center select-none appearance-none m-0 relative normal-case align-middle duration-350 ease-out shrink-0 outline-none [&+&]:ml-4 cursor-pointer no-underline rounded-sm shadow-none focus-visible:shadow-[0_0_0_3px_rgba(32,78,207,0.48)] focus-within:shadow-[0_0_0_3px_rgba(32,78,207,0.48)] text-white visited:text-white hover:bg-[#4269D6] active:bg-[#1A41AB] bg-blue h-8 py-0 transition-[color,background] active:z-[1] hover:z-[1] focus-visible:z-[1] disabled:z-[1] min-w px-[0.5em] border-l border-r border-y border-solid border-blue"
42
+ class="MuiButtonBase-root PicassoButton-medium PicassoButton-primary PicassoButton-root PicassoButtonSplit-primaryVariant PicassoButtonSplit-menuButton PicassoButtonSplit-mediumSize"
46
43
  data-component-type="button"
47
- role="button"
48
44
  tabindex="0"
49
45
  type="button"
50
46
  >
51
47
  <span
52
- class="PicassoContainer-centerAlignItems PicassoContainer-flex PicassoContainer-inline font-semibold whitespace-nowrap text-button"
48
+ class="PicassoContainer-centerAlignItems PicassoContainer-flex PicassoContainer-inline PicassoButton-content"
53
49
  >
54
50
  <svg
55
51
  class="PicassoSvgArrowDownMinor16-root"
@@ -71,7 +67,7 @@ exports[`ButtonSplit default render 1`] = `
71
67
 
72
68
  exports[`ButtonSplit renders arrow down icon for a closed menu 1`] = `
73
69
  <svg
74
- class="PicassoSvgArrowDownMinor16-root-172"
70
+ class="PicassoSvgArrowDownMinor16-root-206"
75
71
  style="min-width: 16px; min-height: 16px;"
76
72
  viewBox="0 0 16 16"
77
73
  >
@@ -83,7 +79,7 @@ exports[`ButtonSplit renders arrow down icon for a closed menu 1`] = `
83
79
 
84
80
  exports[`ButtonSplit renders arrow up icon for an opened menu 1`] = `
85
81
  <svg
86
- class="PicassoSvgArrowDownMinor16-root-172 rotate-180"
82
+ class="PicassoSvgArrowDownMinor16-root-206 PicassoButtonSplit-rotated-12"
87
83
  style="min-width: 16px; min-height: 16px;"
88
84
  viewBox="0 0 16 16"
89
85
  >
@@ -1,40 +1,59 @@
1
- import type { SizeType } from '@toptal/picasso-shared'
2
- import { twMerge } from 'tailwind-merge'
1
+ import type { Theme } from '@material-ui/core/styles'
2
+ import { createStyles } from '@material-ui/core/styles'
3
3
 
4
- export const createActionButtonClassNames = ({
5
- variant,
6
- }: {
7
- variant?: 'primary' | 'secondary'
8
- }) => {
9
- return twMerge(
10
- 'transition-[color,background]',
11
- variant === 'primary' &&
12
- 'border-r border-l-0 border-y-0 border-solid border-blue-700'
13
- )
14
- }
4
+ export default ({ palette }: Theme) =>
5
+ createStyles({
6
+ actionButton: {
7
+ borderTopRightRadius: 0,
8
+ borderBottomRightRadius: 0,
9
+ },
10
+ menuButton: {
11
+ minWidth: '2em',
12
+ paddingLeft: '0.5em',
13
+ paddingRight: '0.5em',
14
+ borderTopLeftRadius: 0,
15
+ borderBottomLeftRadius: 0,
16
+ marginLeft: 0,
17
+ },
15
18
 
16
- const menuButtonSizeClassNames: Record<
17
- SizeType<'small' | 'medium' | 'large'>,
18
- string
19
- > = {
20
- small: 'min-w-[1.5em] px-[0.25em]',
21
- medium: 'min-w-[2em] px-[0.5em]',
22
- large: 'min-w-[3em] px-[0.75em]',
23
- }
19
+ primaryVariant: {
20
+ '&$actionButton': {
21
+ borderRight: `1px solid ${palette.blue.darker}`,
22
+ },
23
+ '&$menuButton': {
24
+ borderLeft: `1px solid ${palette.blue.darker}`,
24
25
 
25
- export const createMenuButtonClassNames = ({
26
- variant,
27
- size,
28
- disabled,
29
- }: {
30
- variant?: 'primary' | 'secondary'
31
- size: SizeType<'small' | 'medium' | 'large'>
32
- disabled?: boolean
33
- }) => {
34
- return twMerge(
35
- menuButtonSizeClassNames[size],
36
- variant === 'primary' && 'border-l border-r-0 border-y-0 border-solid',
37
- variant === 'primary' && disabled && 'border-gray-500',
38
- variant === 'primary' && !disabled && 'border-blue-700'
39
- )
40
- }
26
+ '&$disabled': {
27
+ borderLeftColor: palette.grey.main,
28
+ },
29
+ },
30
+ },
31
+
32
+ smallSize: {
33
+ minWidth: '1.5em',
34
+ paddingLeft: '0.25em',
35
+ paddingRight: '0.25em',
36
+ },
37
+ mediumSize: {},
38
+ largeSize: {
39
+ minWidth: '3em',
40
+ paddingLeft: '0.75em',
41
+ paddingRight: '0.75em',
42
+ },
43
+
44
+ dropdown: {
45
+ display: 'block',
46
+ cursor: 'pointer',
47
+ },
48
+
49
+ disabled: {
50
+ // override dropdown anchor styles
51
+ '& > div': {
52
+ cursor: 'auto',
53
+ },
54
+ },
55
+
56
+ rotated: {
57
+ transform: 'rotate(180deg)',
58
+ },
59
+ })