building an accessible auto-complete

181
Accessible Autocomplete Creating

Upload: russ-weakley

Post on 23-Jan-2018

4.696 views

Category:

Education


0 download

TRANSCRIPT

Page 1: Building an accessible auto-complete

AccessibleAutocomplete

Creating

Page 2: Building an accessible auto-complete

What is Autocomplete?

Page 3: Building an accessible auto-complete

“Autocomplete” is a software function that provides relevant

suggestions based on input by the user.

Page 4: Building an accessible auto-complete

For this presentation, we’re going to focus on accessible autocomplete

associated with search.

Page 5: Building an accessible auto-complete

Diagram showing autosuggest search component

Search towns in Australiaar

Arltunga, NTArmadale, WAArmidale, NSWArno Bay, SA

Page 6: Building an accessible auto-complete

The aim is to provide some information to consider if you’re

thinking about building an accessible autocomplete search.

Page 7: Building an accessible auto-complete

User Experience

Page 8: Building an accessible auto-complete

Before diving into accessibility, we’ll look at some common UX

patterns associated with autocomplete search.

Page 9: Building an accessible auto-complete

1. There should be clear wording or visual indicators to describe the

purpose of the search.

Page 10: Building an accessible auto-complete

Are users searching across the site, an aspect of the site, a specific

function?

Page 11: Building an accessible auto-complete

Search towns in Australia

Diagram showing highlighted label “Search towns in Australia”

Page 12: Building an accessible auto-complete

2. If additional instructions are required, they should be located in

close proximity to the field.

Page 13: Building an accessible auto-complete

Diagram showing information under the input “You can filter by Town or by State”

Search towns in Australia

You can filter by Town or by State

Page 14: Building an accessible auto-complete

3. The placeholder attribute should not be used for complex

instructions.

Page 15: Building an accessible auto-complete

This attribute it is often displayed in a faint colour and is wiped as soon

as the user begins typing.

Page 16: Building an accessible auto-complete

SearchSearch Towns in Australia

Diagram showing placeholder “Search towns in Australia” with red cross beside placeholder

Page 17: Building an accessible auto-complete

4. The list of autocomplete suggestions could highlight the

string typed by the user…

Page 18: Building an accessible auto-complete

Search towns in Australiaar

Arltunga, NTArmadale, WAArmidale, NSWArno Bay, SA

Diagram showing autosuggest options highlighting the user string

Page 19: Building an accessible auto-complete

Or, the list could the highlight everything apart from the string

typed by the user.

Page 20: Building an accessible auto-complete

Search towns in Australiaar

Arltunga, NTArmadale, WAArmidale, NSWArno Bay, SA

Diagram showing autosuggest options highlighting the non-user string

Page 21: Building an accessible auto-complete

5. It should quickly become clear to users what type of strings will

trigger the autocomplete?

Page 22: Building an accessible auto-complete

Does the search work based on the initial characters of suggestions…

Page 23: Building an accessible auto-complete

Search towns in Australiaar

Arltunga, NTArmadale, WAArmidale, NSWArno Bay, SA

Diagram showing autosuggest options highlighting the user string at the start of each item

Page 24: Building an accessible auto-complete

Or any characters within the suggestion?

Page 25: Building an accessible auto-complete

Search towns in Australiaara

Araluen, NSWBargara, QLDBingara, NSWCoonabarabran, NSW

Diagram showing autosuggest options highlighting the user string within each item

Page 26: Building an accessible auto-complete

6. Any autocomplete suggestions should be accurate.

Page 27: Building an accessible auto-complete

Don't display suggestions if there is no match - unless you are trying to

force users to choose from a specific set of options.

Page 28: Building an accessible auto-complete

Search towns in AustraliaBanana

Arltunga, NTArmadale, WAArmidale, NSWArno Bay, SA

Diagram showing autosuggest options that do not match the user string

?

Page 29: Building an accessible auto-complete

7. Users should be able to easily clear the search form of previously

typed strings.

Page 30: Building an accessible auto-complete

Search towns in AustraliaAdaminaby, NSW

Diagram showing highlighted clear component

Page 31: Building an accessible auto-complete

8. Ideally, there should be some clearly defined submit action

associated with the search.

Page 32: Building an accessible auto-complete

Diagram showing highlighted submit component

Search towns in AustraliaAdaminaby, NSW

