diff --git a/src/routes/+layout.svelte b/src/routes/+layout.svelte index 4a067d9..a5f6f8f 100644 --- a/src/routes/+layout.svelte +++ b/src/routes/+layout.svelte @@ -2,7 +2,18 @@ // Styles: import "@/styles/globals.css"; + // Layout: + import Header from "@/components/layout/header.svelte"; + + // Providers: + import { ModeWatcher } from "mode-watcher"; + import Sidebar from "@/components/layout/sidebar.svelte"; + let { children } = $props(); -{@render children?.()} + +
+ + {@render children?.()} + diff --git a/src/routes/+page.svelte b/src/routes/+page.svelte index f5639d1..e4b779d 100644 --- a/src/routes/+page.svelte +++ b/src/routes/+page.svelte @@ -1,5 +1,147 @@ -

Welcome to SvelteKit

-

- Visit svelte.dev/docs/kit to read the - documentation -

+ + + + +
+
+
+
+ {#if !searchTerm} + +

+ {svgsData.length} + logos +

+ {:else} + +

+ {filteredSvgs.length} + logos +

+ {/if} +
+ +
+ + + {#each displaySvgs as svg} + + {/each} + + +
+
diff --git a/src/routes/+page.ts b/src/routes/+page.ts new file mode 100644 index 0000000..6946071 --- /dev/null +++ b/src/routes/+page.ts @@ -0,0 +1,45 @@ +import type { iSVG } from "@/types/svg"; +import type { Load } from "@sveltejs/kit"; + +import Fuse from "fuse.js"; +import { svgsData } from "@/data"; + +export const load: Load = ({ url }) => { + const searchParam = url.searchParams.get("search") || ""; + const sortParam = url.searchParams.get("sort") === "alphabetical"; + const latestSorted = [...svgsData].sort((a, b) => b.id! - a.id!); + const alphabeticallySorted = [...svgsData].sort((a, b) => + a.title.localeCompare(b.title), + ); + + let filteredSvgs: iSVG[] = []; + + if (!searchParam) { + filteredSvgs = sortParam ? alphabeticallySorted : latestSorted; + } else { + const fuse = new Fuse(svgsData, { + keys: ["title"], + threshold: 0.35, + ignoreLocation: true, + isCaseSensitive: false, + shouldSort: true, + }); + + if (searchParam.length < 3) { + const baseData = sortParam ? alphabeticallySorted : latestSorted; + filteredSvgs = baseData.filter((svg: iSVG) => + svg.title.toLowerCase().includes(searchParam.toLowerCase()), + ); + } else { + filteredSvgs = fuse.search(searchParam).map((result) => result.item); + } + } + + return { + searchTerm: searchParam, + sorted: sortParam, + initialSvgs: filteredSvgs, + latestSorted, + alphabeticallySorted, + }; +};