Styling
All widgets under the vue-instantsearch namespace are shipped with fixed CSS class names.
The format for those class names is ais-NameOfWidget-element--modifier (SUIT CSS), where ais stands for Algolia InstantSearch.
The different class names used by each widget are described on their respective documentation pages. You can also inspect the underlying DOM and style accordingly.
Styling icons
You can style the colors of icons too, for example the SearchBox ones:
ais-SearchBox-resetIcon,
ais-SearchBox-submitIcon {
fill: red;
}
Loading the theme
We do not load any CSS into your page automatically but we provide two themes that you can load manually:
- reset.css
- algolia.css
We strongly recommend that you use at least reset.css in order to neglect visual side effects caused by the new HTML semantics.
The reset theme CSS is included within the algolia CSS, so there is no need to import it separately when you are using the algolia theme.
Via CDN
The themes are available on jsDelivr and other CDNs:
minified:
- https://cdn.jsdelivr.net/npm/instantsearch.css@7.0.0/themes/reset-min.css
- https://cdn.jsdelivr.net/npm/instantsearch.css@7.0.0/themes/algolia-min.css
unminified:
- https://cdn.jsdelivr.net/npm/instantsearch.css@7.0.0/themes/reset.css
- https://cdn.jsdelivr.net/npm/instantsearch.css@7.0.0/themes/algolia.css
You can either copy paste the content into your own app or use a direct link to jsDelivr:
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/instantsearch.css@7.0.0/themes/reset-min.css">
<!-- or -->
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/instantsearch.css@7.0.0/themes/algolia-min.css">
Via npm and a bundler
npm install instantsearch.css --save
Then in your JS entry point (main.js) you need to import it:
import 'instantsearch.css/themes/reset.css';
// or
import 'instantsearch.css/themes/algolia.css';
Make sure you set up your bundler to deal with css imports.
Overriding class names
You can override existing class names with your own ones.
To do so, you need to provide an object as the class-names property, which will map default class names to the ones of your choice.
For example:
<ais-pagination :class-names="{
'ais-Pagination': 'pagination',
'ais-Pagination-item': 'page',
'ais-Pagination-item--active': 'active',
}">
</ais-pagination>
This will replace custom classes where applicable, while leaving the rest of the class names untouched.
Using slots
By using slots, you can customize the HTML of a given section of a component.
Slots come in two flavors, simple slots and scoped slots.
scoped slots will provide your template with an access to some contextual information, whereas simple slots will not.
Here is an example of adding a header to a RefinementList component:
<ais-panel>
<h3 slot="header">Filter by Brand</h3>
<ais-refinement-list attribute="brand"></ais-refinement-list>
</ais-panel>
When you use a scoped slot, you need to tell your template to get the scope.
<ais-hits>
<template slot="item" slot-scope="{ item }">
<h2>{{ item.name }}</h2>
</template>
</ais-hits>
A list of available slots is available on each component’s dedicated documentation page. Those pages also mention the available scope properties in case of scoped slot.
Overriding templates with inline-template
Sometimes, slots are not sufficient to adapt the HTML structure to your needs.
In that case, you can replace the entire template of a component.
Hint: To do so we recommend you always copy the existing template.
You can tell Vue.js to override the template by specifying an inline-template attribute on a component.
For example, render results in a table instead of in <div>s
<ais-hits inline-template>
<table v-if="state">
<tbody>
<tr v-for="item in items" :key="item.objectID">
<td>{{ item.name }}</td>
<td>{{ item.description }}</td>
</tr>
</tbody>
</table>
</ais-hits>
It is recommended to not overuse this inline-template feature because it makes it hard to know about the current scope. In the previous example, the results variable is provided by the ais-results component, not the current scope.