@spothero/ui 15.9.2 → 15.9.3
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/package.json +1 -1
- package/styles/v2/components/AutoSuggestSelect/AutoSuggestSelect.jsx +1 -5
- package/styles/v2/components/Select/Select.jsx +7 -133
- package/styles/v2/components/Select/Select.stories.js +12 -26
- package/styles/v2/components/Select/styles/index.js +29 -0
- package/styles/v2/components/styles.js +1 -0
- package/v2/index.js +1 -1
- package/v2/index.js.map +1 -1
package/package.json
CHANGED
|
@@ -15,7 +15,6 @@ const AutoSuggestSelect = forwardRef(
|
|
|
15
15
|
isInvalid,
|
|
16
16
|
isDisabled,
|
|
17
17
|
isRequired,
|
|
18
|
-
isOptional,
|
|
19
18
|
getOptions,
|
|
20
19
|
onChange,
|
|
21
20
|
iconSrc,
|
|
@@ -133,7 +132,6 @@ const AutoSuggestSelect = forwardRef(
|
|
|
133
132
|
<FormControl
|
|
134
133
|
errorMessage={errorMessage}
|
|
135
134
|
isRequired={isRequired}
|
|
136
|
-
isOptional={isOptional}
|
|
137
135
|
helperText={helperText}
|
|
138
136
|
label={label}
|
|
139
137
|
inputId={id}
|
|
@@ -170,7 +168,7 @@ AutoSuggestSelect.propTypes = {
|
|
|
170
168
|
placeholder: PropTypes.string,
|
|
171
169
|
/** Optional helper text displayed below the select */
|
|
172
170
|
helperText: PropTypes.string,
|
|
173
|
-
/** Error message that would
|
|
171
|
+
/** Error message that would dispplay under the select */
|
|
174
172
|
errorMessage: PropTypes.string,
|
|
175
173
|
/** Boolean that sets whether the select is valid */
|
|
176
174
|
isInvalid: PropTypes.bool,
|
|
@@ -178,8 +176,6 @@ AutoSuggestSelect.propTypes = {
|
|
|
178
176
|
isDisabled: PropTypes.bool,
|
|
179
177
|
/** Boolean that sets whether the select is required */
|
|
180
178
|
isRequired: PropTypes.bool,
|
|
181
|
-
/** Boolean that sets whether the select is optional */
|
|
182
|
-
isOptional: PropTypes.bool,
|
|
183
179
|
/** Function that is called with the value typed into the input that returns a list of options for the select */
|
|
184
180
|
getOptions: PropTypes.func.isRequired,
|
|
185
181
|
/** Function that is called when an option is selected, it returns the label and value of the selection */
|
|
@@ -1,8 +1,7 @@
|
|
|
1
|
-
import React, {forwardRef} from 'react';
|
|
2
1
|
import cn from 'classnames';
|
|
3
2
|
import PropTypes from 'prop-types';
|
|
4
|
-
import
|
|
5
|
-
|
|
3
|
+
import React, {forwardRef} from 'react';
|
|
4
|
+
import {Select as ChakraSelect} from '@chakra-ui/react';
|
|
6
5
|
import IconChevronDown from '@spothero/icons/chevron-down';
|
|
7
6
|
|
|
8
7
|
import Icon from '../Icon/Icon';
|
|
@@ -18,127 +17,12 @@ const Select = forwardRef(
|
|
|
18
17
|
isDisabled,
|
|
19
18
|
isRequired,
|
|
20
19
|
isOptional,
|
|
21
|
-
options,
|
|
22
20
|
...props
|
|
23
21
|
},
|
|
24
22
|
ref
|
|
25
23
|
) => {
|
|
26
24
|
const classes = cn({'FormElement-contains-error': isInvalid});
|
|
27
25
|
|
|
28
|
-
const baseText = {
|
|
29
|
-
fontSize: 'var(--chakra-fontSizes-base)',
|
|
30
|
-
color: 'var(--chakra-colors-text-primary-light)',
|
|
31
|
-
};
|
|
32
|
-
|
|
33
|
-
/** React Select doesn't use Chakra but it does use Emotion so it's not too difficult to use values from our Chakra theme. Here is the documentation for React Select styling: https://react-select.com/styles */
|
|
34
|
-
const customStyles = {
|
|
35
|
-
select: (provided, state) => ({
|
|
36
|
-
...provided,
|
|
37
|
-
|
|
38
|
-
'&:hover': {
|
|
39
|
-
cursor: state.isDisabled ? 'not-allowed' : 'auto',
|
|
40
|
-
},
|
|
41
|
-
}),
|
|
42
|
-
menu: provided => ({
|
|
43
|
-
...provided,
|
|
44
|
-
...baseText,
|
|
45
|
-
borderColor: 'var(--chakra-colors-gray-200)',
|
|
46
|
-
borderWidth: '1px',
|
|
47
|
-
boxShadow: 'none',
|
|
48
|
-
}),
|
|
49
|
-
control: (provided, state) => ({
|
|
50
|
-
...provided,
|
|
51
|
-
borderColor: isInvalid
|
|
52
|
-
? 'var(--chakra-colors-error)'
|
|
53
|
-
: state.isFocused
|
|
54
|
-
? 'var(--chakra-colors-primary-default)'
|
|
55
|
-
: 'var(--chakra-colors-gray-200)',
|
|
56
|
-
borderWidth: '1px',
|
|
57
|
-
borderRadius: '4px',
|
|
58
|
-
backgroundColor: state.isDisabled
|
|
59
|
-
? 'var(--chakra-colors-gray-50)'
|
|
60
|
-
: 'transparent',
|
|
61
|
-
boxShadow: 'none',
|
|
62
|
-
height: 'var(--chakra-sizes-10)',
|
|
63
|
-
minWidth: 'var(--chakra-sizes-48)',
|
|
64
|
-
width: props.width && props.width,
|
|
65
|
-
|
|
66
|
-
'&:hover': {
|
|
67
|
-
borderColor: isInvalid
|
|
68
|
-
? 'var(--chakra-colors-error)'
|
|
69
|
-
: state.isFocused
|
|
70
|
-
? 'var(--chakra-colors-primary-default)'
|
|
71
|
-
: 'var(--chakra-colors-gray-200)',
|
|
72
|
-
},
|
|
73
|
-
}),
|
|
74
|
-
input: (provided, state) => ({
|
|
75
|
-
...provided,
|
|
76
|
-
...baseText,
|
|
77
|
-
borderRadius: '4px',
|
|
78
|
-
color: state.isDisabled
|
|
79
|
-
? 'var(--chakra-colors-text-secondary-light)'
|
|
80
|
-
: 'var(--chakra-colors-text-primary-light)',
|
|
81
|
-
backgroundColor: state.isDisabled
|
|
82
|
-
? 'var(--chakra-colors-gray-50)'
|
|
83
|
-
: 'transparent',
|
|
84
|
-
}),
|
|
85
|
-
placeholder: provided => ({
|
|
86
|
-
...provided,
|
|
87
|
-
fontSize: 'var(--chakra-fontSizes-base)',
|
|
88
|
-
color: 'var(--chakra-colors-gray-600)',
|
|
89
|
-
}),
|
|
90
|
-
singleValue: (provided, state) => ({
|
|
91
|
-
...provided,
|
|
92
|
-
...baseText,
|
|
93
|
-
color: state.isDisabled
|
|
94
|
-
? 'var(--chakra-colors-text-secondary-light)'
|
|
95
|
-
: 'var(--chakra-colors-text-primary-light)',
|
|
96
|
-
|
|
97
|
-
'&:hover': {
|
|
98
|
-
cursor: state.isDisabled ? 'not-allowed' : 'auto',
|
|
99
|
-
},
|
|
100
|
-
}),
|
|
101
|
-
option: (provided, state) => ({
|
|
102
|
-
...provided,
|
|
103
|
-
backgroundColor: state.isSelected
|
|
104
|
-
? 'var(--chakra-colors-gray-200)'
|
|
105
|
-
: state.isFocused
|
|
106
|
-
? 'var(--chakra-colors-gray-50)'
|
|
107
|
-
: 'transparent',
|
|
108
|
-
color: 'var(--chakra-colors-text-primary-light)',
|
|
109
|
-
fontWeight: state.isSelected
|
|
110
|
-
? 'var(--chakra-fontWeights-semibold)'
|
|
111
|
-
: 'var(--chakra-fontWeights-normal)',
|
|
112
|
-
|
|
113
|
-
':active': {
|
|
114
|
-
fontWeight: 'var(--chakra-fontWeights-semibold)',
|
|
115
|
-
color: 'var(--chakra-colors-text-primary-light)',
|
|
116
|
-
backgroundColor:
|
|
117
|
-
!state.isDisabled && 'var(--chakra-colors-gray-200)',
|
|
118
|
-
},
|
|
119
|
-
}),
|
|
120
|
-
};
|
|
121
|
-
|
|
122
|
-
const dropdownIndicatorStyles = {
|
|
123
|
-
width: 18,
|
|
124
|
-
display: 'flex',
|
|
125
|
-
marginRight: 'var(--chakra-space-4)',
|
|
126
|
-
marginLeft: 'var(--chakra-space-7)',
|
|
127
|
-
color: 'var(--chakra-colors-gray-600)',
|
|
128
|
-
'&:hover': {
|
|
129
|
-
color: 'var(--chakra-colors-gray-600)',
|
|
130
|
-
},
|
|
131
|
-
};
|
|
132
|
-
|
|
133
|
-
const DropdownIndicator = ({innerRef, innerProps}) => (
|
|
134
|
-
<Icon
|
|
135
|
-
as={IconChevronDown}
|
|
136
|
-
style={dropdownIndicatorStyles}
|
|
137
|
-
ref={innerRef}
|
|
138
|
-
{...innerProps}
|
|
139
|
-
/>
|
|
140
|
-
);
|
|
141
|
-
|
|
142
26
|
return (
|
|
143
27
|
<FormControl
|
|
144
28
|
isInvalid={isInvalid}
|
|
@@ -149,19 +33,12 @@ const Select = forwardRef(
|
|
|
149
33
|
helperText={helperText}
|
|
150
34
|
label={label}
|
|
151
35
|
inputId={props.id}
|
|
152
|
-
minWidth={48}
|
|
153
|
-
width={props.width && props.width}
|
|
154
36
|
>
|
|
155
|
-
<
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
DropdownIndicator,
|
|
161
|
-
IndicatorSeparator: () => null,
|
|
162
|
-
}}
|
|
163
|
-
maxMenuHeight={280}
|
|
164
|
-
styles={customStyles}
|
|
37
|
+
<ChakraSelect
|
|
38
|
+
icon={<Icon as={IconChevronDown} />}
|
|
39
|
+
iconSize={12}
|
|
40
|
+
fontWeight="regular"
|
|
41
|
+
fontSize="sm"
|
|
165
42
|
ref={ref}
|
|
166
43
|
className={classes}
|
|
167
44
|
{...props}
|
|
@@ -173,11 +50,8 @@ const Select = forwardRef(
|
|
|
173
50
|
|
|
174
51
|
Select.propTypes = {
|
|
175
52
|
id: PropTypes.string.isRequired,
|
|
176
|
-
options: PropTypes.array,
|
|
177
53
|
label: PropTypes.string,
|
|
178
|
-
isRequired: PropTypes.bool,
|
|
179
54
|
helperText: PropTypes.string,
|
|
180
|
-
placeholder: PropTypes.string,
|
|
181
55
|
errorMessage: PropTypes.string,
|
|
182
56
|
isInvalid: PropTypes.bool,
|
|
183
57
|
isDisabled: PropTypes.bool,
|
|
@@ -11,7 +11,14 @@ export default {
|
|
|
11
11
|
},
|
|
12
12
|
};
|
|
13
13
|
|
|
14
|
-
const SelectTemplate = props =>
|
|
14
|
+
const SelectTemplate = props => (
|
|
15
|
+
<Component variant="outline" maxWidth="200px" {...props}>
|
|
16
|
+
<option value="one">One</option>
|
|
17
|
+
<option value="two">Two</option>
|
|
18
|
+
<option value="three">Three</option>
|
|
19
|
+
<option value="four">Four</option>
|
|
20
|
+
</Component>
|
|
21
|
+
);
|
|
15
22
|
|
|
16
23
|
SelectTemplate.propTypes = {
|
|
17
24
|
placeholder: PropTypes.string,
|
|
@@ -21,54 +28,33 @@ SelectTemplate.propTypes = {
|
|
|
21
28
|
isInvalid: PropTypes.bool,
|
|
22
29
|
isDisabled: PropTypes.bool,
|
|
23
30
|
isReadOnly: PropTypes.bool,
|
|
24
|
-
isOptional: PropTypes.bool,
|
|
25
31
|
};
|
|
26
32
|
|
|
27
33
|
export const Select = SelectTemplate.bind({});
|
|
28
34
|
|
|
29
35
|
Select.argTypes = {
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
control: {type: 'object'},
|
|
36
|
+
placeholder: {
|
|
37
|
+
control: {type: 'text'},
|
|
33
38
|
},
|
|
34
39
|
label: {
|
|
35
40
|
control: {type: 'text'},
|
|
36
41
|
},
|
|
37
|
-
isRequired: {control: {type: 'boolean'}},
|
|
38
42
|
helperText: {
|
|
39
43
|
control: {type: 'text'},
|
|
40
44
|
},
|
|
41
|
-
placeholder: {
|
|
42
|
-
control: {type: 'text'},
|
|
43
|
-
},
|
|
44
45
|
errorMessage: {
|
|
45
46
|
control: {type: 'text'},
|
|
46
47
|
},
|
|
47
|
-
isInvalid: {control: {type: 'boolean'}},
|
|
48
|
-
isDisabled: {control: {type: 'boolean'}},
|
|
49
48
|
};
|
|
50
49
|
|
|
51
50
|
Select.args = {
|
|
52
|
-
|
|
53
|
-
options: [
|
|
54
|
-
{value: 'One', label: 'Option One'},
|
|
55
|
-
{value: 'Two', label: 'Option Two'},
|
|
56
|
-
{value: 'Three', label: 'Option Three'},
|
|
57
|
-
{value: 'Four', label: 'Option Four'},
|
|
58
|
-
{value: 'Five', label: 'Option Five'},
|
|
59
|
-
{value: 'Six', label: 'Option Six'},
|
|
60
|
-
{value: 'Seven', label: 'Option Seven'},
|
|
61
|
-
{value: 'Eight', label: 'Option Eight'},
|
|
62
|
-
{value: 'Nine', label: 'Option Nine'},
|
|
63
|
-
{value: 'Ten', label: 'Option Ten'},
|
|
64
|
-
],
|
|
51
|
+
placeholder: 'Placeholder text',
|
|
65
52
|
label: 'Label',
|
|
66
|
-
isRequired: false,
|
|
67
53
|
helperText: 'Helper text',
|
|
68
|
-
placeholder: 'Select One...',
|
|
69
54
|
errorMessage: 'Error message',
|
|
70
55
|
isInvalid: false,
|
|
71
56
|
isDisabled: false,
|
|
72
57
|
isReadOnly: false,
|
|
58
|
+
isRequired: false,
|
|
73
59
|
isOptional: false,
|
|
74
60
|
};
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
import merge from 'lodash/merge';
|
|
2
|
+
import chakraDefaultTheme from '@chakra-ui/theme';
|
|
3
|
+
|
|
4
|
+
const variants = {
|
|
5
|
+
outline: {
|
|
6
|
+
field: {
|
|
7
|
+
border: '1px solid',
|
|
8
|
+
borderColor: 'inherit',
|
|
9
|
+
bg: 'inherit',
|
|
10
|
+
_hover: {borderColor: 'gray.300'},
|
|
11
|
+
_readOnly: {boxShadow: 'none !important', userSelect: 'all'},
|
|
12
|
+
_disabled: {opacity: 0.4, cursor: 'not-allowed'},
|
|
13
|
+
_invalid: {
|
|
14
|
+
borderColor: 'error',
|
|
15
|
+
boxShadow: t => `0 0 0 1px ${t.colors.error}`,
|
|
16
|
+
},
|
|
17
|
+
_focus: {
|
|
18
|
+
zIndex: 1,
|
|
19
|
+
borderColor: 'primary.400',
|
|
20
|
+
boxShadow: t => `0 0 0 1px ${t.colors.primary['400']}`,
|
|
21
|
+
},
|
|
22
|
+
},
|
|
23
|
+
addon: {border: '1px solid', borderColor: 'inherit', bg: 'gray.100'},
|
|
24
|
+
},
|
|
25
|
+
};
|
|
26
|
+
|
|
27
|
+
export default merge(chakraDefaultTheme.components.Select, {
|
|
28
|
+
variants,
|
|
29
|
+
});
|
|
@@ -9,6 +9,7 @@ export {default as Spinner} from './Spinner/Spinner.styles';
|
|
|
9
9
|
export {default as Heading} from './Heading/Heading.styles';
|
|
10
10
|
export {default as Divider} from './Divider/Divider.styles';
|
|
11
11
|
export {default as Tabs} from './Tabs/styles';
|
|
12
|
+
export {default as Select} from './Select/styles';
|
|
12
13
|
export {default as Checkbox} from './Checkbox/styles';
|
|
13
14
|
export {default as Switch} from './Switch/styles';
|
|
14
15
|
export {default as Popover} from './Popover/styles';
|