Skip to content

Commit

Permalink
fix: typeahead web accessibility
Browse files Browse the repository at this point in the history
  • Loading branch information
intergalacticspacehighway committed Mar 4, 2021
1 parent eefba87 commit da16b5b
Show file tree
Hide file tree
Showing 18 changed files with 966 additions and 91 deletions.
Original file line number Diff line number Diff line change
@@ -0,0 +1,38 @@
import React from 'react';
import { ComboBox, Icon } from 'native-base';

const animals = [
{ key: 1, value: 'Aardvark' },
{ key: 2, value: 'Kangaroo' },
{ key: 3, value: 'Snake' },
{ key: 4, value: 'Pikachu' },
{ key: 5, value: 'Tiger' },
{ key: 6, value: 'Godzilla' },
];

export function UsingComponent() {
const [items] = React.useState(animals);
const [filterText, setFilterText] = React.useState('');

const filteredItems = React.useMemo(() => {
return items.filter(
(item) => item.value.toLowerCase().indexOf(filterText.toLowerCase()) > -1
);
}, [items, filterText]);

return (
<ComboBox
items={filteredItems}
onInputChange={setFilterText}
onSelectionChange={console.log}
label="Select your favorite animal"
toggleIcon={({ isOpen }: any) => {
return isOpen ? (
<Icon name="arrow-drop-up" type="MaterialIcons" size={12} />
) : (
<Icon name="arrow-drop-down" type="MaterialIcons" size={12} />
);
}}
/>
);
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,47 @@
import React from 'react';
import { ComboBox, Icon, Box, Text } from 'native-base';

const animals = [
{ key: 1, value: 'Aardvark' },
{ key: 2, value: 'Kangaroo' },
{ key: 3, value: 'Snake' },
{ key: 4, value: 'Pikachu' },
{ key: 5, value: 'Tiger' },
{ key: 6, value: 'Godzilla' },
];

export function UsingComponentWithRenderItem() {
return (
<ComboBox
items={animals}
disabledKeys={[1]}
width={400}
onSelectionChange={console.log}
label="Select your favorite animal"
renderItem={(item: any) => {
return (
<Box flexDirection="row" justifyContent="space-between" p={4}>
<Box
backgroundColor="black"
height={10}
width={10}
borderRadius={9999}
justifyContent="center"
alignItems="center"
>
<Text color="white">{item.value}</Text>
</Box>
<Box>{item.value}</Box>
</Box>
);
}}
toggleIcon={({ isOpen }: any) => {
return isOpen ? (
<Icon name="arrow-drop-up" type="MaterialIcons" size={12} />
) : (
<Icon name="arrow-drop-down" type="MaterialIcons" size={12} />
);
}}
/>
);
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,39 @@
import React from 'react';
import { ComboBox, Icon } from 'native-base';

const animals = [
{ key: 1, value: 'Aardvark' },
{ key: 2, value: 'Kangaroo' },
{ key: 3, value: 'Snake' },
{ key: 4, value: 'Pikachu' },
{ key: 5, value: 'Tiger' },
{ key: 6, value: 'Godzilla' },
];

export function UsingControlledInput() {
const [items] = React.useState(animals);
const [inputValue, setInputValue] = React.useState('');

const filteredItems = React.useMemo(() => {
return items.filter(
(item) => item.value.toLowerCase().indexOf(inputValue.toLowerCase()) > -1
);
}, [items, inputValue]);

return (
<ComboBox
items={filteredItems}
onInputChange={setInputValue}
inputValue={inputValue}
onSelectionChange={(value) => console.log(value)}
label="Select your favorite animal"
toggleIcon={({ isOpen }: any) => {
return isOpen ? (
<Icon name="arrow-drop-up" type="MaterialIcons" size={12} />
) : (
<Icon name="arrow-drop-down" type="MaterialIcons" size={12} />
);
}}
/>
);
}
14 changes: 14 additions & 0 deletions example/storybook/stories/components/composites/Combobox/index.tsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
import React from 'react';
import { storiesOf } from '@storybook/react-native';
import { withKnobs } from '@storybook/addon-knobs';
import Wrapper from './../../Wrapper';
import { UsingComponent } from './UsingComponent';
import { UsingComponentWithRenderItem } from './UsingComponentWithRenderItem';
import { UsingControlledInput } from './UsingControlledInput';

storiesOf('Combobox', module)
.addDecorator(withKnobs)
.addDecorator((getStory: any) => <Wrapper>{getStory()}</Wrapper>)
.add('Basic', () => <UsingComponent />)
.add('Using render item', () => <UsingComponentWithRenderItem />)
.add('Using Controlled input', () => <UsingControlledInput />);
157 changes: 79 additions & 78 deletions example/storybook/stories/index.ts
Original file line number Diff line number Diff line change
@@ -1,83 +1,84 @@
// Components
export * from './components/composites/Accordion';
export * from './components/composites/Actionsheet';
export * from './components/composites/Alert';
export * from './components/composites/AlertDialog';
export * from './components/composites/AppBar';
export * from './components/composites/AspectRatio';
export * from './components/composites/Avatar';
export * from './components/composites/Badge';
export * from './components/primitives/Box';
export * from './components/composites/Breadcrumb';
export * from './components/primitives/Button';
export * from './components/composites/Center';
export * from './components/primitives/Checkbox';
export * from './components/composites/CircularProgress';
export * from './components/composites/CloseButton';
export * from './components/composites/Code';
export * from './components/composites/Collapse';
export * from './components/primitives/Column';
export * from './components/composites/Container';
export * from './components/composites/Divider';
export * from './components/composites/Fab';
export * from './components/composites/factory';
export * from './components/primitives/Flex';
export * from './components/composites/FormControl';
export * from './components/primitives/Heading';
export * from './components/primitives/HStack';
export * from './components/primitives/Icon';
export * from './components/composites/IconButton';
export * from './components/primitives/Image';
export * from './components/primitives/Input';
export * from './components/composites/Kbd';
export * from './components/primitives/Link';
export * from './components/primitives/List';
export * from './components/composites/Menu';
export * from './components/composites/Modal';
export * from './components/composites/NumberInput';
export * from './components/primitives/Overlay';
export * from './components/composites/PinInput';
export * from './components/composites/Popover';
export * from './components/composites/Progress';
export * from './components/primitives/Radio';
export * from './components/primitives/Row';
export * from './components/primitives/Select';
export * from './components/composites/SimpleGrid';
export * from './components/composites/Skeleton';
export * from './components/primitives/Slider';
export * from './components/composites/Snackbar';
export * from './components/primitives/Spinner';
export * from './components/primitives/Stack';
export * from './components/composites/Stat';
export * from './components/primitives/Switch';
export * from './components/composites/Tabs';
export * from './components/composites/Tag';
export * from './components/primitives/Text';
export * from './components/primitives/TextArea';
export * from './components/composites/Toast';
export * from './components/composites/Transitions';
export * from './components/composites/Typeahead';
export * from './components/primitives/View';
export * from './components/primitives/VStack';
export * from './components/composites/Wrap';
export * from './components/primitives/ZStack';
// export * from './components/composites/Accordion';
// export * from './components/composites/Actionsheet';
// export * from './components/composites/Alert';
// export * from './components/composites/AlertDialog';
// export * from './components/composites/AppBar';
// export * from './components/composites/AspectRatio';
// export * from './components/composites/Avatar';
// export * from './components/composites/Badge';
// export * from './components/primitives/Box';
// export * from './components/composites/Breadcrumb';
// export * from './components/primitives/Button';
// export * from './components/composites/Center';
// export * from './components/primitives/Checkbox';
// export * from './components/composites/CircularProgress';
// export * from './components/composites/CloseButton';
// export * from './components/composites/Code';
// export * from './components/composites/Collapse';
// export * from './components/primitives/Column';
// export * from './components/composites/Container';
// export * from './components/composites/Divider';
// export * from './components/composites/Fab';
// export * from './components/composites/factory';
// export * from './components/primitives/Flex';
// export * from './components/composites/FormControl';
// export * from './components/primitives/Heading';
// export * from './components/primitives/HStack';
// export * from './components/primitives/Icon';
// export * from './components/composites/IconButton';
// export * from './components/primitives/Image';
// export * from './components/primitives/Input';
// export * from './components/composites/Kbd';
// export * from './components/primitives/Link';
// export * from './components/primitives/List';
// export * from './components/composites/Menu';
// export * from './components/composites/Modal';
// export * from './components/composites/NumberInput';
// export * from './components/primitives/Overlay';
// export * from './components/composites/PinInput';
// export * from './components/composites/Popover';
// export * from './components/composites/Progress';
// export * from './components/primitives/Radio';
// export * from './components/primitives/Row';
// export * from './components/primitives/Select';
// export * from './components/composites/SimpleGrid';
// export * from './components/composites/Skeleton';
// export * from './components/primitives/Slider';
// export * from './components/composites/Snackbar';
// export * from './components/primitives/Spinner';
// export * from './components/primitives/Stack';
// export * from './components/composites/Stat';
// export * from './components/primitives/Switch';
// export * from './components/composites/Tabs';
// export * from './components/composites/Tag';
// export * from './components/primitives/Text';
// export * from './components/primitives/TextArea';
// export * from './components/composites/Toast';
// export * from './components/composites/Transitions';
export * from './components/composites/Combobox';

// Hooks
export * from './hooks/useBreakpointValue';
export * from './hooks/useClipboard';
export * from './hooks/useDisclose';
export * from './hooks/useMediaQuery';
export * from './hooks/usePopover';
export * from './hooks/useSafeArea';
// export * from './components/primitives/View';
// export * from './components/primitives/VStack';
// export * from './components/composites/Wrap';
// export * from './components/primitives/ZStack';

// Theme
export * from './theme/Custom';
export * from './theme/Mode';
export * from './theme/Responsive';
// // Hooks
// export * from './hooks/useBreakpointValue';
// export * from './hooks/useClipboard';
// export * from './hooks/useDisclose';
// export * from './hooks/useMediaQuery';
// export * from './hooks/usePopover';
// export * from './hooks/useSafeArea';

// Community integrations
export * from './community-integrations/Formik';
export * from './community-integrations/ReactHookForm';
// // Theme
// export * from './theme/Custom';
// export * from './theme/Mode';
// export * from './theme/Responsive';

// Examples
export * from './examples';
// // Community integrations
// export * from './community-integrations/Formik';
// export * from './community-integrations/ReactHookForm';

// // Examples
// export * from './examples';
6 changes: 3 additions & 3 deletions example/yarn.lock
Original file line number Diff line number Diff line change
Expand Up @@ -2534,9 +2534,9 @@
"@types/react" "^16"

"@types/react-native@~0.63.2":
version "0.63.37"
resolved "https://registry.yarnpkg.com/@types/react-native/-/react-native-0.63.37.tgz#c43df90c9d3cc082a97a49a53e989de26cb8ab45"
integrity sha512-xr9SZG7tQQBKT6840tAGaWEC65D2gjyxZtuZxz631UgeW1ofItuu9HMVhoyYqot2hRSa6Q4YC8FYkRVUpM53/w==
version "0.63.50"
resolved "https://registry.yarnpkg.com/@types/react-native/-/react-native-0.63.50.tgz#cea13fb272983ec585179807d0cb4f84db0952f6"
integrity sha512-jWxsHDG/AHEaOrqqcI0Cth0WdPsgyaJ1nel5pS0uCzpt2RjwtkvEUAfu39paPr4i+9oUUgbJq3vkVXaj7n8RdQ==
dependencies:
"@types/react" "*"

Expand Down
6 changes: 5 additions & 1 deletion package.json
Original file line number Diff line number Diff line change
Expand Up @@ -46,7 +46,7 @@
"@types/jest": "^26.0.0",
"@types/lodash": "^4.14.162",
"@types/react": "^16.9.19",
"@types/react-native": "0.62.13",
"@types/react-native": "~0.63.2",
"@types/styled-components-react-native": "^5.1.0",
"@types/styled-system": "^5.1.9",
"@types/tinycolor2": "^1.4.2",
Expand Down Expand Up @@ -78,6 +78,7 @@
"peerDependencies": {
"@expo/vector-icons": "^12.0.2",
"react": "16.11.0",
"react-dom": "*",
"react-native": "0.62.2",
"react-native-safe-area-context": "^3.1.9",
"react-native-svg": "^12.1.0",
Expand Down Expand Up @@ -155,10 +156,13 @@
"@react-aria/visually-hidden": "^3.2.1",
"@react-native-aria/button": "^0.2.2",
"@react-native-aria/checkbox": "^0.2.2",
"@react-native-aria/combobox": "^0.2.4-alpha.0",
"@react-native-aria/focus": "^0.2.4",
"@react-native-aria/interactions": "^0.2.2",
"@react-native-aria/listbox": "^0.2.4-alpha.0",
"@react-native-aria/radio": "^0.2.2",
"@react-native-picker/picker": "^1.9.11",
"@react-stately/combobox": "^3.0.0-alpha.1",
"@react-stately/radio": "^3.2.1",
"babel-eslint": "^10.1.0",
"deepmerge": "^4.2.2",
Expand Down
Loading

0 comments on commit da16b5b

Please sign in to comment.