nicco.io/src/routes/search.svelte

71 lines
1.5 KiB
Svelte
Raw Normal View History

2020-12-06 17:46:18 +01:00
<script context="module">
2021-01-27 12:42:00 +01:00
export async function preload({ query }) {
2020-12-06 17:46:18 +01:00
const prebuilt = await this.fetch(`/search.json`).then((res) => res.json())
2021-01-27 13:01:26 +01:00
return { prebuilt }
2020-12-06 17:46:18 +01:00
}
</script>
<script>
2021-01-27 13:01:26 +01:00
import lunr from 'lunr'
2021-01-27 12:42:00 +01:00
import { onMount } from 'svelte'
2020-12-06 17:46:18 +01:00
import SearchResult from '../components/SearchResult.svelte'
import SimplePage from '../components/SimplePage.svelte'
2021-01-27 13:01:26 +01:00
export let prebuilt
2020-12-06 17:46:18 +01:00
let needle
let results = []
2021-01-27 13:01:26 +01:00
const idx = lunr.Index.load(prebuilt)
2020-12-06 17:46:18 +01:00
async function search(needle) {
if (!needle || !idx) {
results = []
} else {
let found = idx.search(needle + '~1')
if (!found.length) found = idx.search(needle + '*')
results = found.slice(0, 20)
}
}
2021-01-27 12:42:00 +01:00
$: if (needle) {
if (typeof window !== 'undefined') {
window.history.replaceState(null, null, `/search?q=${needle || ''}`)
}
search(needle)
}
onMount(() => {
needle = new URLSearchParams(window.location.search).get('q')
})
2020-12-06 17:46:18 +01:00
</script>
2021-01-27 12:42:00 +01:00
<SimplePage title="Search" expanded={false}>
<input bind:value={needle} placeholder="needle" />
<ul>
{#each results as result (result.ref)}
<SearchResult {result} />
{/each}
</ul>
</SimplePage>
2020-12-06 17:46:18 +01:00
<style>
input {
appearance: none;
2021-02-10 11:41:19 +01:00
-webkit-appearance: none;
2020-12-06 17:46:18 +01:00
margin: 0;
padding: 0.5rem;
font-size: 1em;
width: 100%;
outline: none;
2021-01-27 12:42:00 +01:00
border: 2px solid var(--clr-primary);
2021-02-10 11:41:19 +01:00
border-radius: 0;
2020-12-06 17:46:18 +01:00
}
ul {
margin-top: 2em;
list-style: none;
padding: 0;
}
</style>