diff options
| author | Haishan <[email protected]> | 2020-08-06 16:26:01 +0800 |
|---|---|---|
| committer | Haishan <[email protected]> | 2020-08-06 22:40:26 +0800 |
| commit | 2c9ee574ddd5d242021e5954ca6f6144f99eb7f2 (patch) | |
| tree | f085d8083f106f2decd1156c6ba715c34acd38ed /src/components/CollapsibleSectionHeader.tsx | |
| parent | 941224c13ba87d2c3f36fb86652f046a5c76e00d (diff) | |
refactor: improve a11y
Diffstat (limited to 'src/components/CollapsibleSectionHeader.tsx')
| -rw-r--r-- | src/components/CollapsibleSectionHeader.tsx | 50 |
1 files changed, 50 insertions, 0 deletions
diff --git a/src/components/CollapsibleSectionHeader.tsx b/src/components/CollapsibleSectionHeader.tsx new file mode 100644 index 0000000..77e7596 --- /dev/null +++ b/src/components/CollapsibleSectionHeader.tsx @@ -0,0 +1,50 @@ +import cx from 'clsx'; +import * as React from 'react'; +import { ChevronDown } from 'react-feather'; + +import { keyCodes } from '../misc/keycode'; +import Button from './Button'; +import s from './CollapsibleSectionHeader.module.css'; +import { SectionNameType } from './shared/Basic'; + +type Props = { + name: string; + type: string; + qty?: number; + toggle?: () => void; + isOpen?: boolean; +}; + +export default function Header({ name, type, toggle, isOpen, qty }: Props) { + const handleKeyDown = React.useCallback( + (e: React.KeyboardEvent) => { + e.preventDefault(); + if (e.keyCode === keyCodes.Enter || e.keyCode === keyCodes.Space) { + toggle(); + } + }, + [toggle] + ); + return ( + <div + className={s.header} + onClick={toggle} + style={{ cursor: 'pointer' }} + tabIndex={0} + onKeyDown={handleKeyDown} + role="button" + > + <div> + <SectionNameType name={name} type={type} /> + </div> + + {typeof qty === 'number' ? <span className={s.qty}>{qty}</span> : null} + + <Button kind="minimal" onClick={toggle} className={s.btn}> + <span className={cx(s.arrow, { [s.isOpen]: isOpen })}> + <ChevronDown size={20} /> + </span> + </Button> + </div> + ); +} |
