Simple, accessible React autocomplete components built with Downshift
- Easy to style components
- Smart defaults on top of Downshift
- Simplified component API
- Automatic toggling of the dropdown menu
- Uses React context
- Rebass version
npm i dropbar
// unstyled version
import React from 'react'
import {
Dropbar,
Label,
Input,
Menu,
Item
} from 'dropbar'
const items = [
{value: 'apple'},
{value: 'pear'},
{value: 'orange'},
{value: 'grape'},
{value: 'banana'},
]
export default class extends React.Component {
state = {
value: ''
}
render () {
return (
<Dropbar
onChange={item => {
this.setState({
value: item.value
})
}}
match={(item, value) => item.value.includes(value)}>
<Label>Choose a fruit</Label>
<Input />
<Menu>
{items.map((item, i) => (
<Item key={item.value} item={item}>
{item.value}
</Item>
))}
</Menu>
</Dropbar>
)
}
}
The Dropbar
component accepts all props that Downshift accepts, in addition to:
match
(function) filter the children of theMenu
component based on theitem
prop
The element components in Dropbar can be styled with className
or style
props,
or with a CSS-in-JS library like styled-components or emotion.
// styled-components example
import React from 'react'
import styled from 'styled-components'
import {
Dropbar,
Label as DropLabel,
Input as DropInput,
Menu as DropMenu,
Item as DropItem
} from 'dropbar'
const Relative = styled.div`
position: relative;
`
const Label = styled(DropLabel)`
display: block;
`
const Input = styled(DropInput)`
display: block;
width: 100%;
font-size: 16px;
`
const Menu = styled(DropMenu)`
position: absolute;
top: 100%;
left: 0;
right: 0;
margin-top: 4px;
border-radius: 4px;
box-shadow: 0 0 16px rgba(0, 0, 0, .125);
`
const Item = styled(DropItem)`
display: flex;
padding: 4px;
&[data-highlighted] {
background-color: #0cf;
}
&[data-selected] {
font-weight: bold;
}
`
export default ({
label,
items = [],
onChange
}) =>
<Dropbar onChange={onChange}>
<Relative>
<Label>{label}</Label>
<Input />
<Menu>
{items.map(item => (
<Item key={item.value} item={item}>
{item.value}
</Item>
))}
</Menu>
</Relative>
</Dropbar>
To use a version with default styles from Rebass, import dropbar/rebass
and ensure styled-components and Rebass are installed.
npm i rebass styled-components
import {
Dropbar,
Label,
Input,
Menu,
Item
} from 'dropbar/rebass'
Root context provider component that wraps the Downshift component. Accepts all props for the Downshift component, plus
match
(function) filters the direct children of theMenu
component based on theitem
prop
match: (item: any, value: string) => boolean
The match
props accepts a function that receives two arguments:
item
(any) the item prop from a direct child of theMenu
componentvalue
(string) theinputValue
from Downshift
Renders a <label>
element with Downshift's getLabelProps
method automatically added.
Renders an <input>
element with Downshift's getInputProps
method automatically added.
Renders an <div>
element with Downshift's getMenuProps
method automatically added.
Props
is
(component or string) changes the underlying component type
Use the Item
component as a direct child of the Menu
component to render options for the autocomplete.
The Item component passes all props through, but requires an item
prop for Downshift.
Props
item
(any) required for Downshift to track valuesis
(component or string) changes the underlying component type
MIT License