This approach is recommended only for sites with a limited number of pages (around 500 or fewer), otherwise the client side search index can become many megabytes in size.
If your site is in a subdirectory or has other requirements, you specify any required prefix to your search URL with data-vf-search-client-side-destination-prefix="https://myprefix"
.
This is an early alpha. More customisation options need to be added, such as:
This consumes a .js
file with a searchIndex
object of pages, a la:
let searchIndex = {
"pages": [
{"id":"0", "title": "Page title", "text": "Body text of page goes here", "tags": "", "url": "/index.html"},
...
]
};
To make this index, you can utilise the ability of vf-extension
to generate a search index.
To generate that JS file, if you're using a vf-eleventy based site, you may also want to make use of the vf-extensions
's gulp-build-search-index.js
:
require('./node_modules/\@visual-framework/vf-extensions/utils/gulp-build-search-index.js')(gulp, path, buildDestionation);
If you use that JS you'll also need some npm dependencies:
yarn add strip-js striptags node-html-parser
And you should build that search index after updating your html pages, a la:
// build search index after search page is compiled
gulp.watch(['./build/search/index.html'], gulp.parallel('vf-build-search-index'));
// And for your `build` task
gulp.task('build', gulp.series(
...
'eleventy:build',
'vf-build-search-index',
...
));
// And for your `dev` task
gulp.task('dev', gulp.series(
...
'eleventy:build',
'vf-build-search-index',
...
));
?search_query=myQuery
autofocus
on the search element, but should only do so if most users intend to search on the page<form action="/vf-core/components/vf-search-client-side/" method="GET" class="vf-form vf-form--search vf-form--search--responsive | vf-sidebar vf-sidebar--end">
<div class="vf-sidebar__inner">
<div class="vf-form__item | vf-search__item">
<label class="vf-form__label vf-u-sr-only | vf-search__label" for="search_query"></label>
<input type="search" id="search" placeholder="Enter a search query" name="search_query" class="vf-search__input | vf-form__input" data-vf-search-client-side-input data-vf-search-client-side-destination-prefix="">
</div><button type="submit" class="vf-search__button | vf-button vf-button--primary">
<span class="vf-button__text">Search</span>
<svg class="vf-icon vf-icon--search-btn | vf-button__icon" aria-hidden="true" xmlns="http://www.w3.org/2000/svg" version="1.1" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:svgjs="http://svgjs.com/svgjs" viewBox="0 0 140 140" width="140" height="140">
<g transform="matrix(5.833333333333333,0,0,5.833333333333333,0,0)">
<path d="M23.414,20.591l-4.645-4.645a10.256,10.256,0,1,0-2.828,2.829l4.645,4.644a2.025,2.025,0,0,0,2.828,0A2,2,0,0,0,23.414,20.591ZM10.25,3.005A7.25,7.25,0,1,1,3,10.255,7.258,7.258,0,0,1,10.25,3.005Z" fill="#FFFFFF" stroke="none" stroke-linecap="round" stroke-linejoin="round" stroke-width="0"></path>
</g>
</svg>
</button>
</div>
</form>
<script src="https://cdnjs.cloudflare.com/ajax/libs/lunr.js/2.3.8/lunr.js"></script>
<script src="/search_index.js"></script>
<div class="vf-search-client-side vf-grid | vf-content">
<div class="results-container" data-vf-search-client-side-results>
Loading...
</div>
</div>
<script type="text/javascript">
window.onload = function() {
vfSearchClientSide();
};
</script>
This repository is distributed with npm. After installing npm, you can install vf-search-client-side
with this command.
$ yarn add --dev @visual-framework/vf-search-client-side
The style files included are written in Sass. If you're using a VF-core project, you can import it like this:
@import "@visual-framework/vf-search-client-side/index.scss";
Make sure you import Sass requirements along with the modules. You can use a project boilerplate or the vf-sass-starter
search_client_destination_prefix
.search_client_id
to configure label
for
and input
name
attributes.vf-form--search vf-form--search--responsive
autofocus
on search input
File system location: components/vf-search-client-side
Find an issue on this page? Propose a change or discuss it.