Skip to content

feat: offline search #2110

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 35 commits into from
Apr 11, 2023
Merged
Changes from all commits
Commits
Show all changes
35 commits
Select commit Hold shift + click to select a range
13b0bb3
wip
Akryum Mar 11, 2023
c45c29f
feat: it works!!!
Akryum Mar 20, 2023
b1ba8ce
Merge remote-tracking branch 'origin/master' into feat/offline-search
Akryum Mar 20, 2023
5f153b8
Merge remote-tracking branch 'upstream/main' into feat/offline-search
Akryum Mar 20, 2023
968cfb9
chore: rename component var
Akryum Mar 20, 2023
b9c4e22
lint: fix
Akryum Mar 20, 2023
d0c8352
Merge branch 'main' into feat/offline-search
Akryum Mar 20, 2023
bd9404d
fix: don't include vite plugin if algolia
Akryum Mar 20, 2023
9838db9
fix: disable keyboard shortcut when search disabled
Akryum Mar 20, 2023
4b9530f
lint: fix
Akryum Mar 20, 2023
89accd5
test: fix
Akryum Mar 20, 2023
1003bdd
feat: improved relevancy
Akryum Mar 20, 2023
8d001c1
feat: bold main title
Akryum Mar 20, 2023
1ca4f71
refactor(config): search => offlineSearch
Akryum Mar 20, 2023
209ec3d
lint: fix
Akryum Mar 20, 2023
647692c
feat: translatable text
Akryum Mar 20, 2023
32d4476
lint: fix
Akryum Mar 20, 2023
2b29095
fix: keyboard shortcut padding
Akryum Mar 20, 2023
f30baa3
feat: match highlighting
Akryum Mar 20, 2023
71ae8c0
feat: toggle detailed list
Akryum Mar 20, 2023
6da2597
feat: reset button
Akryum Mar 20, 2023
3784e7c
feat: mobile UX
Akryum Mar 21, 2023
7959ede
fix(config): put `translations` into `locales`
Akryum Mar 21, 2023
b16112c
docs: offline search
Akryum Mar 21, 2023
bad89a0
lint: fix
Akryum Mar 21, 2023
a875d7b
feat: split index per locale
Akryum Mar 21, 2023
28ab078
lint: fix
Akryum Mar 21, 2023
6cca13f
fix: route rewrites and duplicate slash
Akryum Mar 28, 2023
4e0a0db
lint: fix
Akryum Mar 28, 2023
9589bca
fix: CR
Akryum Apr 4, 2023
702788d
Merge remote-tracking branch 'upstream/main' into feat/offline-search
Akryum Apr 4, 2023
01d358a
fix: detailed view errors
Akryum Apr 6, 2023
c6a718a
fix: don't display vue warning message
Akryum Apr 6, 2023
efd65fc
fix: detailed view in production
Akryum Apr 6, 2023
58802f9
fix: don't display no result while search is debounced
Akryum Apr 6, 2023
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
14 changes: 8 additions & 6 deletions docs/.vitepress/config.ts
Original file line number Diff line number Diff line change
@@ -47,11 +47,13 @@ export default defineConfig({
copyright: 'Copyright © 2019-present Evan You'
},

algolia: {
appId: '8J64VVRP8K',
apiKey: 'a18e2f4cc5665f6602c5631fd868adfd',
indexName: 'vitepress'
},
// algolia: {
// appId: '8J64VVRP8K',
// apiKey: 'a18e2f4cc5665f6602c5631fd868adfd',
// indexName: 'vitepress'
// },

offlineSearch: true,

carbonAds: {
code: 'CEBDT27Y',
@@ -209,7 +211,7 @@ function sidebarReference() {
link: '/reference/default-theme-last-updated'
},
{
text: 'Algolia Search',
text: 'Search',
link: '/reference/default-theme-search'
},
{
Binary file added docs/public/search.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
58 changes: 55 additions & 3 deletions docs/reference/default-theme-search.md
Original file line number Diff line number Diff line change
@@ -1,5 +1,59 @@
# Search

## Offline Search

VitePress supports fuzzy full-text search using a in-browser index thanks to [minisearch](https://github.com/lucaong/minisearch/). You can enable it in your `.vitepress/config.ts` with the `offlineSearch` theme config:

```ts
import { defineConfig } from 'vitepress'

export default defineConfig({
themeConfig: {
offlineSearch: true
}
})
```

Example result:

![screenshot of the search modal](/search.png)

Alternatively, you can use [Algolia DocSearch](#algolia-search) or some community plugins like <https://www.npmjs.com/package/vitepress-plugin-search> or <https://www.npmjs.com/package/vitepress-plugin-pagefind>.
### i18n

You can use a config like this to use multilingual search:

```ts
import { defineConfig } from 'vitepress'

export default defineConfig({
themeConfig: {
offlineSearch: {
locales: {
zh: {
translations: {
button: {
buttonText: '搜索文档',
buttonAriaLabel: '搜索文档'
},
modal: {
noResultsText: '无法找到相关结果',
resetButtonTitle: '清除查询条件',
footer: {
selectText: '选择',
navigateText: '切换'
}
}
}
}
}
}
}
})
```

## Algolia Search

VitePress supports searching your docs site using [Algolia DocSearch](https://docsearch.algolia.com/docs/what-is-docsearch). Refer their getting started guide. In your `.vitepress/config.ts` you'll need to provide at least the following to make it work:

```ts
@@ -16,9 +70,7 @@ export default defineConfig({
})
```

If you are not eligible for DocSearch, you might wanna use some community plugins like <https://github.com/emersonbottero/vitepress-plugin-search> or explore some custom solutions on [this GitHub thread](https://github.com/vuejs/vitepress/issues/670).

## i18n
### i18n

You can use a config like this to use multilingual search:

1 change: 1 addition & 0 deletions package.json
Original file line number Diff line number Diff line change
@@ -93,6 +93,7 @@
"@vue/devtools-api": "^6.5.0",
"@vueuse/core": "^9.13.0",
"body-scroll-lock": "4.0.0-beta.0",
"minisearch": "^6.0.1",
"shiki": "^0.14.1",
"vite": "^4.2.1",
"vue": "^3.2.47"
7 changes: 7 additions & 0 deletions pnpm-lock.yaml

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

5 changes: 5 additions & 0 deletions src/client/shim.d.ts
Original file line number Diff line number Diff line change
@@ -20,3 +20,8 @@ declare module '@theme/index' {
const theme: Theme
export default theme
}

declare module '@offlineSearchIndex' {
const data: Record<string, () => Promise<{ default: string }>>
export default data
}
Loading