@toptal/picasso-button 1.0.12 → 1.0.13-alpha-fx-5263-merge-feature-branch-d124b1f9a.10
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/LICENSE +20 -0
- package/dist-package/src/Button/Button.d.ts.map +1 -1
- package/dist-package/src/Button/Button.js +39 -47
- package/dist-package/src/Button/Button.js.map +1 -1
- package/dist-package/src/Button/styles.d.ts +19 -45
- package/dist-package/src/Button/styles.d.ts.map +1 -1
- package/dist-package/src/Button/styles.js +161 -178
- 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 +20 -28
- package/dist-package/src/ButtonAction/ButtonAction.js.map +1 -1
- package/dist-package/src/ButtonAction/styles.d.ts +11 -3
- package/dist-package/src/ButtonAction/styles.d.ts.map +1 -1
- package/dist-package/src/ButtonAction/styles.js +36 -55
- package/dist-package/src/ButtonAction/styles.js.map +1 -1
- package/dist-package/src/ButtonBase/ButtonBase.d.ts +29 -0
- package/dist-package/src/ButtonBase/ButtonBase.d.ts.map +1 -0
- package/dist-package/src/ButtonBase/ButtonBase.js +78 -0
- package/dist-package/src/ButtonBase/ButtonBase.js.map +1 -0
- package/dist-package/src/ButtonBase/index.d.ts +5 -0
- package/dist-package/src/ButtonBase/index.d.ts.map +1 -0
- package/dist-package/src/ButtonBase/index.js +2 -0
- package/dist-package/src/ButtonBase/index.js.map +1 -0
- package/dist-package/src/ButtonBase/styles.d.ts +6 -0
- package/dist-package/src/ButtonBase/styles.d.ts.map +1 -0
- package/dist-package/src/ButtonBase/styles.js +29 -0
- package/dist-package/src/ButtonBase/styles.js.map +1 -0
- package/dist-package/src/ButtonCircular/ButtonCircular.d.ts.map +1 -1
- package/dist-package/src/ButtonCircular/ButtonCircular.js +12 -26
- package/dist-package/src/ButtonCircular/ButtonCircular.js.map +1 -1
- package/dist-package/src/ButtonCircular/styles.d.ts +15 -3
- package/dist-package/src/ButtonCircular/styles.d.ts.map +1 -1
- package/dist-package/src/ButtonCircular/styles.js +92 -57
- 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 +4 -13
- 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 +16 -25
- 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 +5 -27
- package/dist-package/src/ButtonGroup/ButtonGroup.js.map +1 -1
- package/dist-package/src/ButtonGroup/styles.d.ts +1 -2
- package/dist-package/src/ButtonGroup/styles.d.ts.map +1 -1
- package/dist-package/src/ButtonGroup/styles.js +20 -47
- 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 +17 -12
- package/dist-package/src/ButtonGroupItem/ButtonGroupItem.js.map +1 -1
- package/dist-package/src/ButtonGroupItem/styles.d.ts +13 -3
- package/dist-package/src/ButtonGroupItem/styles.d.ts.map +1 -1
- package/dist-package/src/ButtonGroupItem/styles.js +39 -17
- 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 +28 -24
- package/dist-package/src/ButtonSplit/ButtonSplit.js.map +1 -1
- package/dist-package/src/ButtonSplit/styles.d.ts +9 -3
- package/dist-package/src/ButtonSplit/styles.d.ts.map +1 -1
- package/dist-package/src/ButtonSplit/styles.js +13 -50
- package/dist-package/src/ButtonSplit/styles.js.map +1 -1
- package/package.json +20 -15
- package/src/Button/Button.tsx +69 -100
- package/src/Button/__snapshots__/test.tsx.snap +8 -4
- package/src/Button/styles.ts +214 -221
- package/src/Button/test.tsx +3 -1
- package/src/ButtonAction/ButtonAction.tsx +36 -48
- package/src/ButtonAction/styles.ts +57 -57
- package/src/ButtonBase/ButtonBase.tsx +182 -0
- package/src/ButtonBase/__snapshots__/test.tsx.snap +262 -0
- package/src/ButtonBase/index.ts +5 -0
- package/src/ButtonBase/styles.ts +36 -0
- package/src/ButtonBase/test.tsx +212 -0
- package/src/ButtonCheckbox/__snapshots__/test.tsx.snap +4 -3
- package/src/ButtonCircular/ButtonCircular.tsx +22 -37
- package/src/ButtonCircular/styles.ts +127 -75
- package/src/ButtonControlLabel/ButtonControlLabel.tsx +7 -16
- package/src/ButtonControlLabel/styles.ts +30 -26
- package/src/ButtonGroup/ButtonGroup.tsx +9 -44
- package/src/ButtonGroup/__snapshots__/test.tsx.snap +13 -7
- package/src/ButtonGroup/styles.ts +21 -63
- package/src/ButtonGroupItem/ButtonGroupItem.tsx +24 -15
- package/src/ButtonGroupItem/styles.ts +62 -28
- package/src/ButtonRadio/__snapshots__/test.tsx.snap +4 -3
- package/src/ButtonSplit/ButtonSplit.tsx +46 -42
- package/src/ButtonSplit/__snapshots__/test.tsx.snap +13 -9
- package/src/ButtonSplit/styles.ts +37 -56
|
@@ -1,58 +1,58 @@
|
|
|
1
|
-
import type {
|
|
2
|
-
import { createStyles } from '@material-ui/core/styles'
|
|
1
|
+
import type { IconPositionType } from '../ButtonBase'
|
|
3
2
|
|
|
4
|
-
export
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
'
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
}
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
3
|
+
export const createRootClassNames = ({
|
|
4
|
+
disabled,
|
|
5
|
+
focused,
|
|
6
|
+
hovered,
|
|
7
|
+
active,
|
|
8
|
+
loading,
|
|
9
|
+
}: {
|
|
10
|
+
disabled?: boolean
|
|
11
|
+
focused?: boolean
|
|
12
|
+
hovered?: boolean
|
|
13
|
+
active?: boolean
|
|
14
|
+
loading?: boolean
|
|
15
|
+
}) => {
|
|
16
|
+
const classNames = ['border-none', 'px-0', 'bg-transparent', 'h-[1.5em]']
|
|
17
|
+
|
|
18
|
+
if (disabled) {
|
|
19
|
+
classNames.push('opacity-[.48]')
|
|
20
|
+
} else if (loading) {
|
|
21
|
+
classNames.push('no-underline')
|
|
22
|
+
classNames.push('!cursor-default')
|
|
23
|
+
} else {
|
|
24
|
+
classNames.push('hover:text-blue-500')
|
|
25
|
+
classNames.push('hover:underline')
|
|
26
|
+
classNames.push('active:text-blue-500')
|
|
27
|
+
classNames.push('active:underline')
|
|
28
|
+
|
|
29
|
+
if (hovered || active) {
|
|
30
|
+
classNames.push('text-blue-500')
|
|
31
|
+
classNames.push('underline')
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
classNames.push('focus-visible:shadow-[0_0_0_3px_rgba(32,78,207,0.48)]')
|
|
35
|
+
classNames.push('focus-visible:rounded-sm')
|
|
36
|
+
|
|
37
|
+
if (focused) {
|
|
38
|
+
classNames.push('shadow-[0_0_0_3px_rgba(32,78,207,0.48)]')
|
|
39
|
+
classNames.push('rounded-sm')
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
return classNames
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
export const createIconClassNames = ({
|
|
47
|
+
iconPosition,
|
|
48
|
+
}: {
|
|
49
|
+
iconPosition?: IconPositionType
|
|
50
|
+
}): string[] => {
|
|
51
|
+
return [
|
|
52
|
+
'w-4',
|
|
53
|
+
'h-4',
|
|
54
|
+
'text-graphite-700',
|
|
55
|
+
iconPosition === 'left' ? 'mr-[0.5rem]' : '',
|
|
56
|
+
iconPosition === 'right' ? 'ml-[0.5rem]' : '',
|
|
57
|
+
]
|
|
58
|
+
}
|
|
@@ -0,0 +1,182 @@
|
|
|
1
|
+
import type {
|
|
2
|
+
ReactNode,
|
|
3
|
+
ReactElement,
|
|
4
|
+
MouseEvent,
|
|
5
|
+
ElementType,
|
|
6
|
+
FC,
|
|
7
|
+
} from 'react'
|
|
8
|
+
import React, { forwardRef } from 'react'
|
|
9
|
+
import { twMerge } from 'tailwind-merge'
|
|
10
|
+
import type {
|
|
11
|
+
StandardProps,
|
|
12
|
+
ButtonOrAnchorProps,
|
|
13
|
+
OverridableComponent,
|
|
14
|
+
TextLabelProps,
|
|
15
|
+
} from '@toptal/picasso-shared'
|
|
16
|
+
import { useTitleCase } from '@toptal/picasso-shared'
|
|
17
|
+
import { Button as MUIButtonBase } from '@mui/base/Button'
|
|
18
|
+
import { Loader } from '@toptal/picasso-loader'
|
|
19
|
+
import { Container } from '@toptal/picasso-container'
|
|
20
|
+
import { noop, toTitleCase } from '@toptal/picasso-utils'
|
|
21
|
+
|
|
22
|
+
import { createCoreClassNames } from './styles'
|
|
23
|
+
|
|
24
|
+
export type IconPositionType = 'left' | 'right'
|
|
25
|
+
|
|
26
|
+
export interface Props
|
|
27
|
+
extends StandardProps,
|
|
28
|
+
TextLabelProps,
|
|
29
|
+
ButtonOrAnchorProps {
|
|
30
|
+
as?: ElementType
|
|
31
|
+
/** Disables button */
|
|
32
|
+
disabled?: boolean
|
|
33
|
+
/** Content of Button component */
|
|
34
|
+
children?: ReactNode
|
|
35
|
+
/** ClassName for the content */
|
|
36
|
+
contentClassName?: string
|
|
37
|
+
/** Add an `<Icon />` along Button's children */
|
|
38
|
+
icon?: ReactElement
|
|
39
|
+
/** Icon can be positioned on the left or right */
|
|
40
|
+
iconPosition?: IconPositionType
|
|
41
|
+
/** Shows a loading indicator and disables click events */
|
|
42
|
+
loading?: boolean
|
|
43
|
+
/** Callback invoked when component is clicked */
|
|
44
|
+
onClick?: (event: MouseEvent<HTMLButtonElement & HTMLAnchorElement>) => void
|
|
45
|
+
/** HTML Value of Button component */
|
|
46
|
+
value?: string | number
|
|
47
|
+
/** HTML title of Button component */
|
|
48
|
+
title?: string
|
|
49
|
+
/** HTML type of Button component */
|
|
50
|
+
type?: 'button' | 'reset' | 'submit'
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
const getClickHandler = (loading?: boolean, handler?: Props['onClick']) =>
|
|
54
|
+
loading ? noop : handler
|
|
55
|
+
|
|
56
|
+
const getIcon = ({ icon }: { icon?: ReactElement }) => {
|
|
57
|
+
if (!icon) {
|
|
58
|
+
return null
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
return React.cloneElement(icon, {
|
|
62
|
+
className: twMerge('text-[1.2em] flex-1', icon.props.className),
|
|
63
|
+
key: 'button-icon',
|
|
64
|
+
})
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
68
|
+
const isReactComponent = (component: any) => {
|
|
69
|
+
return (
|
|
70
|
+
component &&
|
|
71
|
+
(component.$$typeof === Symbol.for('react.forward_ref') ||
|
|
72
|
+
typeof component === 'function')
|
|
73
|
+
)
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
export const ButtonBase: OverridableComponent<Props> = forwardRef<
|
|
77
|
+
HTMLButtonElement,
|
|
78
|
+
Props
|
|
79
|
+
>(function ButtonBase(props, ref) {
|
|
80
|
+
const {
|
|
81
|
+
icon,
|
|
82
|
+
iconPosition,
|
|
83
|
+
loading,
|
|
84
|
+
children,
|
|
85
|
+
className,
|
|
86
|
+
contentClassName,
|
|
87
|
+
style,
|
|
88
|
+
disabled,
|
|
89
|
+
onClick,
|
|
90
|
+
title,
|
|
91
|
+
value,
|
|
92
|
+
type,
|
|
93
|
+
as = 'button',
|
|
94
|
+
titleCase: propsTitleCase,
|
|
95
|
+
...rest
|
|
96
|
+
} = props
|
|
97
|
+
|
|
98
|
+
let RootElement: ElementType | FC = as
|
|
99
|
+
|
|
100
|
+
if (isReactComponent(RootElement)) {
|
|
101
|
+
RootElement = forwardRef(
|
|
102
|
+
// We don't need to pass ownerState to the root component
|
|
103
|
+
// eslint-disable-next-line @typescript-eslint/no-unused-vars
|
|
104
|
+
({ ownerState, ...restProps }: { ownerState: object }, rootRef) => {
|
|
105
|
+
const Root = as
|
|
106
|
+
|
|
107
|
+
return <Root ref={rootRef} {...restProps} />
|
|
108
|
+
}
|
|
109
|
+
)
|
|
110
|
+
}
|
|
111
|
+
|
|
112
|
+
const titleCase = useTitleCase(propsTitleCase)
|
|
113
|
+
const finalChildren = [titleCase ? toTitleCase(children) : children]
|
|
114
|
+
const rootElementName =
|
|
115
|
+
as !== 'button' && ('href' in props || 'to' in props) ? 'a' : undefined
|
|
116
|
+
|
|
117
|
+
if (icon) {
|
|
118
|
+
const iconComponent = getIcon({ icon })
|
|
119
|
+
|
|
120
|
+
if (iconPosition === 'left') {
|
|
121
|
+
finalChildren.unshift(iconComponent)
|
|
122
|
+
} else {
|
|
123
|
+
finalChildren.push(iconComponent)
|
|
124
|
+
}
|
|
125
|
+
}
|
|
126
|
+
|
|
127
|
+
const finalClassName = twMerge(createCoreClassNames({ disabled }), className)
|
|
128
|
+
|
|
129
|
+
return (
|
|
130
|
+
<MUIButtonBase
|
|
131
|
+
{...rest}
|
|
132
|
+
ref={ref}
|
|
133
|
+
onClick={getClickHandler(loading, onClick)}
|
|
134
|
+
className={finalClassName}
|
|
135
|
+
style={style}
|
|
136
|
+
aria-disabled={disabled}
|
|
137
|
+
disabled={disabled}
|
|
138
|
+
title={title}
|
|
139
|
+
value={value}
|
|
140
|
+
type={type}
|
|
141
|
+
data-component-type='button'
|
|
142
|
+
tabIndex={rest.tabIndex ?? disabled ? -1 : 0}
|
|
143
|
+
role={rest.role ?? 'button'}
|
|
144
|
+
rootElementName={rootElementName}
|
|
145
|
+
slots={{ root: RootElement }}
|
|
146
|
+
>
|
|
147
|
+
<Container
|
|
148
|
+
as='span'
|
|
149
|
+
inline
|
|
150
|
+
flex
|
|
151
|
+
direction='row'
|
|
152
|
+
alignItems='center'
|
|
153
|
+
className={contentClassName}
|
|
154
|
+
>
|
|
155
|
+
{finalChildren}
|
|
156
|
+
</Container>
|
|
157
|
+
|
|
158
|
+
{loading && (
|
|
159
|
+
<Loader
|
|
160
|
+
variant='inherit'
|
|
161
|
+
className='absolute top-1/2 left-1/2 translate-x-[-50%] translate-y-[-50%]'
|
|
162
|
+
inline
|
|
163
|
+
size='small'
|
|
164
|
+
/>
|
|
165
|
+
)}
|
|
166
|
+
</MUIButtonBase>
|
|
167
|
+
)
|
|
168
|
+
})
|
|
169
|
+
|
|
170
|
+
ButtonBase.defaultProps = {
|
|
171
|
+
as: 'button',
|
|
172
|
+
children: null,
|
|
173
|
+
disabled: false,
|
|
174
|
+
iconPosition: 'left',
|
|
175
|
+
loading: false,
|
|
176
|
+
onClick: noop,
|
|
177
|
+
type: 'button',
|
|
178
|
+
}
|
|
179
|
+
|
|
180
|
+
ButtonBase.displayName = 'ButtonBase'
|
|
181
|
+
|
|
182
|
+
export default ButtonBase
|
|
@@ -0,0 +1,262 @@
|
|
|
1
|
+
// Jest Snapshot v1, https://goo.gl/fbAQLP
|
|
2
|
+
|
|
3
|
+
exports[`ButtonBase when "as" prop is passed when "as" prop does not equal "button" when "href" prop is passed renders Button as a link 1`] = `
|
|
4
|
+
<div>
|
|
5
|
+
<div
|
|
6
|
+
class="Picasso-root"
|
|
7
|
+
>
|
|
8
|
+
<span
|
|
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"
|
|
11
|
+
data-component-type="button"
|
|
12
|
+
href="/"
|
|
13
|
+
role="button"
|
|
14
|
+
tabindex="0"
|
|
15
|
+
type="button"
|
|
16
|
+
>
|
|
17
|
+
<span
|
|
18
|
+
class="PicassoContainer-centerAlignItems PicassoContainer-flex PicassoContainer-inline"
|
|
19
|
+
>
|
|
20
|
+
Click me!
|
|
21
|
+
</span>
|
|
22
|
+
</span>
|
|
23
|
+
</div>
|
|
24
|
+
</div>
|
|
25
|
+
`;
|
|
26
|
+
|
|
27
|
+
exports[`ButtonBase when "as" prop is passed when "as" prop does not equal "button" when "to" prop is passed renders Button as a link 1`] = `
|
|
28
|
+
<div>
|
|
29
|
+
<div
|
|
30
|
+
class="Picasso-root"
|
|
31
|
+
>
|
|
32
|
+
<span
|
|
33
|
+
aria-disabled="false"
|
|
34
|
+
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"
|
|
35
|
+
data-component-type="button"
|
|
36
|
+
role="button"
|
|
37
|
+
tabindex="0"
|
|
38
|
+
to="/"
|
|
39
|
+
type="button"
|
|
40
|
+
>
|
|
41
|
+
<span
|
|
42
|
+
class="PicassoContainer-centerAlignItems PicassoContainer-flex PicassoContainer-inline"
|
|
43
|
+
>
|
|
44
|
+
Click me!
|
|
45
|
+
</span>
|
|
46
|
+
</span>
|
|
47
|
+
</div>
|
|
48
|
+
</div>
|
|
49
|
+
`;
|
|
50
|
+
|
|
51
|
+
exports[`ButtonBase when "as" prop is passed when "as" prop equals "Link" component renders Button as a 1`] = `
|
|
52
|
+
<div>
|
|
53
|
+
<div
|
|
54
|
+
class="Picasso-root"
|
|
55
|
+
>
|
|
56
|
+
<a
|
|
57
|
+
aria-disabled="false"
|
|
58
|
+
class="MuiTypography-root MuiLink-root MuiLink-underlineHover PicassoLink-root 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 PicassoLink-blue MuiTypography-colorPrimary"
|
|
59
|
+
data-component-type="button"
|
|
60
|
+
href="URL"
|
|
61
|
+
role="button"
|
|
62
|
+
tabindex="0"
|
|
63
|
+
type="button"
|
|
64
|
+
>
|
|
65
|
+
<span
|
|
66
|
+
class="PicassoContainer-centerAlignItems PicassoContainer-flex PicassoContainer-inline"
|
|
67
|
+
>
|
|
68
|
+
Click me!
|
|
69
|
+
</span>
|
|
70
|
+
</a>
|
|
71
|
+
</div>
|
|
72
|
+
</div>
|
|
73
|
+
`;
|
|
74
|
+
|
|
75
|
+
exports[`ButtonBase when "as" prop is passed when "as" prop equals "Link" component when "disabled" prop is true renders Button as a and does not trigger onClick handler 1`] = `
|
|
76
|
+
<div>
|
|
77
|
+
<div
|
|
78
|
+
class="Picasso-root"
|
|
79
|
+
>
|
|
80
|
+
<a
|
|
81
|
+
aria-disabled="true"
|
|
82
|
+
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 PicassoLink-blue MuiTypography-colorPrimary"
|
|
83
|
+
data-component-type="button"
|
|
84
|
+
href="URL"
|
|
85
|
+
role="button"
|
|
86
|
+
tabindex="-1"
|
|
87
|
+
type="button"
|
|
88
|
+
>
|
|
89
|
+
<span
|
|
90
|
+
class="PicassoContainer-centerAlignItems PicassoContainer-flex PicassoContainer-inline"
|
|
91
|
+
>
|
|
92
|
+
Click me!
|
|
93
|
+
</span>
|
|
94
|
+
</a>
|
|
95
|
+
</div>
|
|
96
|
+
</div>
|
|
97
|
+
`;
|
|
98
|
+
|
|
99
|
+
exports[`ButtonBase when "as" prop is passed when "as" prop equals "a" renders Button as a 1`] = `
|
|
100
|
+
<div>
|
|
101
|
+
<div
|
|
102
|
+
class="Picasso-root"
|
|
103
|
+
>
|
|
104
|
+
<a
|
|
105
|
+
aria-disabled="false"
|
|
106
|
+
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"
|
|
107
|
+
data-component-type="button"
|
|
108
|
+
href="/"
|
|
109
|
+
role="button"
|
|
110
|
+
tabindex="0"
|
|
111
|
+
type="button"
|
|
112
|
+
>
|
|
113
|
+
<span
|
|
114
|
+
class="PicassoContainer-centerAlignItems PicassoContainer-flex PicassoContainer-inline"
|
|
115
|
+
>
|
|
116
|
+
Click me!
|
|
117
|
+
</span>
|
|
118
|
+
</a>
|
|
119
|
+
</div>
|
|
120
|
+
</div>
|
|
121
|
+
`;
|
|
122
|
+
|
|
123
|
+
exports[`ButtonBase when "disabled" prop is false renders Button and does not trigger onClick handler 1`] = `
|
|
124
|
+
<div>
|
|
125
|
+
<div
|
|
126
|
+
class="Picasso-root"
|
|
127
|
+
>
|
|
128
|
+
<button
|
|
129
|
+
aria-disabled="false"
|
|
130
|
+
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"
|
|
131
|
+
data-component-type="button"
|
|
132
|
+
role="button"
|
|
133
|
+
tabindex="0"
|
|
134
|
+
type="button"
|
|
135
|
+
>
|
|
136
|
+
<span
|
|
137
|
+
class="PicassoContainer-centerAlignItems PicassoContainer-flex PicassoContainer-inline"
|
|
138
|
+
>
|
|
139
|
+
Click me!
|
|
140
|
+
</span>
|
|
141
|
+
</button>
|
|
142
|
+
</div>
|
|
143
|
+
</div>
|
|
144
|
+
`;
|
|
145
|
+
|
|
146
|
+
exports[`ButtonBase when "disabled" prop is true renders Button and does not trigger onClick handler 1`] = `
|
|
147
|
+
<div>
|
|
148
|
+
<div
|
|
149
|
+
class="Picasso-root"
|
|
150
|
+
>
|
|
151
|
+
<button
|
|
152
|
+
aria-disabled="true"
|
|
153
|
+
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"
|
|
154
|
+
data-component-type="button"
|
|
155
|
+
disabled=""
|
|
156
|
+
role="button"
|
|
157
|
+
tabindex="-1"
|
|
158
|
+
type="button"
|
|
159
|
+
>
|
|
160
|
+
<span
|
|
161
|
+
class="PicassoContainer-centerAlignItems PicassoContainer-flex PicassoContainer-inline"
|
|
162
|
+
>
|
|
163
|
+
Click me!
|
|
164
|
+
</span>
|
|
165
|
+
</button>
|
|
166
|
+
</div>
|
|
167
|
+
</div>
|
|
168
|
+
`;
|
|
169
|
+
|
|
170
|
+
exports[`ButtonBase when "loading" prop is true renders Button with loading state and does not trigger onClick handler 1`] = `
|
|
171
|
+
<div>
|
|
172
|
+
<div
|
|
173
|
+
class="Picasso-root"
|
|
174
|
+
>
|
|
175
|
+
<button
|
|
176
|
+
aria-disabled="false"
|
|
177
|
+
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"
|
|
178
|
+
data-component-type="button"
|
|
179
|
+
role="button"
|
|
180
|
+
tabindex="0"
|
|
181
|
+
type="button"
|
|
182
|
+
>
|
|
183
|
+
<span
|
|
184
|
+
class="PicassoContainer-centerAlignItems PicassoContainer-flex PicassoContainer-inline"
|
|
185
|
+
>
|
|
186
|
+
Click me!
|
|
187
|
+
</span>
|
|
188
|
+
<div
|
|
189
|
+
class="PicassoLoader-root absolute top-1/2 left-1/2 translate-x-[ translate-y-[ PicassoLoader-inline"
|
|
190
|
+
>
|
|
191
|
+
<div
|
|
192
|
+
aria-valuenow="35"
|
|
193
|
+
class="MuiCircularProgress-root PicassoCircularProgress-root PicassoLoader-spinnerInherit MuiCircularProgress-colorPrimary MuiCircularProgress-determinate"
|
|
194
|
+
role="progressbar"
|
|
195
|
+
style="width: 16px; height: 16px; transform: rotate(-90deg);"
|
|
196
|
+
>
|
|
197
|
+
<svg
|
|
198
|
+
class="MuiCircularProgress-svg"
|
|
199
|
+
viewBox="22 22 44 44"
|
|
200
|
+
>
|
|
201
|
+
<circle
|
|
202
|
+
class="MuiCircularProgress-circle MuiCircularProgress-circleDeterminate"
|
|
203
|
+
cx="44"
|
|
204
|
+
cy="44"
|
|
205
|
+
fill="none"
|
|
206
|
+
r="20.2"
|
|
207
|
+
stroke-width="3.6"
|
|
208
|
+
style="stroke-dasharray: 126.920; stroke-dashoffset: 82.498px;"
|
|
209
|
+
/>
|
|
210
|
+
</svg>
|
|
211
|
+
</div>
|
|
212
|
+
</div>
|
|
213
|
+
</button>
|
|
214
|
+
</div>
|
|
215
|
+
</div>
|
|
216
|
+
`;
|
|
217
|
+
|
|
218
|
+
exports[`ButtonBase when "role" prop is passed renders Button with a custom role 1`] = `
|
|
219
|
+
<div>
|
|
220
|
+
<div
|
|
221
|
+
class="Picasso-root"
|
|
222
|
+
>
|
|
223
|
+
<button
|
|
224
|
+
aria-disabled="false"
|
|
225
|
+
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"
|
|
226
|
+
data-component-type="button"
|
|
227
|
+
role="custom"
|
|
228
|
+
tabindex="0"
|
|
229
|
+
type="button"
|
|
230
|
+
>
|
|
231
|
+
<span
|
|
232
|
+
class="PicassoContainer-centerAlignItems PicassoContainer-flex PicassoContainer-inline"
|
|
233
|
+
>
|
|
234
|
+
Click me!
|
|
235
|
+
</span>
|
|
236
|
+
</button>
|
|
237
|
+
</div>
|
|
238
|
+
</div>
|
|
239
|
+
`;
|
|
240
|
+
|
|
241
|
+
exports[`ButtonBase when "titleCase" prop is true renders Button with transformed text to title case 1`] = `
|
|
242
|
+
<div>
|
|
243
|
+
<div
|
|
244
|
+
class="Picasso-root"
|
|
245
|
+
>
|
|
246
|
+
<button
|
|
247
|
+
aria-disabled="false"
|
|
248
|
+
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"
|
|
249
|
+
data-component-type="button"
|
|
250
|
+
role="button"
|
|
251
|
+
tabindex="0"
|
|
252
|
+
type="button"
|
|
253
|
+
>
|
|
254
|
+
<span
|
|
255
|
+
class="PicassoContainer-centerAlignItems PicassoContainer-flex PicassoContainer-inline"
|
|
256
|
+
>
|
|
257
|
+
__TITLE_CASE__Test bk9
|
|
258
|
+
</span>
|
|
259
|
+
</button>
|
|
260
|
+
</div>
|
|
261
|
+
</div>
|
|
262
|
+
`;
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
export const createCoreClassNames = ({
|
|
2
|
+
disabled,
|
|
3
|
+
loading,
|
|
4
|
+
}: {
|
|
5
|
+
disabled?: boolean
|
|
6
|
+
focused?: boolean
|
|
7
|
+
loading?: boolean
|
|
8
|
+
}): string[] => {
|
|
9
|
+
const classNames = [
|
|
10
|
+
'text-lg',
|
|
11
|
+
'inline-flex',
|
|
12
|
+
'items-center',
|
|
13
|
+
'justify-center',
|
|
14
|
+
'select-none',
|
|
15
|
+
'appearance-none',
|
|
16
|
+
'm-0',
|
|
17
|
+
'relative',
|
|
18
|
+
'normal-case',
|
|
19
|
+
'align-middle',
|
|
20
|
+
'transition-colors',
|
|
21
|
+
'duration-350',
|
|
22
|
+
'ease-out',
|
|
23
|
+
'shrink-0',
|
|
24
|
+
'outline-none',
|
|
25
|
+
'[&+&]:ml-4',
|
|
26
|
+
]
|
|
27
|
+
|
|
28
|
+
if (!disabled && !loading) {
|
|
29
|
+
classNames.push('cursor-pointer')
|
|
30
|
+
} else {
|
|
31
|
+
classNames.push('cursor-default')
|
|
32
|
+
classNames.push('pointer-events-none')
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
return classNames
|
|
36
|
+
}
|