@toptal/picasso-button 1.0.10-alpha-feature-migrate-buttons-d11d10471.27 → 1.0.10-alpha-FX-5195-fix-button-css-precedence-72b82fb59.19

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 (81) hide show
  1. package/dist-package/src/Button/Button.d.ts +0 -1
  2. package/dist-package/src/Button/Button.d.ts.map +1 -1
  3. package/dist-package/src/Button/Button.js +50 -40
  4. package/dist-package/src/Button/Button.js.map +1 -1
  5. package/dist-package/src/Button/styles.d.ts +45 -19
  6. package/dist-package/src/Button/styles.d.ts.map +1 -1
  7. package/dist-package/src/Button/styles.js +178 -160
  8. package/dist-package/src/Button/styles.js.map +1 -1
  9. package/dist-package/src/ButtonAction/ButtonAction.d.ts.map +1 -1
  10. package/dist-package/src/ButtonAction/ButtonAction.js +28 -20
  11. package/dist-package/src/ButtonAction/ButtonAction.js.map +1 -1
  12. package/dist-package/src/ButtonAction/styles.d.ts +3 -11
  13. package/dist-package/src/ButtonAction/styles.d.ts.map +1 -1
  14. package/dist-package/src/ButtonAction/styles.js +55 -36
  15. package/dist-package/src/ButtonAction/styles.js.map +1 -1
  16. package/dist-package/src/ButtonCircular/ButtonCircular.d.ts.map +1 -1
  17. package/dist-package/src/ButtonCircular/ButtonCircular.js +26 -12
  18. package/dist-package/src/ButtonCircular/ButtonCircular.js.map +1 -1
  19. package/dist-package/src/ButtonCircular/styles.d.ts +3 -15
  20. package/dist-package/src/ButtonCircular/styles.d.ts.map +1 -1
  21. package/dist-package/src/ButtonCircular/styles.js +57 -92
  22. package/dist-package/src/ButtonCircular/styles.js.map +1 -1
  23. package/dist-package/src/ButtonCompound/index.d.ts +1 -1
  24. package/dist-package/src/ButtonControlLabel/styles.d.ts +1 -1
  25. package/dist-package/src/ButtonGroup/ButtonGroup.d.ts +1 -1
  26. package/dist-package/src/ButtonGroup/ButtonGroup.d.ts.map +1 -1
  27. package/dist-package/src/ButtonGroup/ButtonGroup.js +27 -5
  28. package/dist-package/src/ButtonGroup/ButtonGroup.js.map +1 -1
  29. package/dist-package/src/ButtonGroup/styles.d.ts +2 -1
  30. package/dist-package/src/ButtonGroup/styles.d.ts.map +1 -1
  31. package/dist-package/src/ButtonGroup/styles.js +47 -20
  32. package/dist-package/src/ButtonGroup/styles.js.map +1 -1
  33. package/dist-package/src/ButtonGroupItem/ButtonGroupItem.d.ts +1 -1
  34. package/dist-package/src/ButtonGroupItem/ButtonGroupItem.d.ts.map +1 -1
  35. package/dist-package/src/ButtonGroupItem/ButtonGroupItem.js +12 -17
  36. package/dist-package/src/ButtonGroupItem/ButtonGroupItem.js.map +1 -1
  37. package/dist-package/src/ButtonGroupItem/styles.d.ts +3 -13
  38. package/dist-package/src/ButtonGroupItem/styles.d.ts.map +1 -1
  39. package/dist-package/src/ButtonGroupItem/styles.js +17 -39
  40. package/dist-package/src/ButtonGroupItem/styles.js.map +1 -1
  41. package/dist-package/src/ButtonSplit/ButtonSplit.d.ts.map +1 -1
  42. package/dist-package/src/ButtonSplit/ButtonSplit.js +24 -28
  43. package/dist-package/src/ButtonSplit/ButtonSplit.js.map +1 -1
  44. package/dist-package/src/ButtonSplit/styles.d.ts +3 -9
  45. package/dist-package/src/ButtonSplit/styles.d.ts.map +1 -1
  46. package/dist-package/src/ButtonSplit/styles.js +50 -13
  47. package/dist-package/src/ButtonSplit/styles.js.map +1 -1
  48. package/package.json +15 -19
  49. package/src/Button/Button.tsx +104 -70
  50. package/src/Button/__snapshots__/test.tsx.snap +5 -6
  51. package/src/Button/styles.ts +221 -213
  52. package/src/Button/test.tsx +1 -3
  53. package/src/ButtonAction/ButtonAction.tsx +48 -36
  54. package/src/ButtonAction/styles.ts +57 -57
  55. package/src/ButtonCheckbox/__snapshots__/test.tsx.snap +3 -3
  56. package/src/ButtonCircular/ButtonCircular.tsx +37 -22
  57. package/src/ButtonCircular/styles.ts +75 -127
  58. package/src/ButtonGroup/ButtonGroup.tsx +44 -9
  59. package/src/ButtonGroup/__snapshots__/test.tsx.snap +7 -7
  60. package/src/ButtonGroup/styles.ts +63 -21
  61. package/src/ButtonGroupItem/ButtonGroupItem.tsx +15 -24
  62. package/src/ButtonGroupItem/styles.ts +28 -62
  63. package/src/ButtonRadio/__snapshots__/test.tsx.snap +3 -3
  64. package/src/ButtonSplit/ButtonSplit.tsx +42 -46
  65. package/src/ButtonSplit/__snapshots__/test.tsx.snap +9 -9
  66. package/src/ButtonSplit/styles.ts +56 -37
  67. package/dist-package/src/ButtonBase/ButtonBase.d.ts +0 -29
  68. package/dist-package/src/ButtonBase/ButtonBase.d.ts.map +0 -1
  69. package/dist-package/src/ButtonBase/ButtonBase.js +0 -78
  70. package/dist-package/src/ButtonBase/ButtonBase.js.map +0 -1
  71. package/dist-package/src/ButtonBase/index.d.ts +0 -5
  72. package/dist-package/src/ButtonBase/index.d.ts.map +0 -1
  73. package/dist-package/src/ButtonBase/index.js +0 -2
  74. package/dist-package/src/ButtonBase/index.js.map +0 -1
  75. package/dist-package/src/ButtonBase/styles.d.ts +0 -6
  76. package/dist-package/src/ButtonBase/styles.d.ts.map +0 -1
  77. package/dist-package/src/ButtonBase/styles.js +0 -29
  78. package/dist-package/src/ButtonBase/styles.js.map +0 -1
  79. package/src/ButtonBase/ButtonBase.tsx +0 -182
  80. package/src/ButtonBase/index.ts +0 -5
  81. package/src/ButtonBase/styles.ts +0 -36
