@toptal/picasso-button 1.0.13-alpha-fx-5263-merge-feature-branch-d124b1f9a.10 → 1.0.13-alpha-fx-4593-migrate-tag-4f7c872c8.4
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist-package/src/Button/Button.d.ts.map +1 -1
- package/dist-package/src/Button/Button.js +47 -39
- package/dist-package/src/Button/Button.js.map +1 -1
- package/dist-package/src/Button/styles.d.ts +45 -19
- package/dist-package/src/Button/styles.d.ts.map +1 -1
- package/dist-package/src/Button/styles.js +178 -161
- package/dist-package/src/Button/styles.js.map +1 -1
- package/dist-package/src/ButtonAction/ButtonAction.d.ts.map +1 -1
- package/dist-package/src/ButtonAction/ButtonAction.js +28 -20
- package/dist-package/src/ButtonAction/ButtonAction.js.map +1 -1
- package/dist-package/src/ButtonAction/styles.d.ts +3 -11
- package/dist-package/src/ButtonAction/styles.d.ts.map +1 -1
- package/dist-package/src/ButtonAction/styles.js +55 -36
- package/dist-package/src/ButtonAction/styles.js.map +1 -1
- package/dist-package/src/ButtonCircular/ButtonCircular.d.ts.map +1 -1
- package/dist-package/src/ButtonCircular/ButtonCircular.js +26 -12
- package/dist-package/src/ButtonCircular/ButtonCircular.js.map +1 -1
- package/dist-package/src/ButtonCircular/styles.d.ts +3 -15
- package/dist-package/src/ButtonCircular/styles.d.ts.map +1 -1
- package/dist-package/src/ButtonCircular/styles.js +57 -92
- package/dist-package/src/ButtonCircular/styles.js.map +1 -1
- package/dist-package/src/ButtonCompound/index.d.ts +1 -1
- package/dist-package/src/ButtonControlLabel/ButtonControlLabel.d.ts.map +1 -1
- package/dist-package/src/ButtonControlLabel/ButtonControlLabel.js +13 -4
- package/dist-package/src/ButtonControlLabel/ButtonControlLabel.js.map +1 -1
- package/dist-package/src/ButtonControlLabel/styles.d.ts +2 -2
- package/dist-package/src/ButtonControlLabel/styles.d.ts.map +1 -1
- package/dist-package/src/ButtonControlLabel/styles.js +25 -16
- package/dist-package/src/ButtonControlLabel/styles.js.map +1 -1
- package/dist-package/src/ButtonGroup/ButtonGroup.d.ts +1 -1
- package/dist-package/src/ButtonGroup/ButtonGroup.d.ts.map +1 -1
- package/dist-package/src/ButtonGroup/ButtonGroup.js +27 -5
- package/dist-package/src/ButtonGroup/ButtonGroup.js.map +1 -1
- package/dist-package/src/ButtonGroup/styles.d.ts +2 -1
- package/dist-package/src/ButtonGroup/styles.d.ts.map +1 -1
- package/dist-package/src/ButtonGroup/styles.js +47 -20
- package/dist-package/src/ButtonGroup/styles.js.map +1 -1
- package/dist-package/src/ButtonGroupItem/ButtonGroupItem.d.ts +1 -1
- package/dist-package/src/ButtonGroupItem/ButtonGroupItem.d.ts.map +1 -1
- package/dist-package/src/ButtonGroupItem/ButtonGroupItem.js +12 -17
- package/dist-package/src/ButtonGroupItem/ButtonGroupItem.js.map +1 -1
- package/dist-package/src/ButtonGroupItem/styles.d.ts +3 -13
- package/dist-package/src/ButtonGroupItem/styles.d.ts.map +1 -1
- package/dist-package/src/ButtonGroupItem/styles.js +17 -39
- package/dist-package/src/ButtonGroupItem/styles.js.map +1 -1
- package/dist-package/src/ButtonSplit/ButtonSplit.d.ts.map +1 -1
- package/dist-package/src/ButtonSplit/ButtonSplit.js +24 -28
- package/dist-package/src/ButtonSplit/ButtonSplit.js.map +1 -1
- package/dist-package/src/ButtonSplit/styles.d.ts +3 -9
- package/dist-package/src/ButtonSplit/styles.d.ts.map +1 -1
- package/dist-package/src/ButtonSplit/styles.js +50 -13
- package/dist-package/src/ButtonSplit/styles.js.map +1 -1
- package/package.json +15 -19
- package/src/Button/Button.tsx +100 -69
- package/src/Button/__snapshots__/test.tsx.snap +4 -8
- package/src/Button/styles.ts +221 -214
- package/src/Button/test.tsx +1 -3
- package/src/ButtonAction/ButtonAction.tsx +48 -36
- package/src/ButtonAction/styles.ts +57 -57
- package/src/ButtonCheckbox/__snapshots__/test.tsx.snap +3 -4
- package/src/ButtonCircular/ButtonCircular.tsx +37 -22
- package/src/ButtonCircular/styles.ts +75 -127
- package/src/ButtonControlLabel/ButtonControlLabel.tsx +16 -7
- package/src/ButtonControlLabel/styles.ts +26 -30
- package/src/ButtonGroup/ButtonGroup.tsx +44 -9
- package/src/ButtonGroup/__snapshots__/test.tsx.snap +7 -13
- package/src/ButtonGroup/styles.ts +63 -21
- package/src/ButtonGroupItem/ButtonGroupItem.tsx +15 -24
- package/src/ButtonGroupItem/styles.ts +28 -62
- package/src/ButtonRadio/__snapshots__/test.tsx.snap +3 -4
- package/src/ButtonSplit/ButtonSplit.tsx +42 -46
- package/src/ButtonSplit/__snapshots__/test.tsx.snap +9 -13
- package/src/ButtonSplit/styles.ts +56 -37
- package/dist-package/src/ButtonBase/ButtonBase.d.ts +0 -29
- package/dist-package/src/ButtonBase/ButtonBase.d.ts.map +0 -1
- package/dist-package/src/ButtonBase/ButtonBase.js +0 -78
- package/dist-package/src/ButtonBase/ButtonBase.js.map +0 -1
- package/dist-package/src/ButtonBase/index.d.ts +0 -5
- package/dist-package/src/ButtonBase/index.d.ts.map +0 -1
- package/dist-package/src/ButtonBase/index.js +0 -2
- package/dist-package/src/ButtonBase/index.js.map +0 -1
- package/dist-package/src/ButtonBase/styles.d.ts +0 -6
- package/dist-package/src/ButtonBase/styles.d.ts.map +0 -1
- package/dist-package/src/ButtonBase/styles.js +0 -29
- package/dist-package/src/ButtonBase/styles.js.map +0 -1
- package/src/ButtonBase/ButtonBase.tsx +0 -182
- package/src/ButtonBase/__snapshots__/test.tsx.snap +0 -262
- package/src/ButtonBase/index.ts +0 -5
- package/src/ButtonBase/styles.ts +0 -36
- 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="
|
|
9
|
+
class="PicassoButtonGroup-root"
|
|
10
10
|
>
|
|
11
11
|
<button
|
|
12
|
-
|
|
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
|
|
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
|
-
|
|
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
|
|
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
|
-
|
|
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
|
|
42
|
+
class="PicassoContainer-centerAlignItems PicassoContainer-flex PicassoContainer-inline PicassoButton-content"
|
|
49
43
|
>
|
|
50
44
|
Three
|
|
51
45
|
</span>
|
|
@@ -1,29 +1,71 @@
|
|
|
1
|
-
|
|
2
|
-
const classNames: string[] = [
|
|
3
|
-
'flex',
|
|
4
|
-
'justify-start',
|
|
1
|
+
import { createStyles } from '@material-ui/core/styles'
|
|
5
2
|
|
|
6
|
-
|
|
3
|
+
const baseButtonProps = {
|
|
4
|
+
transitionProperty: 'color, background',
|
|
7
5
|
|
|
8
|
-
|
|
9
|
-
|
|
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
|
-
|
|
12
|
-
|
|
32
|
+
export default () =>
|
|
33
|
+
createStyles({
|
|
34
|
+
root: {
|
|
35
|
+
display: 'flex',
|
|
36
|
+
justifyContent: 'flex-start',
|
|
13
37
|
|
|
14
|
-
|
|
15
|
-
|
|
38
|
+
// default case
|
|
39
|
+
'& [data-component-type="button"]': {
|
|
40
|
+
...baseButtonProps,
|
|
16
41
|
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
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
|
-
|
|
22
|
-
|
|
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
|
-
|
|
25
|
-
|
|
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
|
-
|
|
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 {
|
|
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
|
-
|
|
8
|
-
|
|
9
|
-
|
|
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
|
-
|
|
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
|
-
{...
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
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
|
-
|
|
2
|
-
|
|
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
|
-
|
|
20
|
-
|
|
21
|
-
|
|
4
|
+
import {
|
|
5
|
+
createOutlineCommons,
|
|
6
|
+
activeGroup,
|
|
7
|
+
disabledGroup,
|
|
8
|
+
} from '../Button/styles'
|
|
22
9
|
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
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="
|
|
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
|
|
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="
|
|
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
|
|
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
|
|
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
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
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={
|
|
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
|
|
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={
|
|
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
|
|
152
|
-
{
|
|
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-
|
|
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="
|
|
21
|
+
class="PicassoButtonGroup-root"
|
|
22
22
|
>
|
|
23
23
|
<button
|
|
24
|
-
|
|
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
|
|
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
|
|
36
|
+
class="PicassoDropdown-root PicassoButtonSplit-dropdown"
|
|
39
37
|
>
|
|
40
38
|
<div
|
|
41
39
|
class="PicassoDropdown-anchor"
|
|
42
40
|
>
|
|
43
41
|
<button
|
|
44
|
-
|
|
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
|
|
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-
|
|
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-
|
|
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 {
|
|
2
|
-
import {
|
|
1
|
+
import type { Theme } from '@material-ui/core/styles'
|
|
2
|
+
import { createStyles } from '@material-ui/core/styles'
|
|
3
3
|
|
|
4
|
-
export
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
'
|
|
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
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
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
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
}
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
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
|
+
})
|