Guide to install the search module in modal mode.
Become a backer or sponsor to support our work.
Please make sure you have meet the requirements.
There is an example site and it’s source code to help you get started.
There also a guide for integrating Docsy with the search module.
hugo.yaml
1module:
2 imports:
3 - path: github.com/hugomods/search
hugo.toml
1[module]
2 [[module.imports]]
3 path = 'github.com/hugomods/search'
hugo.json
1{
2 "module": {
3 "imports": [
4 {
5 "path": "github.com/hugomods/search"
6 }
7 ]
8 }
9}
You should specify the lang
and dir
attributes on <html>
tag of base template (layouts/_default/baseof.html
by default), so that the module can recognize and render in current page language.
1<html
2 lang="{{ .Lang }}"
3 {{ with .Language.LanguageDirection }}dir="{{ . }}"{{ end }}>
4 <!-- ... -->
5</html>
There are multiple approaches to include the CSS.
Recommended when you’re using Hugo pipes to build CSS from source, it combines your styles and search styles into one bundle file, which is helpful to reduce the HTTP requests.
1{{/* NOTE: we must change the CSS target to separate the style between LTR and RTL sites. */}}
2{{/* Otherwise, Hugo may treats it as the same style (cached). */}}
3{{/* Ignore it if your themes and sites aren't going to support RTL. */}}
4{{ $rtl := eq .Language.LanguageDirection "rtl" }}
5{{ $cssTarget := cond $rtl "css/main.rtl.css" "css/main.css" }}
6{{ $css := resources.Get "main.scss" | toCSS }}
7{{/* If you have a prebuilt CSS, replace the $css with the following. */}}
8{{ $css := resources.Get "main.css" }}
9{{ $searchCSS := partial "search/assets/css-resource" . }}
10{{ $css = slice $searchCSS $css | resources.Concat $cssTarget }}
11<link rel="stylesheet" href="{{ $css.RelPermalink }}" />
main.scss
/main.css
is your styles file, which located in the assets
folder, replace it with yours.slice $searchCSS $css
puts the $css
after $searchCSS
, so that $css
style can override the search’s.search/assets/css-resource
is a partial that returns a search CSS resource.1@import "search/scss/index";
This way is more complex than the former, you’ll need to take care of the PostCSS, Autoprefixer and RTLCSS. See how CSS resource partial does.
This approach generates a <link>
tag.
1{{ partial "search/assets/css" . }}
We can achieve this via two ways.
Recommended when you’re using Hugo pipes to build JS from source, it combines your JS and search JS into one bundle file, which is helpful to reduce the HTTP requests.
1{{ $js := resources.Get "main.ts" | js.Build }}
2{{/* If you have a prebuilt JS file, use the following instead. */}}
3{{ $js := resources.Get "main.js" }}
4{{ $searchJS := partial "search/assets/js-resource" . }}
5{{ $js = slice $js $searchJS | resources.Concat "js/main.js" }}
6<script src="{{ $js.RelPermalink }}" defer></script>
Please note that you should not set the
async
attribute on thescript
.
main.ts
/main.js
is your JavaScript file, which located in the assets
folder, replace it with yours.search/assets/js-resource
is a partial that returns a search JS resource.This partial will generate a <script>
tag.
1{{ partial "search/assets/js" . }}
This step is optional, you’re still be able to open the search modal by shortcuts (default to CTRL + K), but I recommend adding such a toggle button for getting better user experience, because users are not aware of these shortcuts.
Adjust the button to your theme UI, place it wherever you like, for example,
1<button class="search-modal-toggle">Search</button>
button
, since the module will listen the click
event on the HTML elements have the modal_toggle_selector specified class name (default to .search-modal-toggle
), this also means that the page can contain multiple toggle buttons.Append the SearchIndex
formats into outputs.home
.
hugo.yaml
1outputs:
2 home:
3 - HTML
4 - RSS
5 - SearchIndex
hugo.toml
1[outputs]
2 home = ['HTML', 'RSS', 'SearchIndex']
hugo.json
1{
2 "outputs": {
3 "home": [
4 "HTML",
5 "RSS",
6 "SearchIndex"
7 ]
8 }
9}