@@ -1,26 +1,32 @@
1
1
  import type { ReactNode, ReactElement, MouseEvent, ElementType } from 'react'
2
2
  import React, { forwardRef } from 'react'
3
3
  import cx from 'classnames'
4
- import { twMerge } from 'tailwind-merge'
5
4
  import type {
6
5
  StandardProps,
7
6
  SizeType,
8
7
  ButtonOrAnchorProps,
9
8
  OverridableComponent,
10
9
  TextLabelProps,
10
+ Classes,
11
11
  } from '@toptal/picasso-shared'
12
- import { noop } from '@toptal/picasso-utils'
12
+ import { useTitleCase } from '@toptal/picasso-shared'
13
+ import type { Theme } from '@material-ui/core'
14
+ import { makeStyles, ButtonBase } from '@material-ui/core'
15
+ import { Loader } from '@toptal/picasso-loader'
16
+ import { Container } from '@toptal/picasso-container'
17
+ import { noop, toTitleCase } from '@toptal/picasso-utils'
13
18
  // we need to ensure the correct order of styles import
14
19
  // @TODO: to be removed when the component is migrated in FX-4614
15
- import '@toptal/picasso-link'
20
+ import { Link } from '@toptal/picasso-link'
16
21
 
17
- import { ButtonBase } from '../ButtonBase'
18
- import {
19
- createVariantClassNames,
20
- createCoreClassNames,
21
- createSizeClassNames,
22
- createIconClassNames,
23
- } from './styles'
22
+ import styles from './styles'
23
+
24
+ // HACK: This statement is only used to prevent webpack from tree shaking the import
25
+ void Link
26
+
27
+ const useStyles = makeStyles<Theme, Props>(styles, {
28
+ name: 'PicassoButton',
29
+ })
24
30
 
