Skip to content
This repository was archived by the owner on Jun 20, 2022. It is now read-only.

Commit f26186c

Browse files
ividicgregberge
authored andcommitted
feat: add control option to Checkbox (#102)
1 parent 2dad70f commit f26186c

File tree

2 files changed

+89
-4
lines changed

2 files changed

+89
-4
lines changed

docs/components/Checkbox.mdx

Lines changed: 42 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -18,20 +18,20 @@ Set sizes using `size` prop like `"sm"`, `"md"` or `"lg"`.
1818
<Checkbox
1919
size="sm"
2020
id="sizeCheckbox1"
21-
name="sizeCheckboxs"
21+
name="sizeCheckboxes"
2222
value="option1"
2323
/>
2424
<FormCheckLabel htmlFor="sizeCheckbox1">Small</FormCheckLabel>
2525
</FormCheck>
2626
<FormCheck>
27-
<Checkbox id="sizeCheckbox2" name="sizeCheckboxs" value="option2" />
27+
<Checkbox id="sizeCheckbox2" name="sizeCheckboxes" value="option2" />
2828
<FormCheckLabel htmlFor="sizeCheckbox2">Medium</FormCheckLabel>
2929
</FormCheck>
3030
<FormCheck>
3131
<Checkbox
3232
size="lg"
3333
id="sizeCheckbox3"
34-
name="sizeCheckboxs"
34+
name="sizeCheckboxes"
3535
value="option3"
3636
/>
3737
<FormCheckLabel htmlFor="sizeCheckbox3">Large</FormCheckLabel>
@@ -54,16 +54,55 @@ Disable using `disabled` prop.
5454
</FormCheck>
5555
</Playground>
5656

57+
## Control & Validation
58+
59+
* Set `display` to "block" and `width` to "100%" using `control` prop.
60+
* Set validation using `valid` or `valid={false}`
61+
62+
<Playground>
63+
<FormCheck>
64+
<Checkbox
65+
id="controlCheckbox1"
66+
name="controlCheckboxes"
67+
value="option1"
68+
control
69+
/>
70+
<FormCheckLabel htmlFor="controlCheckbox1">Control</FormCheckLabel>
71+
</FormCheck>
72+
<FormCheck>
73+
<Checkbox
74+
id="controlCheckbox2"
75+
name="controlCheckboxes"
76+
value="option2"
77+
control
78+
valid
79+
/>
80+
<FormCheckLabel htmlFor="controlCheckbox2">Valid Control</FormCheckLabel>
81+
</FormCheck>
82+
<FormCheck>
83+
<Checkbox
84+
id="controlCheckbox3"
85+
name="controlCheckboxes"
86+
value="option3"
87+
control
88+
valid={false}
89+
/>
90+
<FormCheckLabel htmlFor="controlCheckbox3">Invalid Control</FormCheckLabel>
91+
</FormCheck>
92+
</Playground>
93+
5794
## API
5895

5996
### Checkbox
6097

6198
<PropsTable
6299
of={PropDesc({
63100
checked: PropDesc.bool,
101+
control: PropDesc.bool,
64102
disabled: PropDesc.bool,
65103
onChange: PropDesc.func,
66104
size: PropDesc.oneOf(['sm', 'lg']),
105+
valid: PropDesc.bool,
67106
value: PropDesc.string,
68107
...getSystemPropDesc(Checkbox),
69108
})}

packages/shared/core/Checkbox.js

Lines changed: 47 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -54,6 +54,48 @@ const sizeStyle = {
5454
`,
5555
}
5656

57+
const validStyle = css`
58+
input + .sui-checkbox-content,
59+
input:checked + .sui-checkbox-content {
60+
border-color: ${th('success')};
61+
}
62+
63+
input:focus + .sui-checkbox-content {
64+
border-color: ${th('success')};
65+
box-shadow: ${mixin('controlFocusBoxShadow', 'success')};
66+
}
67+
`
68+
69+
const invalidStyle = css`
70+
input + .sui-checkbox-content,
71+
input:checked + .sui-checkbox-content {
72+
border-color: ${th('danger')};
73+
}
74+
75+
input:focus + .sui-checkbox-content {
76+
border-color: ${th('danger')};
77+
box-shadow: ${mixin('controlFocusBoxShadow', 'danger')};
78+
}
79+
`
80+
81+
const controlStyle = css`
82+
input:focus + .sui-checkbox-content {
83+
border-color: ${th('controlFocusBorderColor')};
84+
box-shadow: ${mixin('controlFocusBoxShadow', 'primary')};
85+
}
86+
87+
${p => {
88+
switch (p.valid) {
89+
case true:
90+
return validStyle
91+
case false:
92+
return invalidStyle
93+
default:
94+
return null
95+
}
96+
}};
97+
`
98+
5799
const containerSystem = compose(
58100
basics,
59101
dimensions,
@@ -75,6 +117,7 @@ const system = compose(
75117

76118
const Checkbox = createComponent(() => ({
77119
name: 'checkbox',
120+
omitProps: ['control', 'valid'],
78121
system,
79122
applySystem: null,
80123
render: ({ Component, ref, className, size, ...props }) => (
@@ -134,7 +177,7 @@ const Checkbox = createComponent(() => ({
134177
}
135178
}
136179
137-
input:focused + .sui-checkbox-content {
180+
input:focus + .sui-checkbox-content {
138181
${mixin('controlFocus')};
139182
}
140183
@@ -143,6 +186,7 @@ const Checkbox = createComponent(() => ({
143186
}
144187
145188
${p => sizeStyle[p.size]};
189+
${p => p.control && controlStyle};
146190
147191
${containerSystem.props};
148192
@@ -152,9 +196,11 @@ const Checkbox = createComponent(() => ({
152196
`,
153197
propTypes: {
154198
checked: PropTypes.bool,
199+
control: PropTypes.bool,
155200
disabled: PropTypes.bool,
156201
onChange: PropTypes.func,
157202
size: PropTypes.oneOf(['sm', 'md', 'lg']),
203+
valid: PropTypes.bool,
158204
value: PropTypes.string,
159205
},
160206
defaultProps: {

0 commit comments

Comments
 (0)