agroptima-design-system 0.25.1 → 0.25.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/src/atoms/Icon.tsx +9 -1
- package/src/atoms/Multiselect.tsx +40 -17
- package/src/atoms/QuantitySelector.scss +1 -1
- package/src/atoms/Select.scss +28 -4
- package/src/atoms/Select.tsx +18 -1
- package/src/stories/Changelog.mdx +10 -0
- package/tests/Multiselect.spec.tsx +35 -1
- package/tests/Select.spec.tsx +33 -0
- package/src/atoms/Multiselect.scss +0 -153
package/package.json
CHANGED
package/src/atoms/Icon.tsx
CHANGED
|
@@ -8,9 +8,17 @@ export interface IconProps extends React.SVGAttributes<HTMLOrSVGElement> {
|
|
|
8
8
|
name: IconType
|
|
9
9
|
className?: string
|
|
10
10
|
title?: string
|
|
11
|
+
visible?: boolean
|
|
11
12
|
}
|
|
12
13
|
|
|
13
|
-
export const Icon: React.FC<IconProps> = ({
|
|
14
|
+
export const Icon: React.FC<IconProps> = ({
|
|
15
|
+
name,
|
|
16
|
+
className,
|
|
17
|
+
visible = true,
|
|
18
|
+
...props
|
|
19
|
+
}) => {
|
|
20
|
+
if (!visible) return null
|
|
21
|
+
|
|
14
22
|
const cssClasses = classNames('icon', className, {
|
|
15
23
|
rotate: name === 'Loading',
|
|
16
24
|
})
|
|
@@ -1,14 +1,19 @@
|
|
|
1
|
-
import './
|
|
1
|
+
import './Select.scss'
|
|
2
2
|
import React, { useState } from 'react'
|
|
3
3
|
import { Icon } from './Icon'
|
|
4
|
+
import { IconButton } from './Button'
|
|
4
5
|
import { classNames } from '../utils/classNames'
|
|
5
6
|
import { buildHelpText } from '../utils/buildHelpText'
|
|
6
7
|
|
|
7
8
|
export type Variant = 'primary'
|
|
8
9
|
export type Option = { id: string; label: string }
|
|
9
10
|
|
|
10
|
-
|
|
11
|
-
|
|
11
|
+
type InputPropsWithoutOnChange = Omit<
|
|
12
|
+
React.ComponentPropsWithoutRef<'input'>,
|
|
13
|
+
'onChange'
|
|
14
|
+
>
|
|
15
|
+
|
|
16
|
+
export interface MultiselectProps extends InputPropsWithoutOnChange {
|
|
12
17
|
placeholder?: string
|
|
13
18
|
helpText?: string
|
|
14
19
|
variant?: Variant
|
|
@@ -19,6 +24,7 @@ export interface MultiselectProps
|
|
|
19
24
|
selectedLabel?: string
|
|
20
25
|
hideLabel?: boolean
|
|
21
26
|
defaultValue?: string[]
|
|
27
|
+
onChange?: (value: string[]) => void
|
|
22
28
|
}
|
|
23
29
|
|
|
24
30
|
export function Multiselect({
|
|
@@ -31,6 +37,7 @@ export function Multiselect({
|
|
|
31
37
|
options,
|
|
32
38
|
label,
|
|
33
39
|
accessibilityLabel,
|
|
40
|
+
onChange,
|
|
34
41
|
variant = 'primary',
|
|
35
42
|
selectedLabel = 'items selected',
|
|
36
43
|
hideLabel = false,
|
|
@@ -40,9 +47,10 @@ export function Multiselect({
|
|
|
40
47
|
const helpTexts = buildHelpText(helpText, errors)
|
|
41
48
|
const [showOptionsList, setShowOptionsList] = useState(false)
|
|
42
49
|
const [selectedOptions, setSelectedOptions] = useState<string[]>(defaultValue)
|
|
50
|
+
const hasSelectedOptions = selectedOptions.length > 0
|
|
43
51
|
const cssClasses = classNames('selected-option', className, {
|
|
44
52
|
open: showOptionsList,
|
|
45
|
-
filled:
|
|
53
|
+
filled: hasSelectedOptions,
|
|
46
54
|
disabled: disabled,
|
|
47
55
|
invalid: errors?.length,
|
|
48
56
|
})
|
|
@@ -53,12 +61,12 @@ export function Multiselect({
|
|
|
53
61
|
|
|
54
62
|
function selectOption(id: string) {
|
|
55
63
|
const isOptionSelected = selectedOptions.includes(id)
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
64
|
+
const options = isOptionSelected
|
|
65
|
+
? selectedOptions.filter((optionId) => optionId !== id)
|
|
66
|
+
: [...selectedOptions, id]
|
|
67
|
+
|
|
68
|
+
setSelectedOptions(options)
|
|
69
|
+
if (onChange !== undefined) onChange(options)
|
|
62
70
|
}
|
|
63
71
|
|
|
64
72
|
function handleBlur(event: React.FocusEvent<HTMLDivElement>) {
|
|
@@ -68,10 +76,15 @@ export function Multiselect({
|
|
|
68
76
|
}
|
|
69
77
|
}
|
|
70
78
|
|
|
79
|
+
function handleClear(event: React.MouseEvent<HTMLButtonElement>) {
|
|
80
|
+
event.stopPropagation()
|
|
81
|
+
setSelectedOptions([])
|
|
82
|
+
}
|
|
83
|
+
|
|
71
84
|
return (
|
|
72
|
-
<div className={`
|
|
73
|
-
{!hideLabel && <span className="
|
|
74
|
-
<div className="
|
|
85
|
+
<div className={`select-group ${variant}`}>
|
|
86
|
+
{!hideLabel && <span className="select-label">{label}</span>}
|
|
87
|
+
<div className="select-container" onBlur={handleBlur}>
|
|
75
88
|
<div
|
|
76
89
|
className={cssClasses}
|
|
77
90
|
tabIndex={0}
|
|
@@ -81,14 +94,24 @@ export function Multiselect({
|
|
|
81
94
|
role="alert"
|
|
82
95
|
>
|
|
83
96
|
<span>
|
|
84
|
-
{
|
|
97
|
+
{hasSelectedOptions
|
|
85
98
|
? `${selectedOptions.length} ${selectedLabel}`
|
|
86
99
|
: placeholder}
|
|
87
100
|
</span>
|
|
88
|
-
<Icon
|
|
101
|
+
<Icon
|
|
102
|
+
name={showOptionsList ? 'AngleUp' : 'AngleDown'}
|
|
103
|
+
visible={!hasSelectedOptions}
|
|
104
|
+
/>
|
|
105
|
+
<IconButton
|
|
106
|
+
icon="Close"
|
|
107
|
+
className="clear-button"
|
|
108
|
+
accessibilityLabel="close"
|
|
109
|
+
onClick={handleClear}
|
|
110
|
+
visible={hasSelectedOptions}
|
|
111
|
+
/>
|
|
89
112
|
</div>
|
|
90
113
|
{showOptionsList && (
|
|
91
|
-
<ul className="
|
|
114
|
+
<ul className="select-options" role="listbox">
|
|
92
115
|
{options.map((option) => (
|
|
93
116
|
<Option
|
|
94
117
|
key={`${name}-${option.id}`}
|
|
@@ -101,7 +124,7 @@ export function Multiselect({
|
|
|
101
124
|
)}
|
|
102
125
|
</div>
|
|
103
126
|
{helpTexts.map((helpText) => (
|
|
104
|
-
<span key={`${name}-${helpText}`} className="
|
|
127
|
+
<span key={`${name}-${helpText}`} className="select-help-text">
|
|
105
128
|
{helpText}
|
|
106
129
|
</span>
|
|
107
130
|
))}
|
package/src/atoms/Select.scss
CHANGED
|
@@ -14,6 +14,11 @@
|
|
|
14
14
|
}
|
|
15
15
|
}
|
|
16
16
|
|
|
17
|
+
.clear-button > .icon {
|
|
18
|
+
width: config.$icon-size-3x;
|
|
19
|
+
height: config.$icon-size-3x;
|
|
20
|
+
}
|
|
21
|
+
|
|
17
22
|
&.primary {
|
|
18
23
|
.select-label {
|
|
19
24
|
@include typography.form-label;
|
|
@@ -82,6 +87,20 @@
|
|
|
82
87
|
&:hover {
|
|
83
88
|
background-color: color_alias.$primary-color-50;
|
|
84
89
|
}
|
|
90
|
+
> .icon {
|
|
91
|
+
> svg {
|
|
92
|
+
border-radius: config.$corner-radius-xxs;
|
|
93
|
+
.checkbox-active_svg__border {
|
|
94
|
+
fill: color_alias.$primary-color-600;
|
|
95
|
+
}
|
|
96
|
+
.checkbox-active_svg__background {
|
|
97
|
+
fill: color_alias.$primary-color-600;
|
|
98
|
+
}
|
|
99
|
+
.checkbox-inactive_svg__border {
|
|
100
|
+
fill: color_alias.$neutral-color-600;
|
|
101
|
+
}
|
|
102
|
+
}
|
|
103
|
+
}
|
|
85
104
|
}
|
|
86
105
|
}
|
|
87
106
|
|
|
@@ -106,14 +125,11 @@
|
|
|
106
125
|
> .icon {
|
|
107
126
|
width: config.$icon-size-3x;
|
|
108
127
|
height: config.$icon-size-3x;
|
|
109
|
-
> svg {
|
|
110
|
-
width: 100%;
|
|
111
|
-
height: 100%;
|
|
112
|
-
}
|
|
113
128
|
}
|
|
114
129
|
}
|
|
115
130
|
|
|
116
131
|
.select-options {
|
|
132
|
+
z-index: depth.$z-dropdown-options;
|
|
117
133
|
margin: 0;
|
|
118
134
|
padding: config.$space-1x 0rem;
|
|
119
135
|
text-align: left;
|
|
@@ -121,9 +137,17 @@
|
|
|
121
137
|
width: 100%;
|
|
122
138
|
|
|
123
139
|
.option {
|
|
140
|
+
display: flex;
|
|
141
|
+
align-items: center;
|
|
124
142
|
cursor: default;
|
|
125
143
|
list-style-type: none;
|
|
126
144
|
padding: config.$space-2x config.$space-3x;
|
|
145
|
+
|
|
146
|
+
> .icon {
|
|
147
|
+
width: config.$icon-size-4x;
|
|
148
|
+
height: config.$icon-size-4x;
|
|
149
|
+
margin-right: config.$space-1x;
|
|
150
|
+
}
|
|
127
151
|
}
|
|
128
152
|
}
|
|
129
153
|
}
|
package/src/atoms/Select.tsx
CHANGED
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import './Select.scss'
|
|
2
2
|
import React, { useState } from 'react'
|
|
3
3
|
import { Icon } from './Icon'
|
|
4
|
+
import { IconButton } from './Button'
|
|
4
5
|
import { classNames } from '../utils/classNames'
|
|
5
6
|
import { buildHelpText } from '../utils/buildHelpText'
|
|
6
7
|
|
|
@@ -47,6 +48,7 @@ export function Select({
|
|
|
47
48
|
const defaultOption =
|
|
48
49
|
options.find((option) => option.id === defaultValue) || EMPTY_OPTION
|
|
49
50
|
const [selectedOption, setSelectedOption] = useState<Option>(defaultOption)
|
|
51
|
+
const isEmpty = selectedOption.id === EMPTY_OPTION.id
|
|
50
52
|
|
|
51
53
|
const cssClasses = classNames('selected-option', {
|
|
52
54
|
open: showOptionsList,
|
|
@@ -73,6 +75,11 @@ export function Select({
|
|
|
73
75
|
}
|
|
74
76
|
}
|
|
75
77
|
|
|
78
|
+
function handleClear(event: React.MouseEvent<HTMLButtonElement>) {
|
|
79
|
+
event.stopPropagation()
|
|
80
|
+
setSelectedOption(EMPTY_OPTION)
|
|
81
|
+
}
|
|
82
|
+
|
|
76
83
|
return (
|
|
77
84
|
<div className={classNames('select-group', variant, className)}>
|
|
78
85
|
{!hideLabel && <span className="select-label">{label}</span>}
|
|
@@ -86,7 +93,17 @@ export function Select({
|
|
|
86
93
|
role="alert"
|
|
87
94
|
>
|
|
88
95
|
<span>{selectedOption.label || placeholder}</span>
|
|
89
|
-
<Icon
|
|
96
|
+
<Icon
|
|
97
|
+
name={showOptionsList ? 'AngleUp' : 'AngleDown'}
|
|
98
|
+
visible={isEmpty}
|
|
99
|
+
/>
|
|
100
|
+
<IconButton
|
|
101
|
+
icon="Close"
|
|
102
|
+
className="clear-button"
|
|
103
|
+
accessibilityLabel="close"
|
|
104
|
+
onClick={handleClear}
|
|
105
|
+
visible={!isEmpty}
|
|
106
|
+
/>
|
|
90
107
|
</div>
|
|
91
108
|
{showOptionsList && (
|
|
92
109
|
<ul className="select-options" role="listbox">
|
|
@@ -4,6 +4,16 @@ import { Meta } from "@storybook/blocks";
|
|
|
4
4
|
|
|
5
5
|
# Changelog
|
|
6
6
|
|
|
7
|
+
# 0.25.3
|
|
8
|
+
|
|
9
|
+
* Add clear button to Select commponent
|
|
10
|
+
* Add clear button to Multiselect component
|
|
11
|
+
|
|
12
|
+
# 0.25.2
|
|
13
|
+
|
|
14
|
+
* Add onChange prop to Multiselect component
|
|
15
|
+
* Add max height to Multiselect component
|
|
16
|
+
|
|
7
17
|
# 0.25.1
|
|
8
18
|
|
|
9
19
|
* Replace selected prop by defaultValue in Multiselect component
|
|
@@ -2,6 +2,7 @@ import React from 'react'
|
|
|
2
2
|
import { render, screen } from '@testing-library/react'
|
|
3
3
|
import userEvent from '@testing-library/user-event'
|
|
4
4
|
import { Multiselect } from '@/atoms/Multiselect'
|
|
5
|
+
import { Placeholder } from 'storybook/internal/components'
|
|
5
6
|
|
|
6
7
|
describe('Multiselect', () => {
|
|
7
8
|
it('renders', async () => {
|
|
@@ -32,7 +33,7 @@ describe('Multiselect', () => {
|
|
|
32
33
|
/>,
|
|
33
34
|
)
|
|
34
35
|
|
|
35
|
-
expect(getAllByRole('generic')[1]).toHaveClass('
|
|
36
|
+
expect(getAllByRole('generic')[1]).toHaveClass('select-group primary')
|
|
36
37
|
expect(getByText('Videogames')).toBeInTheDocument()
|
|
37
38
|
expect(getByText(/Select your favourite videogames.../)).toBeInTheDocument()
|
|
38
39
|
expect(getByText(/This text can help you/i)).toBeInTheDocument()
|
|
@@ -111,4 +112,37 @@ describe('Multiselect', () => {
|
|
|
111
112
|
expect(getByText(/error1/i)).toBeInTheDocument()
|
|
112
113
|
expect(getByText(/error2/i)).toBeInTheDocument()
|
|
113
114
|
})
|
|
115
|
+
it('clears options selected', async () => {
|
|
116
|
+
const user = userEvent.setup()
|
|
117
|
+
const placeholder = 'Select your favourite videogames...'
|
|
118
|
+
const { getByText } = render(
|
|
119
|
+
<Multiselect
|
|
120
|
+
helpText="This text can help you"
|
|
121
|
+
label="Videogames"
|
|
122
|
+
name="videogames"
|
|
123
|
+
options={[
|
|
124
|
+
{
|
|
125
|
+
id: '1',
|
|
126
|
+
label: 'The Legend of Zelda: Ocarina of Time',
|
|
127
|
+
},
|
|
128
|
+
{
|
|
129
|
+
id: '2',
|
|
130
|
+
label: 'Spyro the Dragon',
|
|
131
|
+
},
|
|
132
|
+
{
|
|
133
|
+
id: '3',
|
|
134
|
+
label: 'Halo',
|
|
135
|
+
},
|
|
136
|
+
]}
|
|
137
|
+
placeholder={placeholder}
|
|
138
|
+
defaultValue={['2', '1']}
|
|
139
|
+
selectedLabel="videogames selected"
|
|
140
|
+
variant="primary"
|
|
141
|
+
/>,
|
|
142
|
+
)
|
|
143
|
+
|
|
144
|
+
await user.click(screen.getByRole('button', { name: /close/i }))
|
|
145
|
+
|
|
146
|
+
expect(getByText(placeholder)).toBeInTheDocument()
|
|
147
|
+
})
|
|
114
148
|
})
|
package/tests/Select.spec.tsx
CHANGED
|
@@ -118,4 +118,37 @@ describe('Select', () => {
|
|
|
118
118
|
expect(getByText(/error1/i)).toBeInTheDocument()
|
|
119
119
|
expect(getByText(/error2/i)).toBeInTheDocument()
|
|
120
120
|
})
|
|
121
|
+
it('clears option selected', async () => {
|
|
122
|
+
const user = userEvent.setup()
|
|
123
|
+
const placeholder = 'Select your favourite gaming system...'
|
|
124
|
+
const { getByText } = render(
|
|
125
|
+
<Select
|
|
126
|
+
defaultValue="2"
|
|
127
|
+
helpText="This text can help you"
|
|
128
|
+
id="select-videogames"
|
|
129
|
+
label="Videogames"
|
|
130
|
+
name="example"
|
|
131
|
+
options={[
|
|
132
|
+
{
|
|
133
|
+
id: '1',
|
|
134
|
+
label: 'Nintendo Switch',
|
|
135
|
+
},
|
|
136
|
+
{
|
|
137
|
+
id: '2',
|
|
138
|
+
label: 'PlayStation 5',
|
|
139
|
+
},
|
|
140
|
+
{
|
|
141
|
+
id: '3',
|
|
142
|
+
label: 'Xbox Series S/X',
|
|
143
|
+
},
|
|
144
|
+
]}
|
|
145
|
+
placeholder={placeholder}
|
|
146
|
+
variant="primary"
|
|
147
|
+
/>,
|
|
148
|
+
)
|
|
149
|
+
|
|
150
|
+
await user.click(screen.getByRole('button', { name: /close/i }))
|
|
151
|
+
|
|
152
|
+
expect(getByText(placeholder)).toBeInTheDocument()
|
|
153
|
+
})
|
|
121
154
|
})
|
|
@@ -1,153 +0,0 @@
|
|
|
1
|
-
@use '../settings/color_alias';
|
|
2
|
-
@use '../settings/typography/form' as typography;
|
|
3
|
-
@use '../settings/config';
|
|
4
|
-
@use '../settings/depth';
|
|
5
|
-
|
|
6
|
-
.multiselect-group {
|
|
7
|
-
display: flex;
|
|
8
|
-
flex-direction: column;
|
|
9
|
-
gap: config.$space-2x;
|
|
10
|
-
|
|
11
|
-
&:has(.selected-option.invalid) {
|
|
12
|
-
& .multiselect-help-text {
|
|
13
|
-
@include typography.form-help-text-error;
|
|
14
|
-
}
|
|
15
|
-
}
|
|
16
|
-
|
|
17
|
-
&.primary {
|
|
18
|
-
.multiselect-label {
|
|
19
|
-
@include typography.form-label;
|
|
20
|
-
}
|
|
21
|
-
|
|
22
|
-
.selected-option {
|
|
23
|
-
border-radius: config.$corner-radius-m;
|
|
24
|
-
border: 1px solid color_alias.$neutral-color-600;
|
|
25
|
-
background: color_alias.$neutral-white;
|
|
26
|
-
@include typography.select-text;
|
|
27
|
-
|
|
28
|
-
> .icon {
|
|
29
|
-
> svg {
|
|
30
|
-
fill: color_alias.$primary-color-600;
|
|
31
|
-
path {
|
|
32
|
-
fill: color_alias.$primary-color-600;
|
|
33
|
-
}
|
|
34
|
-
}
|
|
35
|
-
}
|
|
36
|
-
|
|
37
|
-
&.filled {
|
|
38
|
-
@include typography.select-option-text;
|
|
39
|
-
}
|
|
40
|
-
|
|
41
|
-
&:focus {
|
|
42
|
-
outline: color_alias.$primary-color-600;
|
|
43
|
-
border: 1px solid color_alias.$primary-color-600;
|
|
44
|
-
}
|
|
45
|
-
|
|
46
|
-
&.invalid {
|
|
47
|
-
border: 1px solid color_alias.$error-color-1000;
|
|
48
|
-
}
|
|
49
|
-
|
|
50
|
-
&.disabled {
|
|
51
|
-
border: 1px solid color_alias.$neutral-color-400;
|
|
52
|
-
background: color_alias.$neutral-color-50;
|
|
53
|
-
color: color_alias.$neutral-color-400;
|
|
54
|
-
|
|
55
|
-
> .icon {
|
|
56
|
-
> svg {
|
|
57
|
-
fill: color_alias.$neutral-color-400;
|
|
58
|
-
path {
|
|
59
|
-
fill: color_alias.$neutral-color-400;
|
|
60
|
-
}
|
|
61
|
-
}
|
|
62
|
-
}
|
|
63
|
-
}
|
|
64
|
-
}
|
|
65
|
-
|
|
66
|
-
.multiselect-options {
|
|
67
|
-
border-radius: config.$corner-radius-xxs;
|
|
68
|
-
background: color_alias.$neutral-white;
|
|
69
|
-
box-shadow:
|
|
70
|
-
0px 9px 28px 8px rgba(0, 0, 0, 0.05),
|
|
71
|
-
0px 6px 16px 0px rgba(0, 0, 0, 0.08),
|
|
72
|
-
0px 3px 6px -4px rgba(0, 0, 0, 0.12);
|
|
73
|
-
|
|
74
|
-
.option {
|
|
75
|
-
background: color_alias.$neutral-white;
|
|
76
|
-
@include typography.select-option-text;
|
|
77
|
-
|
|
78
|
-
&:hover {
|
|
79
|
-
background-color: color_alias.$primary-color-50;
|
|
80
|
-
}
|
|
81
|
-
|
|
82
|
-
> .icon {
|
|
83
|
-
> svg {
|
|
84
|
-
border-radius: config.$corner-radius-xxs;
|
|
85
|
-
.checkbox-active_svg__border {
|
|
86
|
-
fill: color_alias.$primary-color-600;
|
|
87
|
-
}
|
|
88
|
-
.checkbox-active_svg__background {
|
|
89
|
-
fill: color_alias.$primary-color-600;
|
|
90
|
-
}
|
|
91
|
-
.checkbox-inactive_svg__border {
|
|
92
|
-
fill: color_alias.$neutral-color-600;
|
|
93
|
-
}
|
|
94
|
-
}
|
|
95
|
-
}
|
|
96
|
-
}
|
|
97
|
-
}
|
|
98
|
-
|
|
99
|
-
.multiselect-help-text {
|
|
100
|
-
@include typography.form-help-text;
|
|
101
|
-
}
|
|
102
|
-
}
|
|
103
|
-
|
|
104
|
-
.multiselect-container {
|
|
105
|
-
display: inline-block;
|
|
106
|
-
text-align: left;
|
|
107
|
-
position: relative;
|
|
108
|
-
}
|
|
109
|
-
|
|
110
|
-
.selected-option {
|
|
111
|
-
display: flex;
|
|
112
|
-
justify-content: space-between;
|
|
113
|
-
align-items: center;
|
|
114
|
-
padding: config.$space-2x config.$space-3x;
|
|
115
|
-
cursor: default;
|
|
116
|
-
|
|
117
|
-
> .icon {
|
|
118
|
-
width: config.$icon-size-3x;
|
|
119
|
-
height: config.$icon-size-3x;
|
|
120
|
-
> svg {
|
|
121
|
-
width: 100%;
|
|
122
|
-
height: 100%;
|
|
123
|
-
}
|
|
124
|
-
}
|
|
125
|
-
}
|
|
126
|
-
|
|
127
|
-
.multiselect-options {
|
|
128
|
-
z-index: depth.$z-dropdown-options;
|
|
129
|
-
margin: 0;
|
|
130
|
-
padding: config.$space-1x 0rem;
|
|
131
|
-
text-align: left;
|
|
132
|
-
position: absolute;
|
|
133
|
-
width: 100%;
|
|
134
|
-
|
|
135
|
-
.option {
|
|
136
|
-
display: flex;
|
|
137
|
-
align-items: center;
|
|
138
|
-
cursor: default;
|
|
139
|
-
list-style-type: none;
|
|
140
|
-
padding: config.$space-2x config.$space-3x;
|
|
141
|
-
|
|
142
|
-
> .icon {
|
|
143
|
-
width: config.$icon-size-4x;
|
|
144
|
-
height: config.$icon-size-4x;
|
|
145
|
-
margin-right: config.$space-1x;
|
|
146
|
-
> svg {
|
|
147
|
-
width: 100%;
|
|
148
|
-
height: 100%;
|
|
149
|
-
}
|
|
150
|
-
}
|
|
151
|
-
}
|
|
152
|
-
}
|
|
153
|
-
}
|