diff --git a/src/lib/Banner.svelte b/src/lib/Banner.svelte
new file mode 100644
index 0000000..9389c69
--- /dev/null
+++ b/src/lib/Banner.svelte
@@ -0,0 +1,233 @@
+
+
+
+
+{#if open}
+
+ {#if title || controls?.dismiss}
+
+ {#if title}
+
{title}
+ {/if}
+
+ {#if controls?.dismiss}
+ controls.dismiss?.action?.(api)}
+ >
+ {#if controls.dismiss?.label}
+ {controls.dismiss.label}
+ {/if}
+
+
+ {/if}
+
+ {/if}
+
+ {@render children?.()}
+
+ {#if controls !== null}
+
+
+ {#if controls.moreInfo}
+ {#if controls.moreInfo.type === 'link' && controls.moreInfo.href}
+
+ {controls.moreInfo.label || 'More Info'}
+
+ {:else if controls.moreInfo.type === 'framed'}
+
+ {:else}
+
controls.moreInfo?.action?.(api)}
+ inverted={invertFrameless}
+ >
+ {controls.moreInfo.label || 'More Info'}
+
+ {/if}
+ {/if}
+
+
+
+ {@render buttonControl(controls.decline, handleDecline, false)}
+
+ {@render buttonControl(controls.accept, handleAccept, true)}
+
+
+ {/if}
+
+{/if}
+
+{#snippet buttonControl(
+ button: BannerControlButton | undefined | null,
+ handleClick: (banner: BannerAPI) => void,
+ framedDefault: boolean
+)}
+ {#if button}
+ {#if button.framed || framedDefault}
+