From a2b6296f2e4c39af19505757c9031f60621ed096 Mon Sep 17 00:00:00 2001 From: LukaDev <47296785+lukadev-0@users.noreply.github.com> Date: Tue, 13 Aug 2024 14:53:57 +0200 Subject: [PATCH] feat(website): home page --- website/bun.lockb | Bin 145134 -> 145442 bytes website/eslint.config.js | 34 +++++----- website/package.json | 6 +- website/postcss.config.js | 6 +- website/src/app.css | 48 +++++++++++++- website/src/app.d.ts | 2 +- website/src/lib/registry-api.ts | 31 +++++++++ website/src/routes/+layout.server.ts | 9 +++ website/src/routes/+layout.svelte | 1 + website/src/routes/+page.server.ts | 8 +++ website/src/routes/+page.svelte | 42 ++++++++++++- website/src/routes/Hero.svelte | 90 +++++++++++++++++++++++++++ website/svelte.config.js | 14 ++--- website/tailwind.config.ts | 46 ++++++++++++-- website/vite.config.ts | 8 +-- 15 files changed, 302 insertions(+), 43 deletions(-) create mode 100644 website/src/lib/registry-api.ts create mode 100644 website/src/routes/+layout.server.ts create mode 100644 website/src/routes/+page.server.ts create mode 100644 website/src/routes/Hero.svelte diff --git a/website/bun.lockb b/website/bun.lockb index 8376cc3e8ac093f8c05adcbd2e8e2a0f9378344a..e99d10aaa3ce5983463b59419ba493a5f842cda0 100755 GIT binary patch delta 26164 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 delta 25763 zcmeHv33QFu*Y|U-TyjGs#>|Ki5kv;b4Uv1r%r%7)QqxUxBdL(t*h;ij6s`1#6ETLW znFbLvLAA6sR7(?6Q&mHiDs8Fh{q1KE|GxUY|MkA#`>pk@)o1zLefB>4411q_hTP{m zD}S-S{j>f2fR=*>{<6?@h@bn8U*kejC!G&$tuJ`Xr*4f2+v8Tw|76?7ts}#95syqjE z1D_4r2s9eB8E6n_6VQ69{1>$91O5bPQ_wA-jdPHgPYKWrP^w^%${RtcAx}^bP$y7F z(6rRdtoY1KDb_*Z2Y}*V?s)6?)Z_$7vSr3)C#NJxo=|pyygFz@&|hjPv_hpvKyxT# z3la@L7lYOZovG4Hm5x%WMWsfS`l!@NrH^Y$QazNvq0+M|J*?7V(7MQ9uF`omr5sr> zRTU(w)EQ$^2Z~M68*-rmlw54fOi3P}B}r3Y7FnF8(#I-IROw<@NpePhifzJp8p=HI zq(4oivp@~t6KpxQv^L3^(nd7k1i=VYKpAt~75)w=6|4lU4H}Jn7@OM~v^i)aP?9HS zwi%O>8YivBc#(cR$YD!v@|f|d8Hgr(l}}6_pU?)ubOC`x`KNQ#L|U7a)Oc$adXtho zE;&m&jX)rU2N)l+Bn|;W6_2$|oNs zSu%JlifzYN7Y(nVEL2AuPYJ=X!Cs|X*B0nAOB2Oh*GuxokV-mrm zo}AqFzDj{vpk$%-wFywi__vTGcs=(C>N{BgF7F*f9BA(@bzA;)e~J0(9e#hRIfc_}%ghfPr6YxI!Ty}R|49t-eP(IYsW zB4J;cvds7!m4>i1*)roLX+7j9lG_uM^e0=#rJ#sZ2%ZLFE+|FBG?ix9GE-9~*re_4 z)pc<_66BI4plax(PDHHU?w}0C05w02h8<5w@aS7^np&X^lsfn-DAiNiQ7IR#@><8@ zlTybfCs;EwY}N#LBW-&m45kK6CS@72j-NcvniZdvnH`^D&9q6Qd0BOr9CIh7`m7|| zcXdMWbx;2R)9a$if%N`_%lLdpapk~M=?3Q4*HP{%SS*ivXOy<<^2b_JB= zXF$mVpQ^kqGsBvOGPcZdZEWKwNV^~>|8D`MflIKZXIl|F%hhu4f;K>e<{FToeZsN7 z;u;1@4Gb8d6#S!~LNik{;%POk9j)Y#gNw%{XJ%zu$0yL-It_VEl*>pSmtjp*<{BCD z?m(rZIiQrEJU+>mk(`y8JU%gne{JuXb5t#uX-$BgSS2%Lhe)3yO3WRP;a7($bL$j%>Udg4a^^U!au-xyTV4qK5f$Zss-z*`7_lHO$DWfrIE@i`P&G^(i@;8Kc&)+qZ9)$v#lvGwk>!^ ziUAKKsArg$a&(rAR`z%pAP14QI*hR@dNH6h_7TXZ!_ALzl7tmL_W~%5^%+nKLOO*d zW=qo86k9e%ND2Tb`WwQ}luw??u!Ap$@pOmAIrT7VR9uhjI-tKMD1Jz=O|Yh9+obqZ z%yHyhg+B@yRqo{$p&xzN)#cQ7q(;f9diGi>11Y7%$>*{F z*skm}LU+l)W4%nwjW6;tvoXBf%dA`Hz}*{}boU&1Y$Fp3=8GDc^&uF=etc=8 z2>o=V`pBs-pQqg5WJP9^Q(oR3?U3lrmo_%Dp0aWmC%9Qo&3T?W^E~AN_x9vojXT=O z32JA<^VGfPsR+bmccmB4Q=dLhIo8#32O-r}))UWD=bxtbbTzR1{oao9cd`$))Ec{C8B3C0D#fP;p>lVB5!WJgoH*UP5g~?FU9i2xVjFUz* zALeJ)6}t06Ka=4hvXsJ9eJFQpY1U2l;IS=D`dwHZGq_iy2tzAR7=`lHxcB&Qdob9Y zbM1I#OQUX!Cy(_v>3@RI#4ompU@dvMzu7Rt3p|uyLrbG!F*qus=S60t;hLIfCv(kl zidHl!FCJX@bIrxzs9ZH()XZqOplV9IC?edxF$NV`_HrdD;K&L)a*}RsV;`^4TY%ZHw24x$j!ZC|Q8~uF;hlQC92)(-B`FkT9pskhf$Jw%k3Q

