@toptal/picasso-select 1.0.30 → 2.0.0
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/NativeSelect/NativeSelect.d.ts.map +1 -1
- package/dist-package/src/NativeSelect/NativeSelect.js +18 -23
- package/dist-package/src/NativeSelect/NativeSelect.js.map +1 -1
- package/dist-package/src/NativeSelect/NativeSelectInput.d.ts +9 -0
- package/dist-package/src/NativeSelect/NativeSelectInput.d.ts.map +1 -0
- package/dist-package/src/NativeSelect/NativeSelectInput.js +27 -0
- package/dist-package/src/NativeSelect/NativeSelectInput.js.map +1 -0
- package/dist-package/src/NonNativeSelect/NonNativeSelect.d.ts.map +1 -1
- package/dist-package/src/NonNativeSelect/NonNativeSelect.js +12 -18
- package/dist-package/src/NonNativeSelect/NonNativeSelect.js.map +1 -1
- package/dist-package/src/NonNativeSelectLimitFooter/NonNativeSelectLimitFooter.d.ts.map +1 -1
- package/dist-package/src/NonNativeSelectLimitFooter/NonNativeSelectLimitFooter.js +1 -5
- package/dist-package/src/NonNativeSelectLimitFooter/NonNativeSelectLimitFooter.js.map +1 -1
- package/dist-package/src/NonNativeSelectOptions/NonNativeSelectOptions.d.ts.map +1 -1
- package/dist-package/src/NonNativeSelectOptions/NonNativeSelectOptions.js +1 -5
- package/dist-package/src/NonNativeSelectOptions/NonNativeSelectOptions.js.map +1 -1
- package/dist-package/src/ScrollMenu/ScrollMenu.d.ts.map +1 -1
- package/dist-package/src/ScrollMenu/ScrollMenu.js +3 -9
- package/dist-package/src/ScrollMenu/ScrollMenu.js.map +1 -1
- package/dist-package/src/SelectCaret/SelectCaret.d.ts.map +1 -1
- package/dist-package/src/SelectCaret/SelectCaret.js +11 -8
- package/dist-package/src/SelectCaret/SelectCaret.js.map +1 -1
- package/dist-package/src/SelectOptions/SelectOptions.d.ts.map +1 -1
- package/dist-package/src/SelectOptions/SelectOptions.js +2 -11
- package/dist-package/src/SelectOptions/SelectOptions.js.map +1 -1
- package/package.json +14 -12
- package/src/NativeSelect/NativeSelect.tsx +54 -56
- package/src/NativeSelect/NativeSelectInput.tsx +51 -0
- package/src/NativeSelect/__snapshots__/test.tsx.snap +10 -36
- package/src/NonNativeSelect/NonNativeSelect.tsx +21 -23
- package/src/NonNativeSelect/__snapshots__/test.tsx.snap +45 -62
- package/src/NonNativeSelectLimitFooter/NonNativeSelectLimitFooter.tsx +1 -9
- package/src/NonNativeSelectLimitFooter/__snapshots__/test.tsx.snap +5 -5
- package/src/NonNativeSelectLoader/__snapshots__/test.tsx.snap +11 -9
- package/src/NonNativeSelectOption/__snapshots__/test.tsx.snap +14 -16
- package/src/NonNativeSelectOptions/NonNativeSelectOptions.tsx +1 -7
- package/src/NonNativeSelectOptions/__snapshots__/test.tsx.snap +51 -51
- package/src/ScrollMenu/ScrollMenu.tsx +8 -12
- package/src/ScrollMenu/__snapshots__/test.tsx.snap +17 -17
- package/src/Select/story/index.jsx +1 -1
- package/src/SelectCaret/SelectCaret.tsx +10 -12
- package/src/SelectCaret/__snapshots__/test.tsx.snap +2 -2
- package/src/SelectOptions/SelectOptions.tsx +5 -15
- package/dist-package/src/NativeSelect/styles.d.ts +0 -6
- package/dist-package/src/NativeSelect/styles.d.ts.map +0 -1
- package/dist-package/src/NativeSelect/styles.js +0 -54
- package/dist-package/src/NativeSelect/styles.js.map +0 -1
- package/dist-package/src/NonNativeSelect/styles.d.ts +0 -7
- package/dist-package/src/NonNativeSelect/styles.d.ts.map +0 -1
- package/dist-package/src/NonNativeSelect/styles.js +0 -56
- package/dist-package/src/NonNativeSelect/styles.js.map +0 -1
- package/dist-package/src/NonNativeSelectLimitFooter/styles.d.ts +0 -4
- package/dist-package/src/NonNativeSelectLimitFooter/styles.d.ts.map +0 -1
- package/dist-package/src/NonNativeSelectLimitFooter/styles.js +0 -10
- package/dist-package/src/NonNativeSelectLimitFooter/styles.js.map +0 -1
- package/dist-package/src/NonNativeSelectOptions/styles.d.ts +0 -3
- package/dist-package/src/NonNativeSelectOptions/styles.d.ts.map +0 -1
- package/dist-package/src/NonNativeSelectOptions/styles.js +0 -7
- package/dist-package/src/NonNativeSelectOptions/styles.js.map +0 -1
- package/dist-package/src/ScrollMenu/styles.d.ts +0 -4
- package/dist-package/src/ScrollMenu/styles.d.ts.map +0 -1
- package/dist-package/src/ScrollMenu/styles.js +0 -19
- package/dist-package/src/ScrollMenu/styles.js.map +0 -1
- package/dist-package/src/Select/styles.d.ts +0 -7
- package/dist-package/src/Select/styles.d.ts.map +0 -1
- package/dist-package/src/Select/styles.js +0 -49
- package/dist-package/src/Select/styles.js.map +0 -1
- package/dist-package/src/SelectCaret/styles.d.ts +0 -4
- package/dist-package/src/SelectCaret/styles.d.ts.map +0 -1
- package/dist-package/src/SelectCaret/styles.js +0 -21
- package/dist-package/src/SelectCaret/styles.js.map +0 -1
- package/dist-package/src/SelectOptions/styles.d.ts +0 -4
- package/dist-package/src/SelectOptions/styles.d.ts.map +0 -1
- package/dist-package/src/SelectOptions/styles.js +0 -19
- package/dist-package/src/SelectOptions/styles.js.map +0 -1
- package/src/NativeSelect/styles.ts +0 -57
- package/src/NonNativeSelect/styles.ts +0 -59
- package/src/NonNativeSelectLimitFooter/styles.ts +0 -12
- package/src/NonNativeSelectOptions/styles.ts +0 -8
- package/src/ScrollMenu/styles.ts +0 -23
- package/src/Select/styles.ts +0 -52
- package/src/SelectCaret/styles.ts +0 -23
- package/src/SelectOptions/styles.ts +0 -22
|
@@ -1,9 +1,4 @@
|
|
|
1
1
|
import React, { useRef } from 'react'
|
|
2
|
-
import cx from 'classnames'
|
|
3
|
-
import { NativeSelect as MUINativeSelect } from '@material-ui/core'
|
|
4
|
-
import type { Theme } from '@material-ui/core/styles'
|
|
5
|
-
import { makeStyles } from '@material-ui/core/styles'
|
|
6
|
-
import capitalize from '@material-ui/core/utils/capitalize'
|
|
7
2
|
import { OutlinedInput } from '@toptal/picasso-outlined-input'
|
|
8
3
|
import {
|
|
9
4
|
documentable,
|
|
@@ -11,6 +6,7 @@ import {
|
|
|
11
6
|
noop,
|
|
12
7
|
useCombinedRefs,
|
|
13
8
|
} from '@toptal/picasso-utils'
|
|
9
|
+
import { twJoin, twMerge } from '@toptal/picasso-tailwind-merge'
|
|
14
10
|
|
|
15
11
|
import { SelectCaret } from '../SelectCaret'
|
|
16
12
|
import type { ValueType, SelectProps } from '../SelectBase'
|
|
@@ -23,12 +19,19 @@ import {
|
|
|
23
19
|
} from '../SelectBase'
|
|
24
20
|
import NativeSelectOptions from '../NativeSelectOptions'
|
|
25
21
|
import NativeSelectPlaceholder from '../NativeSelectPlaceholder'
|
|
26
|
-
import
|
|
27
|
-
|
|
28
|
-
const useStyles = makeStyles<Theme>(styles)
|
|
22
|
+
import { NativeSelectInput } from './NativeSelectInput'
|
|
29
23
|
|
|
30
24
|
const DEFAULT_EMPTY_ARRAY_VALUE: ValueType[] = []
|
|
31
25
|
|
|
26
|
+
const classesByWidth: Record<
|
|
27
|
+
Exclude<SelectProps['width'], undefined>,
|
|
28
|
+
string
|
|
29
|
+
> = {
|
|
30
|
+
full: 'w-full',
|
|
31
|
+
shrink: 'w-auto',
|
|
32
|
+
auto: '',
|
|
33
|
+
}
|
|
34
|
+
|
|
32
35
|
export const NativeSelect = documentable(
|
|
33
36
|
forwardRef(
|
|
34
37
|
<T extends ValueType, M extends boolean = false>(
|
|
@@ -74,8 +77,6 @@ export const NativeSelect = documentable(
|
|
|
74
77
|
...rest
|
|
75
78
|
} = props
|
|
76
79
|
|
|
77
|
-
const classes = useStyles()
|
|
78
|
-
|
|
79
80
|
const selectRef = useCombinedRefs<HTMLInputElement>(
|
|
80
81
|
ref,
|
|
81
82
|
useRef<HTMLInputElement>(null)
|
|
@@ -104,49 +105,14 @@ export const NativeSelect = documentable(
|
|
|
104
105
|
})
|
|
105
106
|
|
|
106
107
|
const startAdornment = selectStartAdornment && (
|
|
107
|
-
<div className=
|
|
108
|
+
<div className='absolute left-[0.625rem]'>{selectStartAdornment}</div>
|
|
108
109
|
)
|
|
109
110
|
const endAdornment = selectEndAdornment && (
|
|
110
|
-
<div className=
|
|
111
|
+
<div className='absolute right-[1.625rem]'>{selectEndAdornment}</div>
|
|
111
112
|
)
|
|
112
113
|
|
|
113
|
-
const
|
|
114
|
-
|
|
115
|
-
// eslint-disable-next-line react/jsx-props-no-spreading
|
|
116
|
-
{...rest}
|
|
117
|
-
ref={selectRef}
|
|
118
|
-
disabled={disabled}
|
|
119
|
-
name={name}
|
|
120
|
-
id={id}
|
|
121
|
-
startAdornment={startAdornment}
|
|
122
|
-
endAdornment={endAdornment}
|
|
123
|
-
input={
|
|
124
|
-
<OutlinedInput
|
|
125
|
-
width={width}
|
|
126
|
-
inputProps={{ multiple }}
|
|
127
|
-
size={size}
|
|
128
|
-
className={classes.nativeInput}
|
|
129
|
-
testIds={testIds}
|
|
130
|
-
status={error ? 'error' : status}
|
|
131
|
-
highlight={highlight}
|
|
132
|
-
// eslint-disable-next-line react/jsx-props-no-spreading
|
|
133
|
-
{...getInputProps()}
|
|
134
|
-
/>
|
|
135
|
-
}
|
|
136
|
-
value={value}
|
|
137
|
-
onChange={onChange as any}
|
|
138
|
-
IconComponent={() => <SelectCaret disabled={disabled} />}
|
|
139
|
-
classes={{
|
|
140
|
-
root: cx(classes.select, {
|
|
141
|
-
[classes.placeholder]: !selection.isSelected(),
|
|
142
|
-
}),
|
|
143
|
-
select: cx({
|
|
144
|
-
[classes.startAdornmentPadding]:
|
|
145
|
-
React.isValidElement(startAdornment),
|
|
146
|
-
[classes.endAdornmentPadding]: React.isValidElement(endAdornment),
|
|
147
|
-
}),
|
|
148
|
-
}}
|
|
149
|
-
>
|
|
114
|
+
const children = (
|
|
115
|
+
<>
|
|
150
116
|
<NativeSelectPlaceholder
|
|
151
117
|
emptySelectValue={emptySelectValue}
|
|
152
118
|
disabled={!enableReset}
|
|
@@ -159,18 +125,50 @@ export const NativeSelect = documentable(
|
|
|
159
125
|
renderOption={renderOption as any}
|
|
160
126
|
getItemProps={getItemProps}
|
|
161
127
|
/>
|
|
162
|
-
|
|
128
|
+
</>
|
|
129
|
+
)
|
|
130
|
+
|
|
131
|
+
const nativeSelectComponent = (
|
|
132
|
+
<OutlinedInput
|
|
133
|
+
width={width}
|
|
134
|
+
size={size}
|
|
135
|
+
className='p-0 bg-white'
|
|
136
|
+
testIds={testIds}
|
|
137
|
+
status={error ? 'error' : status}
|
|
138
|
+
highlight={highlight}
|
|
139
|
+
{...getInputProps()}
|
|
140
|
+
{...rest}
|
|
141
|
+
ref={selectRef}
|
|
142
|
+
disabled={disabled}
|
|
143
|
+
name={name}
|
|
144
|
+
id={id}
|
|
145
|
+
startAdornment={startAdornment}
|
|
146
|
+
endAdornment={endAdornment}
|
|
147
|
+
value={value}
|
|
148
|
+
onChange={onChange as any}
|
|
149
|
+
inputComponent={NativeSelectInput as any}
|
|
150
|
+
inputProps={{
|
|
151
|
+
multiple,
|
|
152
|
+
children,
|
|
153
|
+
type: undefined, // We render a select. We can ignore the type provided by the `Input`.
|
|
154
|
+
IconComponent: () => <SelectCaret disabled={disabled} />,
|
|
155
|
+
className: twJoin(
|
|
156
|
+
'w-full p-2 focus:bg-inheritColor',
|
|
157
|
+
!selection.isSelected() && 'text-gray-600',
|
|
158
|
+
React.isValidElement(startAdornment) && 'pl-[2.5625rem]',
|
|
159
|
+
React.isValidElement(endAdornment) && 'pr-[3.5625rem]'
|
|
160
|
+
),
|
|
161
|
+
}}
|
|
162
|
+
/>
|
|
163
163
|
)
|
|
164
164
|
|
|
165
165
|
return (
|
|
166
166
|
<div
|
|
167
|
-
className={
|
|
168
|
-
|
|
167
|
+
className={twMerge(
|
|
168
|
+
'relative inline-flex text-[1rem] cursor-pointer',
|
|
169
169
|
className,
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
[classes.rootDisabled]: disabled,
|
|
173
|
-
}
|
|
170
|
+
classesByWidth[width],
|
|
171
|
+
disabled && 'cursor-default'
|
|
174
172
|
)}
|
|
175
173
|
style={style}
|
|
176
174
|
ref={inputWrapperRef}
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
import React, { forwardRef } from 'react'
|
|
2
|
+
import { twMerge, twJoin } from '@toptal/picasso-tailwind-merge'
|
|
3
|
+
|
|
4
|
+
type NativeSelectInputProps = {
|
|
5
|
+
className?: string
|
|
6
|
+
disabled?: boolean
|
|
7
|
+
IconComponent?: React.ElementType
|
|
8
|
+
multiple?: boolean
|
|
9
|
+
ownerState?: {}
|
|
10
|
+
} & React.HTMLAttributes<HTMLSelectElement>
|
|
11
|
+
|
|
12
|
+
export const NativeSelectInput = forwardRef<
|
|
13
|
+
HTMLSelectElement,
|
|
14
|
+
NativeSelectInputProps
|
|
15
|
+
>((props, ref) => {
|
|
16
|
+
// omit ownerState from the props
|
|
17
|
+
// eslint-disable-next-line @typescript-eslint/no-unused-vars
|
|
18
|
+
const { ownerState, className, disabled, multiple, IconComponent, ...other } =
|
|
19
|
+
props
|
|
20
|
+
|
|
21
|
+
return (
|
|
22
|
+
<>
|
|
23
|
+
<select
|
|
24
|
+
className={twMerge(
|
|
25
|
+
`appearance-none select-none rounded-none min-w-4 cursor-pointer
|
|
26
|
+
focus:bg-black/[.05] focus:rounded-none`,
|
|
27
|
+
disabled && 'cursor-default',
|
|
28
|
+
multiple ? 'h-auto' : '[&_option]:bg-white [&_optgroup]:bg-white',
|
|
29
|
+
className,
|
|
30
|
+
'pr-6' // From MUI, this rule is more specific and should override classname
|
|
31
|
+
)}
|
|
32
|
+
disabled={disabled}
|
|
33
|
+
multiple={multiple}
|
|
34
|
+
ref={ref}
|
|
35
|
+
{...other}
|
|
36
|
+
/>
|
|
37
|
+
{multiple
|
|
38
|
+
? null
|
|
39
|
+
: IconComponent && (
|
|
40
|
+
<IconComponent
|
|
41
|
+
className={twJoin(
|
|
42
|
+
'absolute right-0 top-[calc(50%-12px)] pointer-events-none',
|
|
43
|
+
disabled ? 'text-black/[.26]' : 'text-black/[.54]'
|
|
44
|
+
)}
|
|
45
|
+
/>
|
|
46
|
+
)}
|
|
47
|
+
</>
|
|
48
|
+
)
|
|
49
|
+
})
|
|
50
|
+
|
|
51
|
+
NativeSelectInput.displayName = 'NativeSelectInput'
|
|
@@ -6,14 +6,15 @@ exports[`NativeSelect renders native select 1`] = `
|
|
|
6
6
|
class="Picasso-root"
|
|
7
7
|
>
|
|
8
8
|
<div
|
|
9
|
-
class="
|
|
9
|
+
class="relative inline-flex text-[1rem] cursor-pointer w-full"
|
|
10
10
|
>
|
|
11
11
|
<div
|
|
12
|
-
class="
|
|
12
|
+
class="base-Input relative inline-flex gap-y gap-x items-center rounded-sm [font-size:_unset] hover:[&_.resetButtonDirty]:visible h-8 w-full after:content-[""] after:inline-block after:absolute after:top-0 after:bottom-0 after:right-0 after:left-0 after:pointer-events after:border-solid after:rounded-sm after:border-gray [&:has(input:focus)]:after:border-blue after:border [&:has(input:focus)]:after:shadow-[0_0_0_3px] [&:has(input:focus)]:after:shadow-blue hover:[&:not(:has(input:focus))]:after:border-gray text-black cursor-[inherit] p-0 bg-white"
|
|
13
13
|
>
|
|
14
14
|
<select
|
|
15
15
|
aria-invalid="false"
|
|
16
|
-
class="
|
|
16
|
+
class="appearance-none select-none rounded-none min-w focus:rounded-none [&_option]:bg-white [&_optgroup]:bg-white base-Input [&::-webkit-calendar-picker-indicator]:bg bg-transparent border-none box-border cursor-[inherit] h-full outline-none peer resize-none text-md leading-4 text-black [&::placeholder]:text-gray [&::placeholder]:opacity-100 w-full p-2 focus:bg-inheritColor pr-6"
|
|
17
|
+
type="text"
|
|
17
18
|
>
|
|
18
19
|
<option
|
|
19
20
|
disabled=""
|
|
@@ -41,7 +42,7 @@ exports[`NativeSelect renders native select 1`] = `
|
|
|
41
42
|
</option>
|
|
42
43
|
</select>
|
|
43
44
|
<svg
|
|
44
|
-
class="PicassoSvgDropdownArrows16-root
|
|
45
|
+
class="PicassoSvgDropdownArrows16-root absolute top-[calc(50%-0.5rem)] right-[0.3125rem] text-graphite text-[1rem] cursor-inherit pointer-events"
|
|
45
46
|
style="min-width: 16px; min-height: 16px;"
|
|
46
47
|
viewBox="0 0 16 16"
|
|
47
48
|
>
|
|
@@ -49,20 +50,6 @@ exports[`NativeSelect renders native select 1`] = `
|
|
|
49
50
|
d="m10.997 10.29.707.707-3.707 3.707-3.707-3.707.707-.707 3 3 3-3Zm-3-9 3.707 3.707-.707.707-3-3-3 3-.707-.707 3-3 .707-.707Z"
|
|
50
51
|
/>
|
|
51
52
|
</svg>
|
|
52
|
-
<fieldset
|
|
53
|
-
aria-hidden="true"
|
|
54
|
-
class="PrivateNotchedOutline-root MuiOutlinedInput-notchedOutline PicassoOutlinedInput-notchedOutline"
|
|
55
|
-
style="padding-left: 8px;"
|
|
56
|
-
>
|
|
57
|
-
<legend
|
|
58
|
-
class="PrivateNotchedOutline-legend"
|
|
59
|
-
style="width: 0.01px;"
|
|
60
|
-
>
|
|
61
|
-
<span>
|
|
62
|
-
|
|
63
|
-
</span>
|
|
64
|
-
</legend>
|
|
65
|
-
</fieldset>
|
|
66
53
|
</div>
|
|
67
54
|
</div>
|
|
68
55
|
</div>
|
|
@@ -75,14 +62,15 @@ exports[`NativeSelect renders native select with the empty option enabled when e
|
|
|
75
62
|
class="Picasso-root"
|
|
76
63
|
>
|
|
77
64
|
<div
|
|
78
|
-
class="
|
|
65
|
+
class="relative inline-flex text-[1rem] cursor-pointer w-full"
|
|
79
66
|
>
|
|
80
67
|
<div
|
|
81
|
-
class="
|
|
68
|
+
class="base-Input relative inline-flex gap-y gap-x items-center rounded-sm [font-size:_unset] hover:[&_.resetButtonDirty]:visible h-8 w-full after:content-[""] after:inline-block after:absolute after:top-0 after:bottom-0 after:right-0 after:left-0 after:pointer-events after:border-solid after:rounded-sm after:border-gray [&:has(input:focus)]:after:border-blue after:border [&:has(input:focus)]:after:shadow-[0_0_0_3px] [&:has(input:focus)]:after:shadow-blue hover:[&:not(:has(input:focus))]:after:border-gray text-black cursor-[inherit] p-0 bg-white"
|
|
82
69
|
>
|
|
83
70
|
<select
|
|
84
71
|
aria-invalid="false"
|
|
85
|
-
class="
|
|
72
|
+
class="appearance-none select-none rounded-none min-w focus:rounded-none [&_option]:bg-white [&_optgroup]:bg-white base-Input [&::-webkit-calendar-picker-indicator]:bg bg-transparent border-none box-border cursor-[inherit] h-full outline-none peer resize-none text-md leading-4 text-black [&::placeholder]:text-gray [&::placeholder]:opacity-100 w-full p-2 focus:bg-inheritColor pr-6"
|
|
73
|
+
type="text"
|
|
86
74
|
>
|
|
87
75
|
<option
|
|
88
76
|
value=""
|
|
@@ -109,7 +97,7 @@ exports[`NativeSelect renders native select with the empty option enabled when e
|
|
|
109
97
|
</option>
|
|
110
98
|
</select>
|
|
111
99
|
<svg
|
|
112
|
-
class="PicassoSvgDropdownArrows16-root
|
|
100
|
+
class="PicassoSvgDropdownArrows16-root absolute top-[calc(50%-0.5rem)] right-[0.3125rem] text-graphite text-[1rem] cursor-inherit pointer-events"
|
|
113
101
|
style="min-width: 16px; min-height: 16px;"
|
|
114
102
|
viewBox="0 0 16 16"
|
|
115
103
|
>
|
|
@@ -117,20 +105,6 @@ exports[`NativeSelect renders native select with the empty option enabled when e
|
|
|
117
105
|
d="m10.997 10.29.707.707-3.707 3.707-3.707-3.707.707-.707 3 3 3-3Zm-3-9 3.707 3.707-.707.707-3-3-3 3-.707-.707 3-3 .707-.707Z"
|
|
118
106
|
/>
|
|
119
107
|
</svg>
|
|
120
|
-
<fieldset
|
|
121
|
-
aria-hidden="true"
|
|
122
|
-
class="PrivateNotchedOutline-root MuiOutlinedInput-notchedOutline PicassoOutlinedInput-notchedOutline"
|
|
123
|
-
style="padding-left: 8px;"
|
|
124
|
-
>
|
|
125
|
-
<legend
|
|
126
|
-
class="PrivateNotchedOutline-legend"
|
|
127
|
-
style="width: 0.01px;"
|
|
128
|
-
>
|
|
129
|
-
<span>
|
|
130
|
-
|
|
131
|
-
</span>
|
|
132
|
-
</legend>
|
|
133
|
-
</fieldset>
|
|
134
108
|
</div>
|
|
135
109
|
</div>
|
|
136
110
|
</div>
|
|
@@ -1,9 +1,5 @@
|
|
|
1
1
|
import React, { useRef } from 'react'
|
|
2
2
|
import type PopperJs from 'popper.js'
|
|
3
|
-
import cx from 'classnames'
|
|
4
|
-
import type { Theme } from '@material-ui/core/styles'
|
|
5
|
-
import { makeStyles } from '@material-ui/core/styles'
|
|
6
|
-
import capitalize from '@material-ui/core/utils/capitalize'
|
|
7
3
|
import { Search16 } from '@toptal/picasso-icons'
|
|
8
4
|
import { OutlinedInput } from '@toptal/picasso-outlined-input'
|
|
9
5
|
import { Popper } from '@toptal/picasso-popper'
|
|
@@ -16,6 +12,7 @@ import {
|
|
|
16
12
|
} from '@toptal/picasso-utils'
|
|
17
13
|
import { InputAdornment } from '@toptal/picasso-input-adornment'
|
|
18
14
|
import { useFieldsLayoutContext } from '@toptal/picasso-form'
|
|
15
|
+
import { twMerge, twJoin } from '@toptal/picasso-tailwind-merge'
|
|
19
16
|
|
|
20
17
|
import { SelectCaret } from '../SelectCaret'
|
|
21
18
|
import { NonNativeSelectLoader } from '../NonNativeSelectLoader'
|
|
@@ -32,12 +29,19 @@ import {
|
|
|
32
29
|
filterFlatOptions as defaultFilterOptions,
|
|
33
30
|
} from '../SelectBase'
|
|
34
31
|
import { NonNativeSelectOptions } from '../NonNativeSelectOptions'
|
|
35
|
-
import styles from './styles'
|
|
36
32
|
import { NonNativeSelectLimitFooter } from '../NonNativeSelectLimitFooter'
|
|
37
|
-
const useStyles = makeStyles<Theme>(styles)
|
|
38
33
|
|
|
39
34
|
const DEFAULT_EMPTY_ARRAY_VALUE: ValueType[] = []
|
|
40
35
|
|
|
36
|
+
const classesByWidth: Record<
|
|
37
|
+
Exclude<SelectProps['width'], undefined>,
|
|
38
|
+
string
|
|
39
|
+
> = {
|
|
40
|
+
auto: '',
|
|
41
|
+
full: 'w-full',
|
|
42
|
+
shrink: 'w-auto',
|
|
43
|
+
}
|
|
44
|
+
|
|
41
45
|
export const NonNativeSelect = documentable(
|
|
42
46
|
forwardRef(
|
|
43
47
|
// eslint-disable-next-line max-lines-per-function, complexity
|
|
@@ -84,8 +88,6 @@ export const NonNativeSelect = documentable(
|
|
|
84
88
|
...rest
|
|
85
89
|
} = props
|
|
86
90
|
|
|
87
|
-
const classes = useStyles()
|
|
88
|
-
|
|
89
91
|
const selectRef = useCombinedRefs<HTMLInputElement>(
|
|
90
92
|
ref,
|
|
91
93
|
useRef<HTMLInputElement>(null)
|
|
@@ -128,12 +130,11 @@ export const NonNativeSelect = documentable(
|
|
|
128
130
|
<MenuItem
|
|
129
131
|
as='div'
|
|
130
132
|
nonSelectable
|
|
131
|
-
|
|
132
|
-
className={classes.searchInputGutters}
|
|
133
|
+
className='pt-[0.375rem] pl-2 pb-2 pr-2'
|
|
133
134
|
>
|
|
134
135
|
<OutlinedInput
|
|
135
136
|
inputRef={searchInputRef}
|
|
136
|
-
className=
|
|
137
|
+
className='w-full'
|
|
137
138
|
startAdornment={
|
|
138
139
|
<InputAdornment position='start' disablePointerEvents>
|
|
139
140
|
<Search16 />
|
|
@@ -164,9 +165,10 @@ export const NonNativeSelect = documentable(
|
|
|
164
165
|
<>
|
|
165
166
|
<div
|
|
166
167
|
{...rootProps}
|
|
167
|
-
className={
|
|
168
|
-
[
|
|
169
|
-
|
|
168
|
+
className={twJoin(
|
|
169
|
+
'w-[inherit] outline-0',
|
|
170
|
+
layout === 'horizontal' && 'w-full'
|
|
171
|
+
)}
|
|
170
172
|
>
|
|
171
173
|
{!enableAutofill && name && (
|
|
172
174
|
<input type='hidden' value={displayValue} name={name} />
|
|
@@ -183,13 +185,12 @@ export const NonNativeSelect = documentable(
|
|
|
183
185
|
endAdornment={endAdornment}
|
|
184
186
|
// Input specific props
|
|
185
187
|
value={displayValue}
|
|
186
|
-
/* eslint-disable-next-line react/jsx-props-no-spreading */
|
|
187
188
|
{...getInputProps()}
|
|
188
189
|
placeholder={placeholder}
|
|
189
190
|
width={width}
|
|
190
191
|
readOnly
|
|
191
192
|
defaultValue={undefined}
|
|
192
|
-
className=
|
|
193
|
+
className='pr-[1.625rem]'
|
|
193
194
|
highlight={highlight}
|
|
194
195
|
inputProps={{
|
|
195
196
|
size: 1, // let input to have smallest width by default for width:'shrink'
|
|
@@ -224,7 +225,6 @@ export const NonNativeSelect = documentable(
|
|
|
224
225
|
renderOption={renderOption as any}
|
|
225
226
|
highlightedIndex={highlightedIndex}
|
|
226
227
|
getItemProps={getItemProps}
|
|
227
|
-
// eslint-disable-next-line react/jsx-handler-names
|
|
228
228
|
onBlur={rootProps.onBlur}
|
|
229
229
|
selection={selection}
|
|
230
230
|
filterOptionsValue={filterOptionsValue}
|
|
@@ -252,13 +252,11 @@ export const NonNativeSelect = documentable(
|
|
|
252
252
|
|
|
253
253
|
return (
|
|
254
254
|
<div
|
|
255
|
-
className={
|
|
256
|
-
|
|
255
|
+
className={twMerge(
|
|
256
|
+
'relative inline-flex text-[1rem] cursor-pointer',
|
|
257
257
|
className,
|
|
258
|
-
|
|
259
|
-
|
|
260
|
-
[classes.rootDisabled]: disabled,
|
|
261
|
-
}
|
|
258
|
+
classesByWidth[width],
|
|
259
|
+
disabled && 'cursor-default'
|
|
262
260
|
)}
|
|
263
261
|
style={style}
|
|
264
262
|
ref={inputWrapperRef}
|