@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.
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
@@ -1,30 +1,33 @@
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: [FX-4614] To be removed when Link component is migrated to tailwind
15
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'
24
23
 
25
24
  // HACK: This statement is only used to prevent webpack from tree shaking the import
26
25
  void Link
27
26
 
27
+ const useStyles = makeStyles<Theme, Props>(styles, {
28
+ name: 'PicassoButton',
29
+ })
30
+
28
31
  export type VariantType =
29
32
  | 'primary'
30
33
  | 'negative'
@@ -70,28 +73,31 @@ export interface Props
70
73
  type?: 'button' | 'reset' | 'submit'
71
74
  }
72
75
 
73
- const getIcon = ({
74
- children,
75
- icon,
76
- iconPosition,
77
- size,
78
- }: {
79
- children: ReactNode
80
- 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,
81
83
  iconPosition?: IconPositionType
82
- size: SizeType<'small' | 'medium' | 'large'>
83
- }) => {
84
+ ) => {
84
85
  if (!icon) {
85
- return undefined
86
+ return null
86
87
  }
87
88
 
88
- const iconClassNames = createIconClassNames({
89
- size,
90
- iconPosition: children && iconPosition ? iconPosition : undefined,
91
- })
89
+ const {
90
+ icon: iconClass,
91
+ iconLeft: iconLeftClass,
92
+ iconRight: iconRightClass,
93
+ } = classes
92
94
 
93
95
  return React.cloneElement(icon, {
94
- 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',
95
101
  })
96
102
  }
97
103
 
@@ -103,7 +109,9 @@ export const Button: OverridableComponent<Props> = forwardRef<
103
109
  icon,
104
110
  iconPosition,
105
111
  loading,
112
+ children,
106
113
  className,
114
+ style,
107
115
  fullWidth,
108
116
  variant = 'primary',
109
117
  size = 'medium',
@@ -111,63 +119,86 @@ export const Button: OverridableComponent<Props> = forwardRef<
111
119
  hovered,
112
120
  disabled,
113
121
  active,
122
+ onClick,
123
+ title,
124
+ value,
125
+ type,
126
+ as = 'button',
127
+ titleCase: propsTitleCase,
114
128
  ...rest
115
129
  } = props
130
+ const classes = useStyles(props)
116
131
 
117
- const iconComponent = getIcon({
118
- children: rest.children,
119
- icon,
120
- iconPosition,
121
- size,
122
- })
123
- const coreClassNames = createCoreClassNames({
124
- disabled,
125
- focused,
126
- hovered,
127
- active,
128
- })
129
- const variantClassNames = createVariantClassNames(variant, {
130
- disabled,
131
- focused,
132
- hovered,
133
- active,
134
- })
135
- const sizeClassNames = createSizeClassNames(size)
136
-
137
- const finalClassName = twMerge(
138
- coreClassNames,
139
- variantClassNames,
140
- sizeClassNames,
141
- fullWidth ? 'w-full' : '',
142
- className
143
- )
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)
144
145
 
145
- const contentSizeClassNames: Record<
146
- SizeType<'small' | 'medium' | 'large'>,
147
- string[]
148
- > = {
149
- small: ['text-button-small'],
150
- medium: ['text-button-medium'],
151
- large: ['text-button-large'],
146
+ if (iconPosition === 'left') {
147
+ finalChildren.unshift(iconComponent)
148
+ } else {
149
+ finalChildren.push(iconComponent)
150
+ }
152
151
  }
153
152
 
154
- const contentClassName = cx(
155
- 'font-semibold whitespace-nowrap',
156
- contentSizeClassNames[size],
157
- 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
158
167
  )
159
168
 
160
169
  return (
161
170
  <ButtonBase
162
171
  {...rest}
163
172
  ref={ref}
164
- className={finalClassName}
165
- contentClassName={contentClassName}
166
- icon={iconComponent}
167
- iconPosition={iconPosition}
168
- loading={loading}
173
+ classes={{
174
+ root: rootClassName,
175
+ focusVisible: cx(classes.focusVisible),
176
+ }}
177
+ onClick={getClickHandler(loading, onClick)}
178
+ className={className}
179
+ style={style}
169
180
  disabled={disabled}
170
- />
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>
171
202
  )
172
203
  })
173
204
 
@@ -7,15 +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"
13
12
  role="button"
14
13
  tabindex="-1"
15
- type="button"
16
14
  >
17
15
  <span
18
- class="PicassoContainer-centerAlignItems PicassoContainer-flex PicassoContainer-inline font-semibold whitespace-nowrap text-button"
16
+ class="PicassoContainer-centerAlignItems PicassoContainer-flex PicassoContainer-inline PicassoButton-content"
19
17
  >
20
18
  Click me!
21
19
  </span>
@@ -30,16 +28,14 @@ exports[`Button disabled button renders disabled version 1`] = `
30
28
  class="Picasso-root"
31
29
  >
32
30
  <button
33
- aria-disabled="true"
34
- 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"
35
32
  data-component-type="button"
36
33
  disabled=""
37
- role="button"
38
34
  tabindex="-1"
39
35
  type="button"
40
36
  >
41
37
  <span
42
- class="PicassoContainer-centerAlignItems PicassoContainer-flex PicassoContainer-inline font-semibold whitespace-nowrap text-button"
38
+ class="PicassoContainer-centerAlignItems PicassoContainer-flex PicassoContainer-inline PicassoButton-content"
43
39
  >
44
40
  Click me!
45
41
  </span>