25
31
  export type VariantType =
26
32
  | 'primary'
@@ -67,28 +73,31 @@ export interface Props
67
73
  type?: 'button' | 'reset' | 'submit'
68
74
  }
69
75
 
70
- const getIcon = ({
71
- children,
72
- icon,
73
- iconPosition,
74
- size,
75
- }: {
76
- children: ReactNode
77
- icon?: ReactElement
76
+ const getClickHandler = (loading?: boolean, handler?: Props['onClick']) =>
77
+ loading ? noop : handler
78
+
79
+ const getIcon = (
80
+ classes: Classes,
81
+ children: ReactNode,
82
+ icon?: ReactElement,
78
83
  iconPosition?: IconPositionType
79
- size: SizeType<'small' | 'medium' | 'large'>
80
- }) => {
84
+ ) => {
81
85
  if (!icon) {
82
- return undefined
86
+ return null
83
87
  }
84
88
 
85
- const iconClassNames = createIconClassNames({
86
- size,
87
- iconPosition: children && iconPosition ? iconPosition : undefined,
88
- })
89
+ const {
90
+ icon: iconClass,
91
+ iconLeft: iconLeftClass,
92
+ iconRight: iconRightClass,
93
+ } = classes
89
94
 
90
95
  return React.cloneElement(icon, {
91
- className: twMerge(iconClassNames, icon.props.className),
96
+ className: cx(iconClass, icon.props.className, {
97
+ [iconLeftClass]: children && iconPosition === 'left',
98
+ [iconRightClass]: children && iconPosition === 'right',
99
+ }),
100
+ key: 'button-icon',
92
101
  })
93
102
  }
94
103
 
@@ -100,7 +109,9 @@ export const Button: OverridableComponent<Props> = forwardRef<
100
109
  icon,
101
110
  iconPosition,
102
111
  loading,
112
+ children,
103
113
  className,
114
+ style,
104
115
  fullWidth,
105
116
  variant = 'primary',
106
117
  size = 'medium',
@@ -108,63 +119,86 @@ export const Button: OverridableComponent<Props> = forwardRef<
108
119
  hovered,
109
120
  disabled,
110
121
  active,
122
+ onClick,
123
+ title,
124
+ value,
125
+ type,
126
+ as = 'button',
127
+ titleCase: propsTitleCase,
111
128
  ...rest
112
129
  } = props
130
+ const classes = useStyles(props)
113
131
 