Page 33: Building an accessible auto-complete

Keyboard-only

Page 34: Building an accessible auto-complete

Focus

Page 35: Building an accessible auto-complete

Any web page or web app should have clear visual indicators to help

keyboard-only users determine which element is currently in focus.

Page 36: Building an accessible auto-complete

This could just be the default browser focus ring…

Page 37: Building an accessible auto-complete

Search towns in Australia

Diagram showing input in focus - indicated with blue focus ring

Page 38: Building an accessible auto-complete

Or by specifying your own consistent focus state

methodology.

Page 39: Building an accessible auto-complete

Search towns in Australia

Diagram showing input in focus - indicated with black dotted lines

Page 40: Building an accessible auto-complete

However, you should never make it hard or impossible for keyboard-only users to see what is in focus.

Page 41: Building an accessible auto-complete

/* Bad practice */ input:focus {

outline: none; }

Page 42: Building an accessible auto-complete

Keystrokes

Page 43: Building an accessible auto-complete

Keyboard-only users should be able to perform any of the following

actions…

Page 44: Building an accessible auto-complete

1. Use the TAB keystroke to move focus into the search input field

from a previous element with focus.

Page 45: Building an accessible auto-complete

Search towns in Australia

Diagram showing highlighted input

TAB

Page 46: Building an accessible auto-complete

2. Use the TAB keystroke to move focus from the search input to the

“clear” button.

Page 47: Building an accessible auto-complete

Search towns in AustraliaAdaminaby, NSW

Diagram showing highlighted clear button

TAB

Page 48: Building an accessible auto-complete

3. Use the ENTER keystroke to trigger the “clear” button.

Page 49: Building an accessible auto-complete

Search towns in AustraliaAdaminaby, NSW

Diagram showing selected clear button

ENTER

Page 50: Building an accessible auto-complete

Note: When the “clear” button has been triggered, the search input

field should be cleared and focus should shift to this field again.

Page 51: Building an accessible auto-complete

Search towns in Australia

Diagram showing focus move for clear button back to search input

Page 52: Building an accessible auto-complete

4. Use the TAB keystroke to move focus from the clear button to the

submit button.

Page 53: Building an accessible auto-complete

Adaminaby, NSW

Search towns in Australia

Diagram showing focus move form the clear button to the submit button

TAB

Page 54: Building an accessible auto-complete

5. Use the ENTER keystroke to trigger the submit button.

Page 55: Building an accessible auto-complete

Diagram showing selected submit button

Search towns in AustraliaAdaminaby, NSW

ENTER

Page 56: Building an accessible auto-complete

Note: When the submit button has been triggered, focus should shift

to the search result area below the autocomplete search widget.

Page 57: Building an accessible auto-complete

Diagram showing focus move from submit button to search results

Search towns in Australia

Search Results

Bell, NSWBell is a small rural and residential village in theBlue Mountains region of New South Wales.

Bells Beach, VICBells Beach is a coastal locality of Victoria,Australia iand a renowned surf beach.

Bell

Page 58: Building an accessible auto-complete

6. Use the DOWN ARROW keystroke to move focus from the search input

field to the first item in list of autocomplete suggestions.

Page 59: Building an accessible auto-complete

Search towns in Australiaar

Arltunga, NTArmadale, WAArmidale, NSWArno Bay, SA

Diagram showing focus move from input to first suggestion

↓ARROW

Page 60: Building an accessible auto-complete

7. Use the UP ARROW and DOWN ARROW keystrokes to navigate

backwards and forwards through suggestions.

Page 61: Building an accessible auto-complete

Search towns in Australiaar

Arltunga, NTArmadale, WAArmidale, NSWArno Bay, SA

Diagram showing second selection in focus and arrows to indicate focus can move backwards or forwards

↓ARROW

↑ARROW

Page 62: Building an accessible auto-complete

Note: The autosuggest item in focus should always be in view if there is

a scrolling mechanism in place.

Page 63: Building an accessible auto-complete

8: Users should not be able to DOWN ARROW past the last suggestion

option.

Page 64: Building an accessible auto-complete

Search towns in Australiaar

Arltunga, NTArmadale, WAArmidale, NSWArno Bay, SA

Diagram showing last selection in focus and red cross to indicate focus cannot go forward

↓ARROW

Page 65: Building an accessible auto-complete

