diff --git a/src/core/search.ts b/src/core/search.ts index e5803c5..157dfc0 100644 --- a/src/core/search.ts +++ b/src/core/search.ts @@ -332,8 +332,13 @@ export async function searchAllSources( ); } - // Execute searches in parallel - const results = await Promise.all(searchPromises); + // Execute searches in parallel. Use allSettled so that one failing source + // (e.g. a network error or outage from a single API) doesn't wipe out the + // results from the others. + const settled = await Promise.allSettled(searchPromises); + const results = settled + .filter((r): r is PromiseFulfilledResult => r.status === 'fulfilled') + .map((r) => r.value); // Merge and deduplicate with enhanced prioritization const merged = mergeAndDedupeResults(...results); diff --git a/src/ui/live-search/LiveSearchModal.ts b/src/ui/live-search/LiveSearchModal.ts index e531749..8b996f2 100644 --- a/src/ui/live-search/LiveSearchModal.ts +++ b/src/ui/live-search/LiveSearchModal.ts @@ -939,7 +939,7 @@ export class LiveFoodSearchModal extends Modal { } escapeRegExp(string: string): string { - return string.replace(/[.*+?^${}()|[\]\\]/g, '\\'); + return string.replace(/[.*+?^${}()|[\]\\]/g, '\\$&'); } /** diff --git a/src/ui/modals/ManualFoodEntryModal.ts b/src/ui/modals/ManualFoodEntryModal.ts index fed9831..faf663c 100644 --- a/src/ui/modals/ManualFoodEntryModal.ts +++ b/src/ui/modals/ManualFoodEntryModal.ts @@ -331,7 +331,7 @@ export class ManualFoodEntryModal extends Modal { let expanded = false; const toggle = () => { expanded = !expanded; - body.style.display = expanded ? 'block' : 'none'; + body.toggleClass('macros-u-hidden', !expanded); toggleIcon.textContent = expanded ? '▼' : '▶'; }; this.component.registerDomEvent(header, 'click', toggle);