From ee922b49eef38ef13000526faab312819d005f35 Mon Sep 17 00:00:00 2001 From: Elijah Duffy Date: Wed, 16 Jul 2025 17:41:56 -0700 Subject: [PATCH] dialog: add dialog api & detailed controls config, fix outer click --- src/lib/Dialog.svelte | 156 +++++++++++++++++++++++++++++++--------- src/lib/index.ts | 2 +- src/routes/+page.svelte | 19 +++-- 3 files changed, 140 insertions(+), 37 deletions(-) diff --git a/src/lib/Dialog.svelte b/src/lib/Dialog.svelte index bffac28..4fc8a63 100644 --- a/src/lib/Dialog.svelte +++ b/src/lib/Dialog.svelte @@ -1,11 +1,61 @@ + + @@ -77,6 +124,17 @@ classValue ]} transition:fade={{ duration: 150 }} + onclick={(e) => { + const target = e.target as HTMLElement; + if (open && !dialogContainer?.contains(target) && target !== dialogContainer) open = false; + }} + onkeydown={(e) => { + if (e.key === 'Escape') { + open = false; + } + }} + role="dialog" + tabindex="-1" >

{title}

+ + {#if error} + + {/if} + {#if description}

{description} @@ -103,15 +166,44 @@ {#if children}{@render children()}{:else}Dialog is empty{/if}

- {#if controls}{@render controls()}{:else} - - + {#if controls && typeof controls === 'function'}{@render controls()}{:else} + + {/if}
diff --git a/src/lib/index.ts b/src/lib/index.ts index 466238a..62d116a 100644 --- a/src/lib/index.ts +++ b/src/lib/index.ts @@ -5,7 +5,7 @@ export { default as CenterBox } from './CenterBox.svelte'; export { default as Checkbox, type CheckboxState } from './Checkbox.svelte'; export { default as Combobox, type ComboboxOption } from './Combobox.svelte'; export { default as DateInput } from './DateInput.svelte'; -export { default as Dialog } from './Dialog.svelte'; +export { default as Dialog, type DialogAPI, type DialogControlOpts } from './Dialog.svelte'; export { default as ErrorBox } from './ErrorBox.svelte'; export { default as FramelessButton } from './FramelessButton.svelte'; export { default as InjectGoogleMaps } from './InjectGoogleMaps.svelte'; diff --git a/src/routes/+page.svelte b/src/routes/+page.svelte index 4ced5bc..e3961bc 100644 --- a/src/routes/+page.svelte +++ b/src/routes/+page.svelte @@ -29,7 +29,7 @@ TextStrikethrough, TextUnderline } from 'phosphor-svelte'; - import type { ComboboxOption, Option } from '$lib'; + import { ErrorMessage, type ComboboxOption, type Option } from '$lib'; import Tabs from '$lib/Tabs.svelte'; const comboboxOptions = [ @@ -408,9 +408,20 @@ bind:open={dialogOpen} title="Dialog Title" size="sm" - onsubmit={() => { - dialogOpen = false; - alert('Dialog submitted!'); + controls={{ + ok: { + action: (dialog) => { + dialog.close(); + alert('Dialog submitted!'); + } + } + }} + onopen={(dialog) => { + dialog.error(ErrorMessage.from('Example error message!')); + dialog.loading(); + setTimeout(() => { + dialog.loaded(); + }, 2000); }} >

This is a dialog content area.