H@ME=;2Y#U21kCY#;yKFL%ZfmEp~DX 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 diff --git a/website/eslint.config.js b/website/eslint.config.js index 62dbd03..b36887c 100644 --- a/website/eslint.config.js +++ b/website/eslint.config.js @@ -1,33 +1,33 @@ -import js from '@eslint/js'; -import ts from 'typescript-eslint'; -import svelte from 'eslint-plugin-svelte'; -import prettier from 'eslint-config-prettier'; -import globals from 'globals'; +import js from "@eslint/js" +import ts from "typescript-eslint" +import svelte from "eslint-plugin-svelte" +import prettier from "eslint-config-prettier" +import globals from "globals" /** @type {import('eslint').Linter.Config[]} */ export default [ js.configs.recommended, ...ts.configs.recommended, - ...svelte.configs['flat/recommended'], + ...svelte.configs["flat/recommended"], prettier, - ...svelte.configs['flat/prettier'], + ...svelte.configs["flat/prettier"], { languageOptions: { globals: { ...globals.browser, - ...globals.node - } - } + ...globals.node, + }, + }, }, { - files: ['**/*.svelte'], + files: ["**/*.svelte"], languageOptions: { parserOptions: { - parser: ts.parser - } - } + parser: ts.parser, + }, + }, }, { - ignores: ['build/', '.svelte-kit/', 'dist/'] - } -]; + ignores: ["build/", ".svelte-kit/", "dist/"], + }, +] diff --git a/website/package.json b/website/package.json index 1591f04..8f26b4b 100644 --- a/website/package.json +++ b/website/package.json @@ -33,5 +33,9 @@ "typescript-eslint": "^8.0.0", "vite": "^5.0.3" }, - "type": "module" + "type": "module", + "dependencies": { + "@fontsource-variable/nunito-sans": "^5.0.14", + "date-fns": "^3.6.0" + } } diff --git a/website/postcss.config.js b/website/postcss.config.js index 0f77216..1a52624 100644 --- a/website/postcss.config.js +++ b/website/postcss.config.js @@ -1,6 +1,6 @@ export default { plugins: { tailwindcss: {}, - autoprefixer: {} - } -}; + autoprefixer: {}, + }, +} diff --git a/website/src/app.css b/website/src/app.css index a31e444..2bf5b4f 100644 --- a/website/src/app.css +++ b/website/src/app.css @@ -1,3 +1,45 @@ -@import 'tailwindcss/base'; -@import 'tailwindcss/components'; -@import 'tailwindcss/utilities'; +@import "tailwindcss/base"; +@import "tailwindcss/components"; +@import "tailwindcss/utilities"; + +:root { +} + +@media (prefers-color-scheme: dark) { + :root { + --color-background: 10 7 4; + --color-card: 28 22 17; + --color-card-hover: 40 32 25; + + --color-body: 198 167 140; + --color-heading: 227 213 200; + --color-light: 255 255 255; + + --color-input-bg: 22 15 8; + --color-input-border: 82 60 41; + --color-placeholder: 169 147 128; + + --color-primary: 241 157 30; + --color-primary-hover: 255 172 42; + --color-primary-fg: var(--color-background); + } +} + +html { + scroll-padding-top: theme(spacing.16); +} + +body { + background-color: theme(colors.background); + color: theme(colors.body); +} + +@keyframes cursor-blink { + 0%, + 100% { + opacity: 1; + } + 50% { + opacity: 0; + } +} diff --git a/website/src/app.d.ts b/website/src/app.d.ts index 743f07b..f70d0e1 100644 --- a/website/src/app.d.ts +++ b/website/src/app.d.ts @@ -10,4 +10,4 @@ declare global { } } -export {}; +export {} diff --git a/website/src/lib/registry-api.ts b/website/src/lib/registry-api.ts new file mode 100644 index 0000000..aa5a7d1 --- /dev/null +++ b/website/src/lib/registry-api.ts @@ -0,0 +1,31 @@ +import { PUBLIC_REGISTRY_URL } from "$env/static/public" + +export type PackageResponse = { + name: string + version: string + target: TargetInfo + description: string + published_at: string + license: string +} + +export type TargetInfo = { + kind: TargetKind + lib: boolean + bin: boolean +} + +export type TargetKind = "roblox" | "lune" | "luau" + +export async function fetchRegistry( + path: string, + fetcher: typeof fetch, + options?: RequestInit, +): Promise { + const response = await fetcher(new URL(path, PUBLIC_REGISTRY_URL), options) + if (!response.ok) { + throw new Error(`Failed to fetch from registry: ${response.status} ${response.statusText}`) + } + + return response.json() +} diff --git a/website/src/routes/+layout.server.ts b/website/src/routes/+layout.server.ts new file mode 100644 index 0000000..19f1a3a --- /dev/null +++ b/website/src/routes/+layout.server.ts @@ -0,0 +1,9 @@ +import { ISR_BYPASS_TOKEN } from "$env/static/private" +import type { Config } from "@sveltejs/adapter-vercel" + +export const config: Config = { + isr: { + expiration: 30 * 60, + bypassToken: ISR_BYPASS_TOKEN, + }, +} diff --git a/website/src/routes/+layout.svelte b/website/src/routes/+layout.svelte index e551b53..ed8e2ef 100644 --- a/website/src/routes/+layout.svelte +++ b/website/src/routes/+layout.svelte @@ -1,4 +1,5 @@ diff --git a/website/src/routes/+page.server.ts b/website/src/routes/+page.server.ts new file mode 100644 index 0000000..df30f7d --- /dev/null +++ b/website/src/routes/+page.server.ts @@ -0,0 +1,8 @@ +import { fetchRegistry, type PackageResponse } from "$lib/registry-api" +import type { PageServerLoad } from "./$types" + +export const load: PageServerLoad = async ({ fetch }) => { + const packages = await fetchRegistry("search", fetch) + + return { packages } +} diff --git a/website/src/routes/+page.svelte b/website/src/routes/+page.svelte index 5982b0a..7553156 100644 --- a/website/src/routes/+page.svelte +++ b/website/src/routes/+page.svelte @@ -1,2 +1,40 @@ -

