From 42c9bc0bcc96aa34243fd1fd2ebe49824d268d91 Mon Sep 17 00:00:00 2001 From: Elijah Duffy Date: Mon, 15 Dec 2025 17:14:22 -0800 Subject: [PATCH] banner: fix control config merge behaviour --- src/lib/Banner.svelte | 37 +++++++++++++++++++++++++++---------- src/routes/+page.svelte | 1 + 2 files changed, 28 insertions(+), 10 deletions(-) diff --git a/src/lib/Banner.svelte b/src/lib/Banner.svelte index 1c8f5ba..fefd676 100644 --- a/src/lib/Banner.svelte +++ b/src/lib/Banner.svelte @@ -39,7 +39,7 @@ | null; dismiss?: Omit | null; /** if true, accept and decline buttons are swapped with more info */ - swap?: boolean; + swap?: boolean | null; }; const defaultBannerControls: BannerControls = { @@ -61,17 +61,34 @@ const mergeBannerControls = ( defaults: BannerControls, - overrides: BannerControls | null | undefined + overrides?: BannerControls | null ): BannerControls => { - if (!overrides) return defaults; + if (overrides == null) return { ...defaults }; - return { - accept: overrides.accept ?? defaults.accept, - decline: overrides.decline ?? defaults.decline, - moreInfo: overrides.moreInfo ?? defaults.moreInfo, - dismiss: overrides.dismiss ?? defaults.dismiss, - swap: overrides.swap ?? defaults.swap - }; + const result: BannerControls = { ...defaults }; + + const keys: (keyof BannerControls)[] = ['accept', 'decline', 'moreInfo', 'dismiss', 'swap']; + + for (const key of keys) { + const ov = overrides[key]; + if (ov === null) { + // explicit disable + result[key] = null; + continue; + } + if (ov === undefined) continue; // keep default + if (key === 'swap') { + result.swap = ov as boolean; + continue; + } + // shallow merge individual control fields + result[key] = { + ...(defaults[key] ?? {}), + ...(ov as any) + } as any; + } + + return result; }; diff --git a/src/routes/+page.svelte b/src/routes/+page.svelte index 06d0773..9d94e41 100644 --- a/src/routes/+page.svelte +++ b/src/routes/+page.svelte @@ -84,6 +84,7 @@ title="Manage Cookies" controls={{ moreInfo: { label: 'More Info', type: 'link', href: '#!' }, + dismiss: null, swap: true }} onaccept={() => console.log('Cookies accepted!')}