From cd4c16a3d95d1349698b9e245cd8cd878c4c7cbc Mon Sep 17 00:00:00 2001 From: Jose Carcamo Date: Mon, 3 Jun 2024 16:42:32 -0700 Subject: [PATCH 1/8] fix(alert): pause auto-close alert when link focused --- .../src/components/alert/alert.e2e.ts | 14 +++++++ .../src/components/alert/alert.scss | 7 ++++ .../src/components/alert/alert.tsx | 40 ++++++++++++++++++- 3 files changed, 59 insertions(+), 2 deletions(-) diff --git a/packages/calcite-components/src/components/alert/alert.e2e.ts b/packages/calcite-components/src/components/alert/alert.e2e.ts index 63e35eabe69..dee3bd09b3f 100644 --- a/packages/calcite-components/src/components/alert/alert.e2e.ts +++ b/packages/calcite-components/src/components/alert/alert.e2e.ts @@ -457,6 +457,20 @@ describe("calcite-alert", () => { await page.waitForTimeout(DURATIONS.medium + animationDurationInMs); await page.waitForSelector("#alert", { visible: false }); }); + + it("pauses on focus and resumes on unfocus", async () => { + await button.click(); + expect(await alert.isVisible()).toBe(true); + expect(await alert.getProperty("autoCloseDuration")).toEqual("medium"); + expect(playState).toEqual("running"); + const link = await page.find(`#alert >>> calcite-link`); + await link.focus(); + await page.waitForTimeout(DURATIONS.medium); + expect(await alert.isVisible()).toBe(true); + await button.focus(); + await page.waitForTimeout(DURATIONS.medium + animationDurationInMs); + await page.waitForSelector("#alert", { visible: false }); + }); }); describe("translation support", () => { diff --git a/packages/calcite-components/src/components/alert/alert.scss b/packages/calcite-components/src/components/alert/alert.scss index 68c259951b4..759dc0fdec5 100644 --- a/packages/calcite-components/src/components/alert/alert.scss +++ b/packages/calcite-components/src/components/alert/alert.scss @@ -296,6 +296,13 @@ $alertDurations: :host(:hover[auto-close-duration="#{$name}"]) .dismiss-progress:after { animation-play-state: paused; } + :host(:focus[auto-close-duration="#{$name}"]) .dismiss-progress:after { + animation-play-state: paused; + } +} + +.container.focused .dismiss-progress:after { + animation-play-state: paused; } @keyframes dismissProgress { diff --git a/packages/calcite-components/src/components/alert/alert.tsx b/packages/calcite-components/src/components/alert/alert.tsx index 0e4b2be7365..6c0cd38a4c4 100644 --- a/packages/calcite-components/src/components/alert/alert.tsx +++ b/packages/calcite-components/src/components/alert/alert.tsx @@ -232,7 +232,13 @@ export class Alert implements OpenCloseComponent, LoadableComponent, T9nComponen ref={this.setTransitionEl} > {effectiveIcon && this.renderIcon(effectiveIcon)} -
+
@@ -246,6 +252,20 @@ export class Alert implements OpenCloseComponent, LoadableComponent, T9nComponen ); } + private handleKeyBoardFocus = (): void => { + this.transitionEl.classList.add("focused"); + this.keyBoardFocus = true; + this.handleFocus(); + }; + + private handleKeyBoardUnfocus = (): void => { + this.transitionEl.classList.remove("focused"); + this.keyBoardFocus = false; + if (!this.mouseFocus) { + this.handleUnfocus(); + } + }; + private renderCloseButton(): VNode { return (