diff --git a/dev/main.ts b/dev/main.ts index e35ca93..e2c07ac 100644 --- a/dev/main.ts +++ b/dev/main.ts @@ -689,6 +689,7 @@ class DevApp extends LitElement { label="Modal Text Input" placeholder="Type something..." > +
(this.modalOpen = false)} diff --git a/package.json b/package.json index 9c3e4e4..6c7f8e6 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@krumio/trailhand-ui", - "version": "1.9.20", + "version": "1.9.21", "type": "module", "description": "Reusable web components built with Lit Element", "main": "./dist/index.js", diff --git a/src/components/modal/modal.stories.ts b/src/components/modal/modal.stories.ts index cfb4d96..a39c529 100644 --- a/src/components/modal/modal.stories.ts +++ b/src/components/modal/modal.stories.ts @@ -225,18 +225,16 @@ export const DispatchesCloseEventOnEscape: Story = { }, args: { open: true, + dismissible: true, }, play: async ({ canvasElement }) => { const modal = canvasElement.querySelector('trailhand-modal') as Modal; - const dialog = modal.shadowRoot?.querySelector( - 'dialog', - ) as HTMLDialogElement; const onCloseMock = fn(); modal.addEventListener('modal-close', onCloseMock); - const cancelEvent = new Event('cancel', { bubbles: true, composed: true }); - dialog.dispatchEvent(cancelEvent); + // simulate ESC key + window.dispatchEvent(new KeyboardEvent('keydown', { key: 'Escape' })); await expect(modal.open).toBe(false); await expect(onCloseMock).toHaveBeenCalled(); diff --git a/src/components/modal/modal.ts b/src/components/modal/modal.ts index 681f463..5e6defa 100644 --- a/src/components/modal/modal.ts +++ b/src/components/modal/modal.ts @@ -163,6 +163,28 @@ export class Modal extends LitElement { this.open = false; } + private handleCancel(e: Event) { + e.preventDefault(); + } + + private handleKeydown = (e: KeyboardEvent) => { + if (!this.open) return; + + if (e.key === 'Escape' && this.dismissible) { + this.handleClose(); + } + }; + + connectedCallback() { + super.connectedCallback(); + window.addEventListener('keydown', this.handleKeydown); + } + + disconnectedCallback() { + window.removeEventListener('keydown', this.handleKeydown); + super.disconnectedCallback(); + } + private handleBackdropClick(e: MouseEvent) { if (!this.dismissible) return; const rect = this.dialog.getBoundingClientRect(); @@ -178,7 +200,7 @@ export class Modal extends LitElement { return html`