9. Some developers allow DOWN ARROW keystrokes to loop from the

last suggestion directly back to the initial input box.

Page 66: Building an accessible auto-complete

However, I have found that some users find this confusing. They may not be aware that they have

returning to the input field.

Page 67: Building an accessible auto-complete

Search towns in Australiaar

Arltunga, NTArmadale, WAArmidale, NSWArno Bay, SA

Diagram showing last selection in focus and red cross to indicate focus cannot jump to search input

↓ARROW

Page 68: Building an accessible auto-complete

10. However, users should be able to UP ARROW from the first

suggestion back into the search input field.

Page 69: Building an accessible auto-complete

Search towns in Australiaar

Arltunga, NTArmadale, WAArmidale, NSWArno Bay, SA

Diagram showing focus move from autosuggest dropdown to search input

↑ARROW

Page 70: Building an accessible auto-complete

11. Use the ENTER keystrokes to select an autocomplete

suggestion.

Page 71: Building an accessible auto-complete

Diagram showing selected suggest option

Search towns in Australiaar

Arltunga, NTArmadale, WAArmidale, NSWArno Bay, SAENTER

Page 72: Building an accessible auto-complete

Note: When the ENTER keystroke has been triggered, focus should shift back to the search input

field.

Page 73: Building an accessible auto-complete

Diagram showing focus move from selected suggestion to search input field

Search towns in AustraliaArmadale, WA

Page 74: Building an accessible auto-complete

12. Use the ESC keystroke to close the suggestion list and return

focus to the initial input (i.e. if none of the suggestions are relevant).

Page 75: Building an accessible auto-complete

Search towns in Australiaar

Diagram showing focus returning to input

ESC

Page 76: Building an accessible auto-complete

Markup for screen readers

Page 77: Building an accessible auto-complete

Here are some markup suggestions to make the search

widget accessible to screen readers.

Page 78: Building an accessible auto-complete

Overall

Page 79: Building an accessible auto-complete

The widget should be wrapped inside a <form> element.

Page 80: Building an accessible auto-complete

<form action="#"> </form>

Page 81: Building an accessible auto-complete

The <label> and <input> elements are the core of the search

button.

Page 82: Building an accessible auto-complete

<form action="#"> <label></label>

<input> </form>

Page 83: Building an accessible auto-complete

One <button> elements will be used to “clear” user input.

Page 84: Building an accessible auto-complete

<form action="#"> <label></label>

<input> <button></button>

</form>

Page 85: Building an accessible auto-complete

A second <button> elements will be used to submit the form.

Page 86: Building an accessible auto-complete

<form action="#"> <label></label>

<input> <button></button>

<button></button> </form>

Page 87: Building an accessible auto-complete

The <ul> allows us to display the list of suggestions when

appropriate.

Page 88: Building an accessible auto-complete

<form action="#"> <label></label>

<input> <button></button>

<button></button> <ul>

<li></li> <li></li> <li></li>

</ul> </form>

Page 89: Building an accessible auto-complete

The <div> element allows us to provide hidden instructions for

screen reader users.

Page 90: Building an accessible auto-complete

<form action="#"> <label></label>

<input> <button></button>

<button></button> <ul>

<li></li> <li></li> <li></li>

</ul> <div></div>

</form>

Page 91: Building an accessible auto-complete

The details

Page 92: Building an accessible auto-complete

In order to explicitly associate the <label> element with the

<input> element, we should use for and id attributes.

Page 93: Building an accessible auto-complete

<label for="search">Search towns in Australia</label> <input

type="text" id="search"

aria-describedby="instructions" aria-owns="results"

aria-expanded="false" >

Page 94: Building an accessible auto-complete

The <input> element’s type attribute could be set to a value of

"text" or "search".

Page 95: Building an accessible auto-complete

<label for="search">Search towns in Australia</label> <input

type="text" id="search"

aria-describedby="instructions" aria-owns="results"

aria-expanded="false" >

Page 96: Building an accessible auto-complete

<label for="search">Search towns in Australia</label> <input

type="search" id="search"

aria-describedby="instructions" aria-owns="results"

aria-expanded="false" >

Page 97: Building an accessible auto-complete

However, it is important to consider how the “clear” button will

operate.

Page 98: Building an accessible auto-complete

Some browsers, like Chrome and Safari will display an <input> type of "search" with a native “clear”

