Skip to content
This repository has been archived by the owner on Dec 29, 2022. It is now read-only.

Lukebailey/infra 386 create a a11y checkbox #53

Open
wants to merge 32 commits into
base: main
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from 7 commits
Commits
Show all changes
32 commits
Select commit Hold shift + click to select a range
17cffa8
feat: add react-aria and react-stately
lukerohanbailey Jan 5, 2022
23e5e0d
feat: add simple react-aria checkbox
lukerohanbailey Jan 5, 2022
e254aa5
feat: add simple checkbox story
lukerohanbailey Jan 5, 2022
1ce89d5
feat: add disabled and enabled checkbox styles
lukerohanbailey Jan 5, 2022
5c819c1
feat: add state styling to checkbox
lukerohanbailey Jan 5, 2022
d86c95d
style: update All Checkbox component name to Checkbox States
lukerohanbailey Jan 5, 2022
59efa9f
fix: update autoFocus attribute element to match the order on figma
lukerohanbailey Jan 5, 2022
c66b5cd
chore: move stitches to devdependencies
lukerohanbailey Jan 6, 2022
ca95774
fix: add react-aria and react-stately to build-cjs
lukerohanbailey Jan 6, 2022
0a41a35
feat: add aria-label to checkbox
lukerohanbailey Jan 6, 2022
93013ed
chore: add onChange handler to checkbox
lukerohanbailey Jan 6, 2022
177e1c9
build: add gsap to project
lukerohanbailey Jan 7, 2022
4f84d58
feat: add basic gsap setup and microinteraction to checkbox
lukerohanbailey Jan 7, 2022
3c53864
build: add .vscode to .gitignore
lukerohanbailey Jan 7, 2022
dac2cfd
fix: remove GSAPTimeline type import
lukerohanbailey Jan 7, 2022
969c328
feat: add animatiable check icon
lukerohanbailey Jan 9, 2022
ab4d3dc
feat: animate checkbox check icon based on isSelected state
lukerohanbailey Jan 9, 2022
7bf7cdd
feat: improve checkbox animation timings
lukerohanbailey Jan 10, 2022
fc43aa6
Merge branch 'lukebailey/infra-387-explore-and-create-a-micro-interac…
lukerohanbailey Jan 11, 2022
9d2b028
fix: destructure checkbox types from ComponentPropsWithRef, CheckboxP…
lukerohanbailey Jan 11, 2022
6786ee4
fix: invalid styling
lukerohanbailey Jan 11, 2022
661b8d3
Merge branch 'lukebailey/infra-386-create-a-a11y-checkbox' into lukeb…
lukerohanbailey Jan 11, 2022
aa97e6c
fix: aria-label console warnings
lukerohanbailey Jan 11, 2022
8b505fa
feat: update checkbox animation timings
lukerohanbailey Jan 11, 2022
f4a25d7
Merge branch 'lukebailey/infra-387-explore-and-create-a-micro-interac…
lukerohanbailey Jan 11, 2022
965235e
style: destructure ToggleProps from useToggleState hook
lukerohanbailey Jan 11, 2022
8d2a0f1
fix: move check timeline play call to a useEffect hook
lukerohanbailey Jan 12, 2022
5c060e9
fix: type naming conventions and allow label to accept any ReactNode
lukerohanbailey Jan 13, 2022
55ab973
fix: remove .vscode/ from .gitignore
lukerohanbailey Jan 13, 2022
e8cf1a9
feat: replace gsap animations with CSS transitions
lukerohanbailey Jan 14, 2022
dce6b65
fix: remove restprops usage
lukerohanbailey Jan 14, 2022
4280b21
fix: prevent pressed stateon disabled checkboxes
lukerohanbailey Jan 14, 2022
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
4 changes: 3 additions & 1 deletion package.json
Original file line number Diff line number Diff line change
Expand Up @@ -85,6 +85,8 @@
"react": "^16.14.0 || ^17.0.0"
},
"dependencies": {
"@stitches/react": "^1.2.5"
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I see we moved this from dependencies to devDependencies. If we are going to do this, then we need to add @stitches/react to peerDependencies which would constitute a major/breaking change.

"@stitches/react": "^1.2.5",
"react-aria": "^3.12.0",
"react-stately": "^3.11.0"
}
}
90 changes: 90 additions & 0 deletions src/components/Checkbox.tsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,90 @@
import { useRef } from 'react';
import { useCheckbox } from 'react-aria';
import { useToggleState } from 'react-stately';
import { styled } from '../../stitches.config';
import { Check16pxIcon } from '../icons';

