From 5a87a079ebfe4b2a446c7d32548a28652f510478 Mon Sep 17 00:00:00 2001 From: Stan Runge Date: Sun, 25 Oct 2026 16:35:30 +0000 Subject: [PATCH] pc setup: hero falls back to the case present on the chosen day; add-ons (tilt pivot) are not counted as extra units in a slot card --- src/lib/pc/SetupCard.svelte | 3 ++- src/lib/pc/shared.ts | 6 ++++-- src/routes/trackers/pc/+page.svelte | 4 +++- 3 files changed, 9 insertions(+), 4 deletions(-) diff --git a/src/lib/pc/SetupCard.svelte b/src/lib/pc/SetupCard.svelte index 6a1326e..6814fab 100644 --- a/src/lib/pc/SetupCard.svelte +++ b/src/lib/pc/SetupCard.svelte @@ -10,6 +10,7 @@ slotIcon, slotLabel, thumb, + isAddOn, units, usageBadges, type Part @@ -34,7 +35,7 @@ } = $props(); const first = $derived(parts[0]); - const qty = $derived(parts.reduce((s, p) => s + units(p), 0)); + const qty = $derived(parts.reduce((s, p) => s + (isAddOn(p) ? 0 : units(p)), 0)); const image = $derived(parts.flatMap((p) => p.imageUrls)[0] ?? null); const names = $derived([...new Set(parts.map(displayName))]); const spec = $derived(keySpec(first)); diff --git a/src/lib/pc/shared.ts b/src/lib/pc/shared.ts index 16f537a..96bc6c1 100644 --- a/src/lib/pc/shared.ts +++ b/src/lib/pc/shared.ts @@ -201,6 +201,9 @@ export const presentAt = ( export type SlotCard = { key: string; slot: string; parts: Part[] }; /** Visible parts of one section on day `at`, one card per slot (several parts may share it). */ +/** An add-on (e.g. a tilt pivot) extends another part in the same slot card; it is not counted as an extra unit. */ +export const isAddOn = (p: { model: string }) => /\badd-on\b/i.test(p.model); + export function slotCards(parts: Part[], section: string, at: string): SlotCard[] { const cards = new Map(); for (const p of parts) { @@ -216,8 +219,7 @@ export function slotCards(parts: Part[], section: string, at: string): SlotCard[ return i < 0 ? 999 : i; }; // Add-ons (e.g. a monitor-arm tilt pivot) sit after the item they extend. - const addOn = (p: Part) => /\badd-on\b/i.test(p.model); - for (const c of cards.values()) c.parts.sort((a, b) => Number(addOn(a)) - Number(addOn(b))); + for (const c of cards.values()) c.parts.sort((a, b) => Number(isAddOn(a)) - Number(isAddOn(b))); return [...cards.values()].sort((a, b) => rank(a.slot) - rank(b.slot)); } diff --git a/src/routes/trackers/pc/+page.svelte b/src/routes/trackers/pc/+page.svelte index b3d5900..d48ec62 100644 --- a/src/routes/trackers/pc/+page.svelte +++ b/src/routes/trackers/pc/+page.svelte @@ -120,7 +120,9 @@ ); // ---- photos ---- - const casePart = $derived(parts.find((p) => p.slot === 'case' && p.imageUrls.length)); + const casePart = $derived( + parts.find((p) => p.slot === 'case' && p.imageUrls.length && presentAt(p, at)) + ); const heroImage = $derived(data.photos[0]?.url ?? casePart?.imageUrls[0] ?? null); const photoItem = $derived({ title: 'My setup',