button at the right side of the input. Other browses like Firefox, do

not.

Page 99: Building an accessible auto-complete

Chrome

Firefox

Safari

Diagram showing Chrome and Safari’s clear button. Firefox has no clear button.

Page 100: Building an accessible auto-complete

More importantly, this native “clear” button often cannot be accessed

via the TAB keystroke, so it is inaccessible for many Assistive

Technology users.

Page 101: Building an accessible auto-complete

So, if you want to use a robust and accessible “clear” button, it is

better to use a separate <button> element.

Page 102: Building an accessible auto-complete

Using CSS, you can make the clear button look like it sits inside the

<input> element.

Page 103: Building an accessible auto-complete

Search towns in Australia

Input Button Button

Diagram showing three different elements - the input, the clear and the submit button

Page 104: Building an accessible auto-complete

Then make sure to set the type to "text" rather than "search".

Page 105: Building an accessible auto-complete

<label for="search">Search towns in Australia</label> <input

type="text" id="search"

aria-describedby="instructions" aria-owns="results"

aria-expanded="false" >

Page 106: Building an accessible auto-complete

The aria-describedby attribute allows us to describe the purpose of the current element. It points the current element to a new element

with a matching ID value.

Page 107: Building an accessible auto-complete

<label for="search">Search towns in Australia</label> <input

type="text" id="search"

aria-describedby="instructions" aria-owns="results"

aria-expanded="false" >

<div id="instructions" aria-live="assertive" style="display: none;">

... </div>

Page 108: Building an accessible auto-complete

This allows us to provide basic instructions on the use of the

widget for assistive technologies.

Page 109: Building an accessible auto-complete

<div id="instructions" aria-live="assertive" style="display: none;">

When autocomplete options are available, use up and down arrows to review and enter to select.

</div>

Page 110: Building an accessible auto-complete

The aria-owns attribute allows us to define “a parent/child

contextual relationship to assistive technologies that is otherwise

impossible to infer from the DOM”.

Page 111: Building an accessible auto-complete

In other words, we can define the <input> element as the parent, and

the <ul> element as the child element.

Page 112: Building an accessible auto-complete

<label for="search">Search towns in Australia</label> <input

type="text" id="search"

aria-describedby="instructions" aria-owns="results"

aria-expanded="false" >

<ul id="results"> ...

</ul>

Page 113: Building an accessible auto-complete

The aria-expanded attribute allows us to inform assistive technologies when the autocomplete dropdown

is present. It is initially set to "false".

Page 114: Building an accessible auto-complete

<label for="search">Search towns in Australia</label> <input

type="text" id="search"

aria-describedby="instructions" aria-owns="results"

aria-expanded="false" >

Page 115: Building an accessible auto-complete

This value needs to dynamically change to "true" as soon as the

autocomplete suggestions are present.

Page 116: Building an accessible auto-complete

<label for="search">Search towns in Australia</label> <input

type="text" id="search"

aria-describedby="instructions" aria-owns="results"

aria-expanded="true" >

Page 117: Building an accessible auto-complete

Directly after the input, we need two <button> elements.

Page 118: Building an accessible auto-complete

The first <button> should be a type of "button" and allow users to

clear the input.

Page 119: Building an accessible auto-complete

<button type="button" aria-label="Clear"></button> <button type="submit" aria-label="Search"></button>

Page 120: Building an accessible auto-complete

The second <button> should be a type of "submit" and allow users to

submit the form.

Page 121: Building an accessible auto-complete

<button type="button" aria-label="Clear"></button> <button type="submit" aria-label="Search"></button>

Page 122: Building an accessible auto-complete

You may want to use icons instead of text for one or both of the

buttons. In this case we are using “clear” and “search” icons.

Page 123: Building an accessible auto-complete

Search towns in Australia

Diagram showing clear and search icons

Page 124: Building an accessible auto-complete

However, if you user icons instead of text, you will need to provide additional context for Assistive

Technologies.

Page 125: Building an accessible auto-complete

In this case, we can use aria-label attributes to provide hidden

labels for both buttons.

Page 126: Building an accessible auto-complete

<button type="button" aria-label="Clear"></button> <button type="submit" aria-label="Search"></button>

Page 127: Building an accessible auto-complete

After the two button elements, we need to add the <ul> element which

will be used to display the autocomplete suggestions.

Page 128: Building an accessible auto-complete

