The first thing I sorted out was the CSS. Adding the following corrected all of my CSS issues (note: not all of this is CSS I wrote; much of it was pulled from various other BootStrap/typeahead solutions online, but it is tweaked as none of those worked 100% for me):
/* Twitter typeahead compatibility fixes */
.twitter-typeahead {
float: left;
margin-right: 3px;
}
.tt-suggestion {
display: block;
padding: 3px 20px;
}
.twitter-typeahead .tt-hint {
color:#a1a1a1;
padding: 6px 12px;
border:1px solid transparent;
}
.twitter-typeahead .tt-query {
border-radius: 4px!important;
border-top-right-radius: 0!important;
border-bottom-right-radius: 0!important;
}
.tt-dropdown-menu {
min-width: 160px;
margin-top: 2px;
padding: 5px 0;
background-color: #fff;
border: 1px solid #ccc;
border: 1px solid rgba(0,0,0,.2);
*border-right-width: 2px;
*border-bottom-width: 2px;
-webkit-border-radius: 6px;
-moz-border-radius: 6px;
border-radius: 6px;
-webkit-box-shadow: 0 5px 10px rgba(0,0,0,.2);
-moz-box-shadow: 0 5px 10px rgba(0,0,0,.2);
box-shadow: 0 5px 10px rgba(0,0,0,.2);
-webkit-background-clip: padding-box;
-moz-background-clip: padding;
background-clip: padding-box;
}
.tt-cursor {
cursor: pointer;
color: #fff;
background-color: #0081c2;
background-image: -moz-linear-gradient(top, #0088cc, #0077b3);
background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#0088cc), to(#0077b3));
background-image: -webkit-linear-gradient(top, #0088cc, #0077b3);
background-image: -o-linear-gradient(top, #0088cc, #0077b3);
background-image: linear-gradient(to bottom, #0088cc, #0077b3);
background-repeat: repeat-x;
filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff0088cc', endColorstr='#ff0077b3', GradientType=0)
}
.tt-suggestion.tt-is-under-cursor a {
color: #fff;
}
.tt-suggestion p {
margin: 0;
}
After my form was looking normal again, I had to get typeahead working. After a lot of trial and error and converting it to CoffeeScript, here is what I had (my API URL was at /v1/devices/list). Another note, not all of this is my original code, it is bits and pieces of javascript from around the web which I cobbled together and converted to CoffeeScript:typeahead = ->
devices = new Bloodhound({
datumTokenizer: (d) ->
test = Bloodhound.tokenizers.whitespace(d.value)
$.each(test, (k,v) ->
i = 0
while( (i+1) < v.length )
test.push(v.substr(i,v.length))
i++
)
return test
,
queryTokenizer: Bloodhound.tokenizers.whitespace,
limit: 10,
prefetch: {
url: '/v1/devices/list',
filter: (list) ->
$.map(list, (device) -> { value: device })
}
})
# kicks off the loading/processing of `local` and `prefetch`
devices.clearPrefetchCache()
devices.initialize()
# passing in `null` for the `options` arguments will result in the default
# options being used
$('.typeahead').typeahead(
{
highlight: true,
},
{
name: 'devices',
# `ttAdapter` wraps the suggestion engine in an adapter that
# is compatible with the typeahead jQuery plugin
source: devices.ttAdapter()
},
)
$('input.typeahead').bind("typeahead:selected", -> $("form").submit() )
I hope this helps someone else out there!