Skip to content

Commit 7fc54f4

Browse files
committed
add new Checkbox component
1 parent 1f83bad commit 7fc54f4

File tree

2 files changed

+94
-0
lines changed

2 files changed

+94
-0
lines changed
Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
import { Checkbox, type CheckboxProps } from "react-aria-components";
2+
import styles from './checkbox.module.scss'
3+
4+
export function CheckboxComponent({
5+
children,
6+
...props
7+
}: Omit<CheckboxProps, "children"> & {
8+
children?: React.ReactNode;
9+
}) {
10+
return (
11+
<Checkbox {...props} className={styles.checkbox__component}>
12+
{({ isIndeterminate }) => (
13+
<>
14+
<div className={styles.checkbox}>
15+
<svg viewBox="0 0 18 18" aria-hidden="true">
16+
{isIndeterminate ? (
17+
<rect x={1} y={7.5} width={15} height={3} />
18+
) : (
19+
<polyline points="1 9 7 14 15 4" />
20+
)}
21+
</svg>
22+
</div>
23+
{children}
24+
</>
25+
)}
26+
</Checkbox>
27+
);
28+
}
Lines changed: 66 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,66 @@
1+
.checkbox__component {
2+
--selected-color: var(--color_bg_state_success);
3+
--selected-color-pressed: var(--color_fg_on_state_success_subtle);
4+
--checkmark-color: var(--color_border_state_success);
5+
6+
display: flex;
7+
/* This is needed so the HiddenInput is positioned correctly */
8+
position: relative;
9+
align-items: center;
10+
gap: 0.571rem;
11+
font-size: 1.143rem;
12+
color: white;
13+
forced-color-adjust: none;
14+
15+
.checkbox {
16+
width: 1.143rem;
17+
height: 1.143rem;
18+
border: 2px solid var(--color_fg_default);
19+
border-radius: 4px;
20+
transition: all 200ms;
21+
display: flex;
22+
align-items: center;
23+
justify-content: center;
24+
flex-shrink: 0;
25+
}
26+
27+
svg {
28+
width: 1rem;
29+
height: 1rem;
30+
fill: none;
31+
stroke: var(--functional-gray-0);
32+
stroke-width: 3px;
33+
stroke-dasharray: 22px;
34+
stroke-dashoffset: 66;
35+
transition: all 200ms;
36+
}
37+
38+
&[data-focus-visible] .checkbox {
39+
outline: 2px solid var(--color_fg_selected);
40+
outline-offset: 2px;
41+
}
42+
43+
&[data-selected],
44+
&[data-indeterminate] {
45+
.checkbox {
46+
border-color: var(--selected-color);
47+
background: var(--selected-color);
48+
}
49+
50+
&[data-pressed] .checkbox {
51+
border-color: var(--selected-color-pressed);
52+
background: var(--selected-color-pressed);
53+
}
54+
55+
svg {
56+
stroke-dashoffset: 44;
57+
}
58+
}
59+
60+
&[data-indeterminate] {
61+
& svg {
62+
stroke: none;
63+
fill: var(--checkmark-color);
64+
}
65+
}
66+
}

0 commit comments

Comments
 (0)