<ul id="results"

role="listbox" tabindex="-1"

style="display: none;" >

<li role="option" aria-selected="false">apple</li> <li role="option" aria-selected="false">banana</li> <li role="option" aria-selected="false">pear</li>

</ul>

Page 129: Building an accessible auto-complete

As mentioned before, the ID attribute’s value of "results" allows us to determine that this

element is “owned” by the parent <input> element.

Page 130: Building an accessible auto-complete

<ul id="results"

role="listbox" tabindex="-1"

style="display: none;" >

<li role="option" aria-selected="false">apple</li> <li role="option" aria-selected="false">banana</li> <li role="option" aria-selected="false">pear</li>

</ul>

Page 131: Building an accessible auto-complete

The role attribute can be set with a value of "listbox", which informs

assistive technologies that the element is a widget that allows the user to select one or more items

from a list of choices.

Page 132: Building an accessible auto-complete

<ul id="results"

role="listbox" tabindex="-1"

style="display: none;" >

<li role="option" aria-selected="false">apple</li> <li role="option" aria-selected="false">banana</li> <li role="option" aria-selected="false">pear</li>

</ul>

Page 133: Building an accessible auto-complete

To make sure the element is initially hidden we can set the style attribute to "display:none".

Page 134: Building an accessible auto-complete

<ul id="results"

role="listbox" tabindex="-1"

style="display: none;" >

<li role="option" aria-selected="false">apple</li> <li role="option" aria-selected="false">banana</li> <li role="option" aria-selected="false">pear</li>

</ul>

Page 135: Building an accessible auto-complete

This value needs to dynamically change to something like

"display:block" as soon as the autocomplete options are triggered.

Page 136: Building an accessible auto-complete

<ul id="results"

role="listbox" tabindex="0"

style="display: block;" >

<li role="option" aria-selected="false">apple</li> <li role="option" aria-selected="false">banana</li> <li role="option" aria-selected="false">pear</li>

</ul>

Page 137: Building an accessible auto-complete

To make sure the element cannot be brought into focus before it is

triggered, we can set the tabindex attribute to "-1".

Page 138: Building an accessible auto-complete

<ul id="results"

role="listbox" tabindex="-1"

style="display: none;" >

<li role="option" aria-selected="false">apple</li> <li role="option" aria-selected="false">banana</li> <li role="option" aria-selected="false">pear</li>

</ul>

Page 139: Building an accessible auto-complete

This value needs to dynamically change to "0" as soon as the autocomplete suggestions are

present.

Page 140: Building an accessible auto-complete

<ul id="results"

role="listbox" tabindex="0"

style="display: block;" >

<li role="option" aria-selected="false">apple</li> <li role="option" aria-selected="false">banana</li> <li role="option" aria-selected="false">pear</li>

</ul>

Page 141: Building an accessible auto-complete

Each of the <li> elements can be given a role attribute with a value of "option" with informs assistive

technologies that they are selectable items in a select list.

Page 142: Building an accessible auto-complete

<ul id="results"

role="listbox" tabindex="-1"

style="display: none;" >

<li role="option" aria-selected="false">apple</li> <li role="option" aria-selected="false">banana</li> <li role="option" aria-selected="false">pear</li>

</ul>

Page 143: Building an accessible auto-complete

Each of the <li> elements needs to have an aria-selected attribute

initially set to "false".

Page 144: Building an accessible auto-complete

<ul id="results"

role="listbox" tabindex="-1"

style="display: none;" >

<li role="option" aria-selected="false">apple</li> <li role="option" aria-selected="false">banana</li> <li role="option" aria-selected="false">pear</li>

</ul>

Page 145: Building an accessible auto-complete

This value needs to dynamically change to "true" if the individual

option is selected.

Page 146: Building an accessible auto-complete

<ul id="results"

role="listbox" tabindex="-1"

style="display: none;" >

<li role="option" aria-selected="true">apple</li> <li role="option" aria-selected="false">banana</li> <li role="option" aria-selected="false">pear</li>

</ul>

Page 147: Building an accessible auto-complete

After the <ul> element, we have the <div> element, which has the

instructions for assistive technologies.

Page 148: Building an accessible auto-complete

<div id="instructions"

aria-live="assertive" class="off-left"

> When autocomplete options are available, use up and down

arrows to review and enter to select. </div>