Welcome to SvelteKit

-

Visit kit.svelte.dev to read the documentation

+ + + + +
+

+ Recently Published +

+ +
+ {#each data.packages as pkg} + {@const [scope, name] = pkg.name.split("/")} + {@const targetName = pkg.target.kind[0].toUpperCase() + pkg.target.kind.slice(1)} + +
+

+ + {scope}/{name} + +

+
v{pkg.version} ยท {targetName}
+

{pkg.description}

+
+ +
+
+ {/each} +
+
diff --git a/website/src/routes/Hero.svelte b/website/src/routes/Hero.svelte new file mode 100644 index 0000000..b2acc55 --- /dev/null +++ b/website/src/routes/Hero.svelte @@ -0,0 +1,90 @@ + + +
+

+ Manage your packages
+ for Luau + +

+ +

+ A package manager for the Luau programming language, supporting multiple runtimes including + Roblox and Lune. +

+ + + Get Started + +
diff --git a/website/svelte.config.js b/website/svelte.config.js index 3850651..1509ec2 100644 --- a/website/svelte.config.js +++ b/website/svelte.config.js @@ -1,16 +1,16 @@ -import { mdsvex } from 'mdsvex'; -import { vitePreprocess } from '@sveltejs/vite-plugin-svelte'; -import adapter from '@sveltejs/adapter-vercel'; +import { mdsvex } from "mdsvex" +import { vitePreprocess } from "@sveltejs/vite-plugin-svelte" +import adapter from "@sveltejs/adapter-vercel" /** @type {import('@sveltejs/kit').Config} */ const config = { preprocess: [vitePreprocess(), mdsvex()], kit: { - adapter: adapter({}) + adapter: adapter({}), }, - extensions: ['.svelte', '.svx'] -}; + extensions: [".svelte", ".svx"], +} -export default config; +export default config diff --git a/website/tailwind.config.ts b/website/tailwind.config.ts index d4e76e3..3102833 100644 --- a/website/tailwind.config.ts +++ b/website/tailwind.config.ts @@ -1,12 +1,48 @@ -import type { Config } from 'tailwindcss'; +import type { Config } from "tailwindcss" +import defaultTheme from "tailwindcss/defaultTheme" export default { - content: ['./src/**/*.{html,js,svelte,ts}'], + content: ["./src/**/*.{html,js,svelte,ts}"], theme: { - extend: {} + extend: { + fontFamily: { + sans: ["Nunito Sans Variable", ...defaultTheme.fontFamily.sans], + }, + colors: { + background: "rgb(var(--color-background) / )", + card: { + DEFAULT: "rgb(var(--color-card) / )", + hover: "rgb(var(--color-card-hover) / )", + }, + + body: "rgb(var(--color-body) / )", + heading: "rgb(var(--color-heading) / )", + light: "rgb(var(--color-light) / )", + + input: { + bg: "rgb(var(--color-input-bg) / )", + border: "rgb(var(--color-input-border) / )", + }, + placeholder: "rgb(var(--color-placeholder) / )", + + primary: { + DEFAULT: "rgb(var(--color-primary) / )", + hover: "rgb(var(--color-primary-hover) / )", + fg: "rgb(var(--color-primary-fg) / )", + }, + }, + animation: { + "cursor-blink": "cursor-blink 1s ease-in-out 500ms infinite", + }, + borderRadius: { + none: "0", + sm: `${4 / 16}rem`, + DEFAULT: `${8 / 16}rem`, + }, + }, }, // eslint-disable-next-line @typescript-eslint/no-require-imports - plugins: [require('@tailwindcss/typography')] -} as Config; + plugins: [require("@tailwindcss/typography")], +} as Config diff --git a/website/vite.config.ts b/website/vite.config.ts index bbf8c7d..c3c83b8 100644 --- a/website/vite.config.ts +++ b/website/vite.config.ts @@ -1,6 +1,6 @@ -import { sveltekit } from '@sveltejs/kit/vite'; -import { defineConfig } from 'vite'; +import { sveltekit } from "@sveltejs/kit/vite" +import { defineConfig } from "vite" export default defineConfig({ - plugins: [sveltekit()] -}); + plugins: [sveltekit()], +})