Skip to content

Commit

Permalink
tidy & reuse
Browse files Browse the repository at this point in the history
  • Loading branch information
CaptainCodeman committed Jun 13, 2024
1 parent 4710629 commit 8fb275b
Show file tree
Hide file tree
Showing 3 changed files with 14 additions and 8 deletions.
2 changes: 1 addition & 1 deletion src/docs/05-dialog.md
Original file line number Diff line number Diff line change
Expand Up @@ -103,7 +103,7 @@ A fully-managed, renderless dialog component jam-packed with accessibility and k
If the `Esc` key is pressed or the backdrop clicked, the dialog element will raise a `close` event which can be cancelled if required to prevent accidental closure:

```svelte
<div class="relative z-10" on:close={(e) => e.preventDefault()>
<div class="relative z-10" on:close|preventDefault>
...
</div>
```
11 changes: 4 additions & 7 deletions src/lib/dialog.ts
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,7 @@ import { setRole } from './internal/set-role'
import { getPrefix } from './internal/utils'
import { trapFocusOnOpen } from './internal/focus'
import { setTabIndex } from './internal/set-tab-index'
import { cancellableClose } from './internal/cancellable-close'

export interface Dialog extends Expandable, Labelable {}

Expand All @@ -36,20 +37,16 @@ export function createDialog(init?: Partial<Dialog>) {
function modal(node: HTMLElement) {
ensureID(node, prefix)

function cancellableClose() {
if (node.dispatchEvent(new Event('close', { bubbles: true, cancelable: true }))) {
close()
}
}
const tryClose = cancellableClose(node, close)

const destroy = applyBehaviors(node, [
setRole('dialog'),
setTabIndex(-1),
reflectAriaModal(store),
reflectAriaLabel(store),
trapFocusOnOpen(store),
onClickOutside(() => [node], cancellableClose),
onKeydown(keyEscape(cancellableClose)),
onClickOutside(() => [node], tryClose),
onKeydown(keyEscape(tryClose)),
])

return {
Expand Down
9 changes: 9 additions & 0 deletions src/lib/internal/cancellable-close.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
import type { Callable } from './callable'

export function cancellableClose(node: HTMLElement, close: Callable) {
return () => {
if (node.dispatchEvent(new Event('close', { bubbles: true, cancelable: true }))) {
close()
}
}
}

0 comments on commit 8fb275b

Please sign in to comment.