diff --git a/web/src/lib/api.server.ts b/web/src/lib/api.server.ts index 3e81a31..37a6c31 100644 --- a/web/src/lib/api.server.ts +++ b/web/src/lib/api.server.ts @@ -29,7 +29,7 @@ export async function apiFetch( }; // Remove custom fetch property from options - delete (fetchOptions as any).fetch; + delete (fetchOptions as Record).fetch; if (isUnixSocket) { fetchOptions.unix = upstreamUrl; diff --git a/web/src/lib/api.ts b/web/src/lib/api.ts index 2c6da6e..2745245 100644 --- a/web/src/lib/api.ts +++ b/web/src/lib/api.ts @@ -118,12 +118,9 @@ export async function deleteAdminTag(id: string): Promise { } // Admin Events API (currently mocked - no backend implementation yet) -export async function getAdminEvents(filters?: { - level?: string; - target?: string; - limit?: number; -}): Promise { +export async function getAdminEvents(): Promise { // TODO: Implement when events table is added to backend + // filters parameter will be added when backend implementation is complete return []; } diff --git a/web/src/lib/components/ProjectCard.svelte b/web/src/lib/components/ProjectCard.svelte index 07ad1cb..f37203f 100644 --- a/web/src/lib/components/ProjectCard.svelte +++ b/web/src/lib/components/ProjectCard.svelte @@ -12,10 +12,11 @@ let { project, class: className }: Props = $props(); - // Prefer demo URL, fallback to GitHub repo - const projectUrl = + // Prefer demo URL, fallback to GitHub repo (use $derived to react to project changes) + const projectUrl = $derived( project.demoUrl || - (project.githubRepo ? `https://github.com/${project.githubRepo}` : null); + (project.githubRepo ? `https://github.com/${project.githubRepo}` : null), + ); function formatDate(dateString: string): string { const date = new Date(dateString); diff --git a/web/src/lib/components/admin/ColorPicker.svelte b/web/src/lib/components/admin/ColorPicker.svelte index 06d9fe2..4ce5d45 100644 --- a/web/src/lib/components/admin/ColorPicker.svelte +++ b/web/src/lib/components/admin/ColorPicker.svelte @@ -77,7 +77,7 @@
{#if label} - +
{label}
{/if} @@ -94,7 +94,7 @@ style="background-color: #{preset.value}" title={preset.name} onclick={() => selectPreset(preset.value)} - /> + > {/each} @@ -147,7 +147,7 @@ class="size-10 shrink-0 rounded-md border-2 border-admin-border" style="background-color: #{selectedColor}" title="#{selectedColor}" - /> + >
{/if} diff --git a/web/src/routes/+page.svelte b/web/src/routes/+page.svelte index 60e839e..545c67f 100644 --- a/web/src/routes/+page.svelte +++ b/web/src/routes/+page.svelte @@ -3,16 +3,24 @@ import ProjectCard from "$lib/components/ProjectCard.svelte"; import PgpKeyModal from "$lib/components/PgpKeyModal.svelte"; import type { PageData } from "./$types"; - import type { SiteSettings } from "$lib/admin-types"; import MaterialSymbolsVpnKey from "~icons/material-symbols/vpn-key"; - let { data }: { data: PageData } = $props(); - const projects = data.projects; - // Type assertion needed until types are regenerated - const socialLinksWithIcons = (data as any).socialLinksWithIcons; + interface ExtendedPageData extends PageData { + socialLinksWithIcons: Array<{ + id: string; + platform: string; + label: string; + value: string; + icon: string; + iconSvg: string; + visible: boolean; + displayOrder: number; + }>; + } - // Get settings from parent layout - const settings = (data as any).settings as SiteSettings; + let { data }: { data: ExtendedPageData } = $props(); + const projects = $derived(data.projects); + const socialLinksWithIcons = $derived(data.socialLinksWithIcons); // Filter visible social links const visibleSocialLinks = $derived( @@ -36,18 +44,18 @@
{settings.identity.displayName},{data.settings.identity.displayName}, - {settings.identity.occupation} + {data.settings.identity.occupation}

- {settings.identity.bio} + {data.settings.identity.bio}

@@ -62,6 +70,7 @@ class="flex items-center gap-x-1.5 px-1.5 py-1 rounded-sm bg-zinc-100 dark:bg-zinc-900 shadow-sm hover:bg-zinc-200 dark:hover:bg-zinc-800 transition-colors" > + {@html link.iconSvg} handleDiscordClick(link.value)} > + {@html link.iconSvg} + {@html link.iconSvg} + > #{editColor} @@ -329,7 +329,7 @@
+ >
#{tag.color} diff --git a/web/src/routes/internal/ogp/generate/+server.ts b/web/src/routes/internal/ogp/generate/+server.ts index 81bde8d..f5044af 100644 --- a/web/src/routes/internal/ogp/generate/+server.ts +++ b/web/src/routes/internal/ogp/generate/+server.ts @@ -2,7 +2,7 @@ import type { RequestHandler } from "./$types"; import type { OGImageSpec } from "$lib/og-types"; import { loadOGFonts } from "$lib/og-fonts"; import { apiFetch } from "$lib/api.server"; -import type { Project } from "../../../projects/+page.server"; +import type { AdminProject } from "$lib/admin-types"; import { getLogger } from "@logtape/logtape"; import satori from "satori"; import { Resvg } from "@resvg/resvg-js"; @@ -154,7 +154,7 @@ async function getTemplateData(spec: OGImageSpec): Promise<{ }; case "project": try { - const projects = await apiFetch("/api/projects"); + const projects = await apiFetch("/api/projects"); const project = projects.find((p) => p.id === spec.id); if (project) { return {