Page 149: Building an accessible auto-complete

As mentioned before, the ID value allows us to point the <input>

element to this <div> element via the aria-describedby attribute.

Page 150: Building an accessible auto-complete

<div id="instructions"

aria-live="assertive" class="off-left"

> When autocomplete options are available, use up and down

arrows to review and enter to select. </div>

Page 151: Building an accessible auto-complete

The <div> element needs to be visually hidden, but still available to

screen readers.

Page 152: Building an accessible auto-complete

This can be achieved by setting it “off-left” using CSS. So, we can

give it a pretend “off-left” class here.

Page 153: Building an accessible auto-complete

<div id="instructions"

aria-live="assertive" class="off-left"

> When autocomplete options are available, use up and down

arrows to review and enter to select. </div>

Page 154: Building an accessible auto-complete

The aria-live attribute is set to "assertive". This informs assistive

technologies as soon as anything inside this element is dynamically

changed.

Page 155: Building an accessible auto-complete

<div id="instructions"

aria-live="assertive" class="off-left"

> When autocomplete options are available, use up and down

arrows to review and enter to select. </div>

Page 156: Building an accessible auto-complete

We need this because the instructions will dynamically

change as soon as the autocomplete options are triggered.

Page 157: Building an accessible auto-complete

<div id="instructions"

aria-live="assertive" class="off-left"

> When autocomplete results are available use up and down

arrows to review and enter to select. </div>

Page 158: Building an accessible auto-complete

<div id="instructions"

aria-live="assertive" class="off-left"

> 6 options available. Use up and down arrows to review and

enter to select. </div>

Page 159: Building an accessible auto-complete

The instructions should also immediately change as users type

if the number of suggestions changes.

Page 160: Building an accessible auto-complete

<div id="instructions"

aria-live="assertive" class="off-left"

> 3 options available. Use up and down arrows to review and

enter to select. </div>

Page 161: Building an accessible auto-complete

Good examples

Page 162: Building an accessible auto-complete

One of my favourite accessible autocomplete search widgets is the

haltersweb version:

https://haltersweb.github.io/Accessibility/autocomplete.html

Page 163: Building an accessible auto-complete

However, there are a wide range of different solutions available, such as:

http://www.visionaustralia.org/digital-access-autocomplete

https://a11y.nicolas-hoffmann.net/autocomplete-list/

https://alphagov.github.io/accessible-autocomplete/examples/

http://oaa-accessibility.org/examplep/combobox2/

Page 164: Building an accessible auto-complete

Giveaways

Page 165: Building an accessible auto-complete

I’m now going to ask you all three “prize winnable” questions.

Page 166: Building an accessible auto-complete

The first person to correctly answer each of these questions

will win a SitePoint Premium Annual Membership, with access to over $20,000 worth of SitePoint books

and courses!

Page 167: Building an accessible auto-complete

I’ll be asking the A11yBytes folks to help make sure the process is as fair as possible, but there are no

guarantees!

Page 168: Building an accessible auto-complete

Let's start with the first “prize-winnable” question...

Page 169: Building an accessible auto-complete

Question 1

Page 170: Building an accessible auto-complete

When should you use a link element, and when should you use

a button element?

Page 171: Building an accessible auto-complete

Answer to question 1

Page 172: Building an accessible auto-complete

A link allows users to go somewhere. It should send the user

to a new location.

A button allows people to trigger some type of action such as

submitting a form.

Page 173: Building an accessible auto-complete

Question 2

Page 174: Building an accessible auto-complete

What is the easiest and most effective way to identify common

accessibility problems in your site/app?

Page 175: Building an accessible auto-complete

Answer to question 2

Page 176: Building an accessible auto-complete

Unplug the mouse. The easiest and most effective way to check your

site is using keyboard-only.

Page 177: Building an accessible auto-complete

Question 3

Page 178: Building an accessible auto-complete

What is the purpose of the aria-live attribute?

Page 179: Building an accessible auto-complete

Answer to question 3

Page 180: Building an accessible auto-complete

The aria-live attribute allows us to notify screen readers when

content is dynamically updated in specific areas of a page.

Page 181: Building an accessible auto-complete

Russ Weakley Max Design

Site: maxdesign.com.au Twitter: twitter.com/russmaxdesign Slideshare: slideshare.net/maxdesign Linkedin: linkedin.com/in/russweakley