Compare commits

...

6 Commits

Author SHA1 Message Date
Elijah Duffy
bf77a20ff9 0.3.4 2025-12-15 17:14:34 -08:00
Elijah Duffy
42c9bc0bcc banner: fix control config merge behaviour 2025-12-15 17:14:33 -08:00
Elijah Duffy
ed48b404d4 0.3.3 2025-12-15 17:05:39 -08:00
Elijah Duffy
54f7924c4a banner: add control swap 2025-12-15 17:05:20 -08:00
Elijah Duffy
d9cd2b406a banner: fix control placement with optionals disabled 2025-12-15 16:42:44 -08:00
Elijah Duffy
46bd6b935a 0.3.2 2025-12-15 15:40:33 -08:00
3 changed files with 41 additions and 13 deletions

View File

@@ -4,7 +4,7 @@
"type": "git",
"url": "https://gitea.auvem.com/svelte-toolkit/sui.git"
},
"version": "0.3.1",
"version": "0.3.4",
"scripts": {
"dev": "vite dev",
"build": "vite build && pnpm run prepack",

View File

@@ -38,6 +38,8 @@
})
| null;
dismiss?: Omit<BannerControlButton, 'framed'> | null;
/** if true, accept and decline buttons are swapped with more info */
swap?: boolean | null;
};
const defaultBannerControls: BannerControls = {
@@ -53,21 +55,40 @@
},
dismiss: {
action: (banner) => banner.close()
}
},
swap: false
};
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
};
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;
};
</script>
@@ -157,6 +178,7 @@
<FramelessButton
inverted={invertFrameless}
onclick={() => controls.dismiss?.action?.(api)}
class="ml-auto"
>
{#if controls.dismiss?.label}
{controls.dismiss.label}
@@ -170,7 +192,9 @@
{@render children?.()}
{#if controls !== null}
<div class="mt-4 flex flex-wrap justify-between gap-4">
<div
class={['mt-4 flex flex-wrap justify-between gap-4', controls.swap && 'flex-row-reverse']}
>
<!-- More info button/link -->
{#if controls.moreInfo}
{#if controls.moreInfo.type === 'link' && controls.moreInfo.href}
@@ -199,7 +223,9 @@
{/if}
{/if}
<div class="flex justify-end gap-4">
<div
class={['flex justify-end gap-4', controls.swap ? 'mr-auto flex-row-reverse' : 'ml-auto']}
>
<!-- Decline button -->
{@render buttonControl(controls.decline, handleDecline, false)}
<!-- Accept button -->

View File

@@ -83,7 +83,9 @@
<Banner
title="Manage Cookies"
controls={{
moreInfo: { label: 'More Info', type: 'link', href: '#!' }
moreInfo: { label: 'More Info', type: 'link', href: '#!' },
dismiss: null,
swap: true
}}
onaccept={() => console.log('Cookies accepted!')}
ondecline={() => console.log('Cookies declined!')}