diff --git a/website/bun.lockb b/website/bun.lockb index 3f6dea3..6e232ba 100755 Binary files a/website/bun.lockb and b/website/bun.lockb differ diff --git a/website/package.json b/website/package.json index 9618866..358905e 100644 --- a/website/package.json +++ b/website/package.json @@ -1,57 +1,57 @@ { - "name": "website", - "version": "0.0.1", - "private": true, - "scripts": { - "dev": "vite dev", - "build": "vite build", - "preview": "vite preview", - "check": "svelte-kit sync && svelte-check --tsconfig ./tsconfig.json", - "check:watch": "svelte-kit sync && svelte-check --tsconfig ./tsconfig.json --watch", - "lint": "prettier --check . && eslint .", - "format": "prettier --write ." - }, - "devDependencies": { - "@sveltejs/adapter-vercel": "^5.4.3", - "@sveltejs/kit": "^2.0.0", - "@sveltejs/vite-plugin-svelte": "^3.0.0", - "@tailwindcss/typography": "^0.5.14", - "@types/eslint": "^9.6.0", - "@types/gunzip-maybe": "^1.4.2", - "@types/tar-stream": "^3.1.3", - "autoprefixer": "^10.4.20", - "eslint": "^9.0.0", - "eslint-config-prettier": "^9.1.0", - "eslint-plugin-svelte": "^2.36.0", - "globals": "^15.0.0", - "mdsvex": "^0.11.2", - "prettier": "^3.1.1", - "prettier-plugin-svelte": "^3.1.2", - "prettier-plugin-tailwindcss": "^0.6.5", - "svelte": "^5.0.0-next.1", - "svelte-check": "^3.6.0", - "tailwindcss": "^3.4.9", - "typescript": "^5.0.0", - "typescript-eslint": "^8.0.0", - "vite": "^5.0.3" - }, - "type": "module", - "dependencies": { - "@fontsource-variable/nunito-sans": "^5.0.14", - "@shikijs/rehype": "^1.13.0", - "bits-ui": "^0.21.13", - "date-fns": "^3.6.0", - "gunzip-maybe": "^1.4.2", - "lucide-svelte": "^0.427.0", - "rehype-raw": "^7.0.0", - "rehype-sanitize": "^6.0.0", - "rehype-stringify": "^10.0.0", - "remark-gemoji": "^8.0.0", - "remark-gfm": "^4.0.0", - "remark-parse": "^11.0.0", - "remark-rehype": "^11.1.0", - "shiki": "^1.13.0", - "tar-stream": "^3.1.7", - "unified": "^11.0.5" - } + "name": "website", + "version": "0.0.1", + "private": true, + "scripts": { + "dev": "vite dev", + "build": "vite build", + "preview": "vite preview", + "check": "svelte-kit sync && svelte-check --tsconfig ./tsconfig.json", + "check:watch": "svelte-kit sync && svelte-check --tsconfig ./tsconfig.json --watch", + "lint": "prettier --check . && eslint .", + "format": "prettier --write ." + }, + "devDependencies": { + "@sveltejs/adapter-vercel": "^5.4.4", + "@sveltejs/kit": "^2.6.1", + "@sveltejs/vite-plugin-svelte": "^4.0.0-next.7", + "@tailwindcss/typography": "^0.5.15", + "@types/eslint": "^9.6.1", + "@types/gunzip-maybe": "^1.4.2", + "@types/tar-stream": "^3.1.3", + "autoprefixer": "^10.4.20", + "eslint": "^9.11.1", + "eslint-config-prettier": "^9.1.0", + "eslint-plugin-svelte": "^2.44.1", + "globals": "^15.9.0", + "mdsvex": "^0.12.3", + "prettier": "^3.3.3", + "prettier-plugin-svelte": "^3.2.7", + "prettier-plugin-tailwindcss": "^0.6.8", + "svelte": "^5.0.0-next.260", + "svelte-check": "^4.0.4", + "tailwindcss": "^3.4.13", + "typescript": "^5.6.2", + "typescript-eslint": "^8.7.0", + "vite": "^5.4.8" + }, + "type": "module", + "dependencies": { + "@fontsource-variable/nunito-sans": "^5.1.0", + "@shikijs/rehype": "^1.21.0", + "bits-ui": "^0.21.15", + "date-fns": "^4.1.0", + "gunzip-maybe": "^1.4.2", + "lucide-svelte": "^0.446.0", + "rehype-raw": "^7.0.0", + "rehype-sanitize": "^6.0.0", + "rehype-stringify": "^10.0.1", + "remark-gemoji": "^8.0.0", + "remark-gfm": "^4.0.0", + "remark-parse": "^11.0.0", + "remark-rehype": "^11.1.1", + "shiki": "^1.21.0", + "tar-stream": "^3.1.7", + "unified": "^11.0.5" + } } diff --git a/website/src/routes/search/+page.svelte b/website/src/routes/search/+page.svelte new file mode 100644 index 0000000..9886623 --- /dev/null +++ b/website/src/routes/search/+page.svelte @@ -0,0 +1,170 @@ + + +
+ {#await data.result} +
Loading...
+ +
+ {#each Array.from({ length: 10 }).map((_, i) => i) as i} +
+
+
...
+ +
+ +
+ ... +
+ +
+ ... +
+
+ {/each} +
+
+ {:then result} + {#if result.data.length === 0} +
+ +

No results

+

We didn't find any packages matching your search query.

+
+ {:else} + {#snippet pagination()} + { + const params = new URLSearchParams() + params.set("q", data.query) + params.set("page", page.toString()) + + goto(`/search?${params}`) + }} + let:pages + > +
+ + + + {#each pages as page (page.key)} + {#if page.type === "ellipsis"} +
...
+ {:else} + + {page.value} + + {/if} + {/each} + + + +
+
+ {/snippet} + +
+

{result.count} {result.count > 1 ? "results" : "result"}

+
+ {@render pagination()} +
+
+ +
+ {#each result.data as pkg} + {@const [scope, name] = pkg.name.split("/")} + + {#snippet timeAndVersion()} + + {" · "} + v{pkg.version} + {/snippet} + +
+
+

+ + {scope}/{name} + +

+ +
+ +

{pkg.description}

+ +
+ {pkg.targets.map((target) => TARGET_KIND_DISPLAY_NAMES[target.kind]).join(", ")} + + {" · "} + {@render timeAndVersion()} + +
+
+ {/each} +
+ +
+ {@render pagination()} +
+ {/if} + {:catch error} +
+

Error

+

{error.message}

+
+ {/await} +
diff --git a/website/src/routes/search/+page.ts b/website/src/routes/search/+page.ts new file mode 100644 index 0000000..1ddad36 --- /dev/null +++ b/website/src/routes/search/+page.ts @@ -0,0 +1,26 @@ +import { fetchRegistryJson, type SearchResponse } from "$lib/registry-api" +import type { PageLoad } from "./$types" + +const PAGE_SIZE = 50 + +export const load: PageLoad = async ({ fetch, url }) => { + const query = url.searchParams.get("q") ?? "" + + let page = parseInt(url.searchParams.get("page") ?? "1") + if (isNaN(page) || page < 1) { + page = 1 + } + + const params = new URLSearchParams() + params.set("query", query) + params.set("offset", String((page - 1) * PAGE_SIZE)) + + const result = fetchRegistryJson(`search?${params}`, fetch) + + return { + query, + page, + pageSize: PAGE_SIZE, + result, + } +}