From 4c989ef1b36605bcf8fe1bf7e8f337aca8e2f64e Mon Sep 17 00:00:00 2001 From: Codex Agent Date: Sun, 8 Mar 2026 20:06:46 +0000 Subject: [PATCH] Fix sidebar unit navigation to include reverse conversion pairs --- hdyc-svelte/src/lib/components/Sidebar.svelte | 76 ++++++++++++++----- 1 file changed, 58 insertions(+), 18 deletions(-) diff --git a/hdyc-svelte/src/lib/components/Sidebar.svelte b/hdyc-svelte/src/lib/components/Sidebar.svelte index 1b0c0a3..f99d92f 100644 --- a/hdyc-svelte/src/lib/components/Sidebar.svelte +++ b/hdyc-svelte/src/lib/components/Sidebar.svelte @@ -23,35 +23,75 @@ type UnitGroup = { label: string; - conversions: CalculatorDef[]; + conversions: UnitConversionLink[]; }; type UnitBucket = { label: string; - conversions: CalculatorDef[]; + conversions: UnitConversionLink[]; }; - const sortConversionsForUnit = (conversions: CalculatorDef[]) => + type UnitConversionLink = { + name: string; + slug: string; + sortKey: string; + }; + + const sortConversionsForUnit = (conversions: UnitConversionLink[]) => conversions.slice().sort((a, b) => a.name.localeCompare(b.name)); + const toPairKey = (unitA: string, unitB: string) => + [unitA.toLowerCase(), unitB.toLowerCase()].sort().join('::'); + + const toDirectionKey = (fromUnit: string, toUnit: string) => + `${fromUnit.toLowerCase()}::${toUnit.toLowerCase()}`; + + function addConversion( + buckets: Map, + fromUnit: string, + toUnit: string, + slug: string + ) { + const bucketKey = fromUnit.toLowerCase(); + const directionKey = toDirectionKey(fromUnit, toUnit); + const conversion: UnitConversionLink = { + name: `${fromUnit} to ${toUnit}`, + slug, + sortKey: directionKey, + }; + + const existing = buckets.get(bucketKey); + if (existing) { + if (!existing.conversions.some(link => link.sortKey === directionKey)) { + existing.conversions.push(conversion); + } + return; + } + + buckets.set(bucketKey, { + label: fromUnit, + conversions: [conversion], + }); + } + $: categoryUnitGroups = Object.entries(categories).map(([key, meta]) => { const buckets = new Map(); const calcs = getCalculatorsByCategory(key); + const canonicalByPair = new Map(); calcs.forEach(calc => { - const unit = calc.labels.in1; - const bucketKey = unit.toLowerCase(); - const existing = buckets.get(bucketKey); - if (existing) { - existing.conversions.push(calc); - } else { - buckets.set(bucketKey, { - label: unit, - conversions: [calc], - }); + const pairKey = toPairKey(calc.labels.in1, calc.labels.in2); + const existing = canonicalByPair.get(pairKey); + if (!existing || calc.slug.localeCompare(existing.slug) < 0) { + canonicalByPair.set(pairKey, calc); } }); + canonicalByPair.forEach(calc => { + addConversion(buckets, calc.labels.in1, calc.labels.in2, calc.slug); + addConversion(buckets, calc.labels.in2, calc.labels.in1, calc.slug); + }); + const units = [...buckets.entries()] .sort(([a], [b]) => a.localeCompare(b)) .map(([, bucket]) => ({ @@ -178,14 +218,14 @@ {#if expandedUnits[group.key] === unit.label}