diff --git a/hdyc-svelte/src/lib/components/Sidebar.svelte b/hdyc-svelte/src/lib/components/Sidebar.svelte index 076cee1..10a3aa5 100644 --- a/hdyc-svelte/src/lib/components/Sidebar.svelte +++ b/hdyc-svelte/src/lib/components/Sidebar.svelte @@ -2,7 +2,7 @@ import { browser } from '$app/environment'; import { onMount } from 'svelte'; import { page } from '$app/stores'; - import { categories, getCalculatorsByCategory, type CalculatorDef } from '$lib/data/calculators'; + import { categories, categoryOrder, getCalculatorsByCategory, type CalculatorDef } from '$lib/data/calculators'; let expandedCategory = ''; let expandedUnits: Record = {}; @@ -31,34 +31,38 @@ conversions: CalculatorDef[]; }; - $: categoryUnitGroups = Object.entries(categories).map(([key, meta]) => { - const buckets = new Map(); - const calcs = getCalculatorsByCategory(key); + $: categoryUnitGroups = categoryOrder + .map(key => { + const meta = categories[key]; + if (!meta) return null; + const buckets = new Map(); + const calcs = getCalculatorsByCategory(key); - calcs.forEach(calc => { - [calc.labels.in1, calc.labels.in2].forEach(unit => { - const key = unit.toLowerCase(); - const existing = buckets.get(key); - if (existing) { - existing.conversions.push(calc); - } else { - buckets.set(key, { - label: unit, - conversions: [calc], - }); - } + calcs.forEach(calc => { + [calc.labels.in1, calc.labels.in2].forEach(unit => { + const lower = unit.toLowerCase(); + const existing = buckets.get(lower); + if (existing) { + existing.conversions.push(calc); + } else { + buckets.set(lower, { + label: unit, + conversions: [calc], + }); + } + }); }); - }); - const units = [...buckets.entries()] - .sort(([a], [b]) => a.localeCompare(b)) - .map(([, bucket]) => ({ - label: bucket.label, - conversions: bucket.conversions.slice().sort((a, b) => a.name.localeCompare(b.name)), - })); + const units = [...buckets.entries()] + .sort(([a], [b]) => a.localeCompare(b)) + .map(([, bucket]) => ({ + label: bucket.label, + conversions: bucket.conversions.slice().sort((a, b) => a.name.localeCompare(b.name)), + })); - return { key, meta, units }; - }); + return { key, meta, units }; + }) + .filter(Boolean); function toggle(cat: string) { const wasOpen = expandedCategory === cat; diff --git a/hdyc-svelte/src/lib/data/calculators.ts b/hdyc-svelte/src/lib/data/calculators.ts index e9eb723..7474f77 100644 --- a/hdyc-svelte/src/lib/data/calculators.ts +++ b/hdyc-svelte/src/lib/data/calculators.ts @@ -39,6 +39,29 @@ export const categories: Record = { other: { label: 'Other', icon: '🔄' }, }; +export const categoryOrder = [ + 'length', + 'weight', + 'temperature', + 'volume', + 'fluids', + 'area', + 'speed', + 'pressure', + 'energy', + 'magnetism', + 'power', + 'data', + 'time', + 'angle', + 'number-systems', + 'radiation', + 'electrical', + 'force', + 'light', + 'other', +] as const; + export const calculators: CalculatorDef[] = [ {"slug": "inches-to-feet", "name": "Inches to Feet", "category": "length", "type": "standard", "teaser": "If a shelf spans 36 inches, how many feet of trim does it cover?", "labels": {"in1": "Inches", "in2": "Feet"}, "factor": 12.0}, {"slug": "kilograms-to-pounds", "name": "Kilograms to Pounds", "category": "weight", "type": "standard", "labels": {"in1": "Kilograms", "in2": "Pounds"}, "factor": 2.20462262}, @@ -1319,11 +1342,14 @@ export function getCalculatorsByCategory(category: string): CalculatorDef[] { } export function getCategoriesWithCounts(): { key: string; label: string; icon: string; count: number }[] { - return Object.entries(categories).map(([key, meta]) => ({ - key, - ...meta, - count: calculators.filter(c => c.category === key && !c.hidden).length, - })); + return categoryOrder + .map(key => { + const meta = categories[key]; + if (!meta) return null; + const count = calculators.filter(c => c.category === key && !c.hidden).length; + return { key, ...meta, count }; + }) + .filter(Boolean) as { key: string; label: string; icon: string; count: number }[]; } export function searchCalculators(query: string): CalculatorDef[] {