Skip to content

Commit 8b16ce2

Browse files
committed
feat: docs
1 parent 24550e0 commit 8b16ce2

23 files changed

Lines changed: 337 additions & 17 deletions

bun.lock

Lines changed: 42 additions & 1 deletion
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

package.json

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,13 @@
11
{
22
"name": "site",
33
"version": "0.0.1",
4+
"license": "MIT",
45
"scripts": {
56
"dev": "vite dev",
67
"build": "vite build && npm run prepack",
78
"preview": "vite preview",
89
"prepare": "svelte-kit sync || echo ''",
9-
"prepack": "svelte-kit sync && svelte-package && publint",
10+
"prepack": "svelte-kit sync && svelte-package",
1011
"check": "svelte-kit sync && svelte-check --tsconfig ./tsconfig.json",
1112
"check:watch": "svelte-kit sync && svelte-check --tsconfig ./tsconfig.json --watch"
1213
},
@@ -28,9 +29,11 @@
2829
}
2930
},
3031
"peerDependencies": {
31-
"svelte": "^5.0.0"
32+
"svelte": "^5.0.0",
33+
"@sveltejs/kit": "^2.47.1"
3234
},
3335
"devDependencies": {
36+
"@poppanator/sveltekit-svg": "^5.0.0-svelte5.5",
3437
"@sveltejs/adapter-static": "^3.0.10",
3538
"@sveltejs/kit": "^2.47.1",
3639
"@sveltejs/package": "^2.5.4",
Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
<script lang="ts">
2+
import { page } from "$app/state";
3+
import type { ArticleCategory } from "$lib/types.ts";
4+
5+
let { articleList }: { articleList: ArticleCategory[] } = $props();
6+
const currentArticle = $derived(() => {
7+
return articleList.flatMap((category) => category.children)
8+
.find((article) => (page.url.pathname + "/") === `/docs/${article.slug}`);
9+
});
10+
</script>
11+
12+
<div class="bg-zinc-900 left-0 top-0 pt-4 px-8 min-w-80 min-h-screen flex flex-col">
13+
{#each articleList as category}
14+
<hr class="my-4 text-zinc-700" />
15+
16+
{#if category.title}
17+
<b class="uppercase mb-2">{category.title}</b>
18+
{/if}
19+
20+
{#each category.children as article}
21+
<a href={`/docs/${article.slug}`} class="{article === currentArticle() ? "text-sky-300" : "text-zinc-400"} hover:cursor-pointer hover:text-sky-300 hover:duration-500">{article.title}</a>
22+
{/each}
23+
{/each}
24+
</div>

src/lib/components/Search.svelte

Lines changed: 68 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,68 @@
1+
<script lang="ts">
2+
import type { SearchEntry } from "$lib/types.ts";
3+
import type { FormEventHandler } from "svelte/elements";
4+
5+
function mapEntryWithRank(entry: SearchEntry, keywords: string[]): SearchEntry & { rank: number } {
6+
console.log({ entry, keywords, rank: keywords.filter((keyword) => entry.title.toLowerCase().includes(keyword) || entry.content.includes(keyword)).length })
7+
return {
8+
...entry,
9+
rank: keywords.filter((keyword) => entry.title.toLowerCase().includes(keyword) || entry.content.includes(keyword)).length
10+
}
11+
}
12+
13+
function onEscape(event: KeyboardEvent) {
14+
if (event.key === "Escape")
15+
isOpen = false;
16+
}
17+
18+
function onKeyPress() {
19+
const keywords = value.split(" ").map((keyword) => keyword.toLowerCase());
20+
searchEntries = searchIndex.map((entry) => mapEntryWithRank(entry, keywords))
21+
.filter((entry) => entry.rank !== 0)
22+
.sort((a, b) => {
23+
if (a.rank > b.rank) return -1;
24+
else if (a.rank < b.rank) return 1;
25+
else return 0;
26+
});
27+
}
28+
29+
export const open = () => {
30+
isOpen = true;
31+
}
32+
33+
export const close = () => {
34+
isOpen = false;
35+
}
36+
37+
let { searchIndex }: { searchIndex: SearchEntry[] } = $props();
38+
let searchEntries = $state(searchIndex);
39+
let isOpen = $state(false);
40+
let value = $state("");
41+
</script>
42+
43+
44+
{#if isOpen}
45+
46+
<div class="absolute left-0 top-0 w-screen h-screen bg-black opacity-35"></div>
47+
48+
<!-- svelte-ignore a11y_click_events_have_key_events -->
49+
<!-- svelte-ignore a11y_no_static_element_interactions -->
50+
<div onclick={close} class="absolute left-0 top-0 w-screen h-screen flex justify-center items-center">
51+
<div class="bg-zinc-800 rounded-lg w-1/3 h-3/4 p-4 flex flex-col">
52+
<input oninput={onKeyPress} bind:value={value} type="text" placeholder="Search" class="bg-zinc-900 h-12 px-4 rounded-md hover:border-sky-300 hover:border focus:border-sky-300 focus:border-2 focus:outline-none focus:ring-0" />
53+
54+
{#each searchEntries as searchEntry}
55+
<a href={`/docs/${searchEntry.slug}`} onclick={close} aria-label={searchEntry.title} class="border-4 border-zinc-700 rounded-md mt-4 px-2 py-1 flex flex-row hover:text-sky-300 hover:border-sky-300">
56+
{#if searchEntry.category !== ""}
57+
<span class="uppercase font-bold">{searchEntry.category}</span>
58+
<span class="ml-2">〉</span>
59+
{/if}
60+
61+
<span>{searchEntry.title}</span>
62+
</a>
63+
{/each}
64+
</div>
65+
</div>
66+
{/if}
67+
68+
<svelte:window on:keydown={onEscape} />

src/lib/components/Topbar.svelte

Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,31 @@
1+
<script lang="ts">
2+
import MagnifyingGlass from "$lib/icons/search.svg?url";
3+
import Search from "$lib/components/Search.svelte";
4+
import Discord from "$lib/icons/discord.svg?url";
5+
import GitHub from "$lib/icons/github.svg?url";
6+
import type { SearchEntry } from "$lib/types.ts";
7+
8+
let { searchIndex }: { searchIndex: SearchEntry[] } = $props();
9+
let search: Search;
10+
11+
function onClick() {
12+
search.open();
13+
}
14+
</script>
15+
16+
<Search searchIndex={searchIndex} bind:this={search} />
17+
18+
<div class="bg-zinc-900 border-l border-l-zinc-950 w-full h-14 flex flex-row items-center">
19+
<button onclick={onClick} class="rounded-md border border-zinc-950 bg-zinc-950 text-zinc-400 hover:border-sky-300 hover:text-gray-300 hover:cursor-pointer duration-500 ml-4 px-5 py-1 flex flex-row items-center">
20+
<img src={MagnifyingGlass} alt="Search" class="h-4 mr-2 fill-white stroke-white" />
21+
Search
22+
</button>
23+
24+
<a href="https://discord.gg/KrHK7B39pY" class="ml-auto mr-4">
25+
<img src={Discord} alt="Discord" class="h-6" />
26+
</a>
27+
28+
<a href="https://github.com/HytaleModding/site" class="mr-4">
29+
<img src={GitHub} alt="GitHub" class="h-6" />
30+
</a>
31+
</div>

src/lib/icons/discord.svg

Lines changed: 1 addition & 0 deletions
Loading

src/lib/icons/github.svg

Lines changed: 1 addition & 0 deletions
Loading

src/lib/icons/search.svg

Lines changed: 4 additions & 0 deletions
Loading

src/lib/index.ts

Lines changed: 0 additions & 1 deletion
This file was deleted.

0 commit comments

Comments
 (0)