const Label = styled('label', {
'& input:checked:disabled + div': {
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

What are we needing to target specifically with div here? Can we tighten this to reference IconContainer specifically?

color: '$gray50',
},
display: 'block',
position: 'relative',
});

const Input = styled('input', {
'&:checked': {
backgroundColor: '$brandYellow',
borderColor: '$brandYellow',
},
'&:checked&:disabled': {
backgroundColor: '$yellow20',
borderColor: '$yellow20',
},
'&:disabled': {
borderColor: '$gray30',
},
'&:focus': {
outline: '2px solid $brandYellow',
outlineOffset: '2px',
},
'&:indeterminate': {
borderColor: '$brandYellow',
position: 'relative',
},
'&:indeterminate:after': {
backgroundColor: '$brandYellow',
content: '""',
height: '12px',
left: '50%',
position: 'absolute',
top: '50%',
transform: 'translate(-50%, -50%)',
width: '12px',
},
'&[aria-invalid="true"]': {
borderColor: '$uiErrorRegular',
},
appearance: 'none',
backgroundColor: '$brandWhite',
borderColor: '$gray50',
borderRadius: '$4',
borderStyle: '$solid',
borderWidth: '$thin',
height: '24px',
margin: '0',
position: 'relative',
width: '24px',
});

const IconContainer = styled('div', {
left: '50%',
position: 'absolute',
top: '50%',
transform: 'translate(-50%, -50%)',
});

export const Checkbox = (props: {
autoFocus?: boolean;
children?: string;
defaultSelected?: boolean;
isDisabled?: boolean;
isIndeterminate?: boolean;
validationState?: 'invalid' | 'valid';
lukerohanbailey marked this conversation as resolved.
Show resolved Hide resolved
}) => {
const state = useToggleState(props);
const ref = useRef<HTMLInputElement>(null);
const { inputProps } = useCheckbox(props, state, ref);

return (
<Label>
<Input {...inputProps} ref={ref} />
{state.isSelected && (
<IconContainer>
<Check16pxIcon />
</IconContainer>
)}
{props.children}
</Label>
);
};
26 changes: 26 additions & 0 deletions src/components/stories/Checkbox.stories.tsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,26 @@
import { styled } from '../../../stitches.config';
import { Checkbox } from '../Checkbox';

const Wrapper = styled('div', {
display: 'flex',
flexFlow: 'row wrap',
gap: '$16',
width: '100%',
});

export const CheckboxStates = () => (
<Wrapper>
<Checkbox isDisabled />
<Checkbox />
<Checkbox defaultSelected />
<Checkbox autoFocus defaultSelected />
<Checkbox defaultSelected isDisabled />
<Checkbox isIndeterminate />
<Checkbox validationState="invalid" />
</Wrapper>
);

export default {
component: CheckboxStates,
title: 'Checkbox',
};
9 changes: 9 additions & 0 deletions stitches.config.ts
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,16 @@ export const {
} = createStitches({
media: {},
theme: {
borderStyles: {
solid: 'solid',
},
borderWidths: {
thin: '2px',
},
colors: colorPrimitives,
radii: {
4: '4px',
},
space: {
4: '4px',
8: '8px',
Expand Down