114
- const iconComponent = getIcon({
115
- children: rest.children,
116
- icon,
117
- iconPosition,
118
- size,
119
- })
120
- const coreClassNames = createCoreClassNames({
121
- disabled,
122
- focused,
123
- hovered,
124
- active,
125
- })
126
- const variantClassNames = createVariantClassNames(variant, {
127
- disabled,
128
- focused,
129
- hovered,
130
- active,
131
- })
132
- const sizeClassNames = createSizeClassNames(size)
133
-
134
- const finalClassName = twMerge(
135
- coreClassNames,
136
- variantClassNames,
137
- sizeClassNames,
138
- fullWidth ? 'w-full' : '',
139
- className
140
- )
132
+ const {
133
+ root: rootClass,
134
+ hidden: hiddenClass,
135
+ loader: loaderClass,
136
+ content: contentClass,
137
+ } = classes
138
+
139
+ const titleCase = useTitleCase(propsTitleCase)
140
+
141
+ const finalChildren = [titleCase ? toTitleCase(children) : children]
142
+
143
+ if (icon) {
144
+ const iconComponent = getIcon(classes, children, icon, iconPosition)
141
145
 
142
- const contentSizeClassNames: Record<
143
- SizeType<'small' | 'medium' | 'large'>,
144
- string[]
145
- > = {
146
- small: ['text-button-small'],
147
- medium: ['text-button-medium'],
148
- large: ['text-button-large'],
146
+ if (iconPosition === 'left') {
147
+ finalChildren.unshift(iconComponent)
148
+ } else {
149
+ finalChildren.push(iconComponent)
150
+ }
149
151
  }
150
152
 
151
- const contentClassName = cx(
152
- 'font-semibold whitespace-nowrap',
153
- contentSizeClassNames[size],
154
- loading ? 'opacity-0' : ''
153
+ const variantClassName = classes[variant]
154
+ const sizeClassName = classes[size]
155
+
156
+ const rootClassName = cx(
157
+ {
158
+ [classes.fullWidth]: fullWidth,
159
+ [classes.active]: active,
160
+ [classes.focused]: focused,
161
+ [classes.hovered]: hovered,
162
+ [classes.disabled]: disabled,
163
+ },
164
+ sizeClassName,
165
+ variantClassName,
166
+ rootClass
155
167
  )
156
168
 
157
169
  return (
158
170
  <ButtonBase
159
171
  {...rest}
160
172
  ref={ref}
161
- className={finalClassName}
162
- contentClassName={contentClassName}
163
- icon={iconComponent}
164
- iconPosition={iconPosition}
165
- loading={loading}
173
+ classes={{
174
+ root: rootClassName,
175
+ focusVisible: cx(classes.focusVisible),
176
+ }}
177
+ onClick={getClickHandler(loading, onClick)}
178
+ className={className}
179
+ style={style}
166
180
  disabled={disabled}
167
- />
181
+ title={title}
182
+ value={value}
183
+ type={type}
184
+ component={as}
185
+ data-component-type='button'
186
+ >
187
+ <Container
188
+ as='span'
189
+ inline
190
+ flex
191
+ direction='row'
192
+ alignItems='center'
193
+ className={cx({ [hiddenClass]: loading }, contentClass)}
194
+ >
195
+ {finalChildren}
196
+ </Container>
197
+
198
+ {loading && (
199
+ <Loader variant='inherit' className={loaderClass} inline size='small' />
200
+ )}
201
+ </ButtonBase>
168
202
  )
169
203
  })
170
204
 
@@ -7,14 +7,13 @@ exports[`Button disabled button as link renders disabled version 1`] = `
7
7
  >
8
8
  <a
9
9
  aria-disabled="true"
10
- class="MuiTypography-root MuiLink-root MuiLink-underlineHover PicassoLink-root base-Button base- 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-default pointer-events no-underline rounded-sm shadow-none border-none text-white visited:text-white bg-gray min-w h-8 py-0 px-4 PicassoLink-blue MuiTypography-colorPrimary"
10
+ class="MuiTypography-root MuiLink-root MuiLink-underlineHover PicassoLink-root MuiButtonBase-root PicassoButton-disabled PicassoButton-medium PicassoButton-primary PicassoButton-root Mui-disabled PicassoLink-blue MuiTypography-colorPrimary"
11
11
  data-component-type="button"
12
- href="URL"
12
+ role="button"
13
13
  tabindex="-1"
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
  Click me!
20
19
  </span>
@@ -29,14 +28,14 @@ exports[`Button disabled button renders disabled version 1`] = `
29
28
  class="Picasso-root"
30
29
  >
31
30
  <button
32
- class="base-Button base- 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-default pointer-events no-underline rounded-sm shadow-none border-none text-white visited:text-white bg-gray min-w h-8 py-0 px-4"
31
+ class="MuiButtonBase-root PicassoButton-disabled PicassoButton-medium PicassoButton-primary PicassoButton-root Mui-disabled"
33
32
  data-component-type="button"
34
33
  disabled=""
35
34
  tabindex="-1"
36
35
  type="button"
37
36
  >
38
37
  <span
39
- class="PicassoContainer-centerAlignItems PicassoContainer-flex PicassoContainer-inline font-semibold whitespace-nowrap text-button"
38
+ class="PicassoContainer-centerAlignItems PicassoContainer-flex PicassoContainer-inline PicassoButton-content"
40
39
  >
41
40
  Click me!
42
41
  </span>