diff --git a/README.md b/README.md
index 7c92752..97f4017 100644
--- a/README.md
+++ b/README.md
@@ -1,23 +1,121 @@
-# <custom-element> element
+# <filter-input> element
-Boilerplate for creating a custom element.
+Display elements in a subtree that match filter input text.
## Installation
```
-$ npm install @github/custom-element-element
+$ npm install @github/filter-input-element
```
## Usage
-```js
-import '@github/custom-element-element'
+```html
+
+
+
+
+
+
Bender
+
Hubot
+
Wall-E
+
BB-8
+
R2-D2
+
+
0 robots found.
+
+```
+
+## Elements and attributes
+
+### Required
+
+- `filter-input[aria-owns]` should point to the container ID that wraps all `` related elements.
+- `filter-input` should have one `input` child element that is used to filter.
+- `[id]` should be set on a container that either contains or has `[data-filter-list]` attribute.
+- `[data-filter-list]` should be set on the element whose **direct child elements** are to be filtered.
+
+### Optional
+
+#### Specify filter text
+
+Use `[data-filter-item-text]` to specify an element whose text should be used for filtering. In the following example, the text `(current)` would not be matched.
+
+```html
+
```
+#### Blankslate
+
+Use `[data-filter-empty-state]` to specify an element to be displayed when no results were found. This element must be inside of the container `aria-owns` points to.
+
```html
-
+
```
+#### Create new item
+
+Use `[data-filter-new-item]` to include an item to create a new instance when no exact match were found. The element with `[data-filter-new-text]`'s text content will be set to the input value. You can also use `[data-filter-new-value]` to set an input value to the query param.
+
+```html
+
+```
+
+## Methods
+
+`filterInputElement.filter` can be optionally set to provide an alternative filtering logic. The default is substring.
+
+```js
+const fuzzyFilterInput = document.querySelector('.js-fuzzy-filter-input')
+fuzzyFilterInput.filter = (element, elementText, query) => {
+ // fuzzy filtering logic
+ return {match: boolean, hideNew: boolean}
+}
+```
+
+`match`(required) indicates whether the item should be shown. `hideNew` (optional) will determine whether the "Create new item" element should be hidden. For example, when an exact match is found, the "create new item" option should be hidden.
+
+## Events
+
+- `filter-input-start` (bubbles) - fired on `` when a filter action is about to start.
+- `filter-input-updated` (bubbles) - fired on `` when filter has finished. `event.detail.count` is the number of matches found, and `event.detail.total` is the total number of elements.
+
+To ensure that the client side update is communicated to assistive technologies, `filter-input-updated` event can be used to update filter results to screen readers. For example:
+
+```js
+const ariaLiveContainer = document.querySelector('[aria-live="assertive"]')
+document.addEventListener('filter-input-updated', event => {
+ ariaLiveContainer.textContent = `${event.detail.count} results found.`
+})
+```
+
+For more details on this technique, check out [Improving accessibility on GOV.UK search](https://technology.blog.gov.uk/2014/08/14/improving-accessibility-on-gov-uk-search/).
+
## Browser support
Browsers without native [custom element support][support] require a [polyfill][].
diff --git a/examples/index.html b/examples/index.html
index 58d61c7..8c755d4 100644
--- a/examples/index.html
+++ b/examples/index.html
@@ -5,16 +5,24 @@
filter-input demo
-
+
+
+
+