From 0d90b60ae1015474eec71dbd1a9a8fd048dea0cf Mon Sep 17 00:00:00 2001
From: gd2910 <122624946+gd2910@users.noreply.github.com>
Date: Tue, 11 Feb 2025 13:15:33 +0000
Subject: [PATCH 1/2] fix(web-components): changes to ic-badge and
ic-navigation-button to show notifications in mobile
ic-badge now renders as inline variant when in ic-top-navigation and in mobile view.
---
.../src/components/ic-badge/ic-badge.tsx | 45 +++-
.../__snapshots__/ic-badge.spec.tsx.snap | 82 +++++++
.../ic-badge/test/basic/ic-badge.spec.tsx | 204 ++++++++++++++++++
.../ic-navigation-button.css | 4 +
.../ic-navigation-button.tsx | 4 +-
.../ic-top-navigation.stories.mdx | 20 +-
6 files changed, 346 insertions(+), 13 deletions(-)
diff --git a/packages/web-components/src/components/ic-badge/ic-badge.tsx b/packages/web-components/src/components/ic-badge/ic-badge.tsx
index 2e942a0534..b237fb4a9b 100644
--- a/packages/web-components/src/components/ic-badge/ic-badge.tsx
+++ b/packages/web-components/src/components/ic-badge/ic-badge.tsx
@@ -1,4 +1,12 @@
-import { Component, Element, Host, Prop, Watch, h } from "@stencil/core";
+import {
+ Component,
+ Element,
+ Host,
+ Prop,
+ Watch,
+ h,
+ Listen,
+} from "@stencil/core";
import {
IcBadgePositions,
IcBadgeTypes,
@@ -17,6 +25,9 @@ import {
onComponentRequiredPropUndefined,
} from "../../utils/helpers";
+const NAVIGATION_BUTTON = "IC-NAVIGATION-BUTTON";
+const TOP_NAVIGATION = "IC-TOP-NAVIGATION";
+
/**
* @slot badge-icon - Icon will be rendered inside the badge if type is set to icon.
*/
@@ -64,7 +75,7 @@ export class Badge {
/**
* The positioning of the badge in reference to the parent element.
*/
- @Prop() position?: IcBadgePositions = "far";
+ @Prop({ mutable: true }) position?: IcBadgePositions = "far";
/**
* The size of the badge to be displayed.
@@ -124,6 +135,20 @@ export class Badge {
);
}
+ componentWillRender(): void {
+ this.isInTopNav() && this.setPositionInTopNavigation();
+ }
+
+ @Listen("icNavigationMenuOpened", { target: "document" })
+ navBarMenuOpenHandler(): void {
+ this.isInTopNav() && (this.position = "inline");
+ }
+
+ @Listen("icNavigationMenuClosed", { target: "document" })
+ navBarMenuCloseHandler(): void {
+ this.isInTopNav() && (this.position = "near");
+ }
+
private setBadgeColour = () => {
const colorRGBA = convertToRGBA(this.customColor);
@@ -167,6 +192,22 @@ export class Badge {
}
};
+ private setPositionInTopNavigation = () => {
+ const parentTopNavEl = this.el.parentElement.parentElement;
+ parentTopNavEl.classList.contains("mobile-mode")
+ ? (this.position = "inline")
+ : (this.position = "near");
+ };
+
+ private isInTopNav = (): boolean => {
+ const parentEl = this.el.parentElement;
+ const grandparentEl = parentEl.parentElement;
+ return (
+ parentEl.tagName === NAVIGATION_BUTTON &&
+ grandparentEl.tagName === TOP_NAVIGATION
+ );
+ };
+
private isAccessibleLabelDefined = () =>
isPropDefined(this.accessibleLabel) && this.accessibleLabel !== null;
diff --git a/packages/web-components/src/components/ic-badge/test/basic/__snapshots__/ic-badge.spec.tsx.snap b/packages/web-components/src/components/ic-badge/test/basic/__snapshots__/ic-badge.spec.tsx.snap
index 4df67e617a..22686ac001 100644
--- a/packages/web-components/src/components/ic-badge/test/basic/__snapshots__/ic-badge.spec.tsx.snap
+++ b/packages/web-components/src/components/ic-badge/test/basic/__snapshots__/ic-badge.spec.tsx.snap
@@ -227,6 +227,88 @@ exports[`ic-badge should render slotted in a tab with aria-label set on badge: s
`;
+exports[`ic-badge should render slotted in a top navigation: should render slotted in a top navigation 1`] = `
+
+
+
+
+
+
+
+
+
+
+
+ 1
+
+
+
+
+
+
+
+
+
+ badge
+
+
+
+
+
+
+
+
+`;
+
exports[`ic-badge should render slotted in a vertical card with aria-label set on badge: should render slotted in a card 1`] = `
diff --git a/packages/web-components/src/components/ic-badge/test/basic/ic-badge.spec.tsx b/packages/web-components/src/components/ic-badge/test/basic/ic-badge.spec.tsx
index bb059b25b1..11612ea8ff 100644
--- a/packages/web-components/src/components/ic-badge/test/basic/ic-badge.spec.tsx
+++ b/packages/web-components/src/components/ic-badge/test/basic/ic-badge.spec.tsx
@@ -6,6 +6,7 @@ import { Tab } from "../../../ic-tab/ic-tab";
import { CardVertical } from "../../../ic-card-vertical/ic-card-vertical";
import { NavigationButton } from "../../../ic-navigation-button/ic-navigation-button";
import { NavigationItem } from "../../../ic-navigation-item/ic-navigation-item";
+import { TopNavigation } from "../../../ic-top-navigation/ic-top-navigation";
describe("ic-badge", () => {
it("should render with text slotted in a button", async () => {
@@ -54,6 +55,7 @@ describe("ic-badge", () => {
expect(page.root).toMatchSnapshot("should render warning variant");
});
+
it("should render info variant", async () => {
const page = await newSpecPage({
components: [Button, Badge],
@@ -217,6 +219,103 @@ describe("ic-badge", () => {
);
});
+ it("should render slotted in a top navigation", async () => {
+ const page = await newSpecPage({
+ components: [TopNavigation, NavigationItem, Badge],
+ html: `
+
+
+
+
+
+
+
+
+
+
+
+
+
+ `,
+ });
+
+ expect(page.root).toMatchSnapshot(
+ "should render slotted in a top navigation"
+ );
+ });
+
it("should render slotted in a navigation item", async () => {
const page = await newSpecPage({
components: [NavigationItem, Badge],
@@ -321,4 +420,109 @@ describe("ic-badge", () => {
const badge = document.querySelector("ic-badge");
expect(badge.style.backgroundColor).toBe("rgba(222, 10, 43, 1)");
});
+
+ it("should set the correct variant when navigation menu is opened and closed", async () => {
+ const page = await newSpecPage({
+ components: [Badge, NavigationButton],
+ html: `
+
+
+
+
+
+
+
+
+
+
+
+
+
+ `,
+ });
+
+ const badge = document.querySelector("ic-badge");
+
+ expect(page.rootInstance.mode).toBe("navbar");
+
+ document.dispatchEvent(new CustomEvent("icNavigationMenuOpened"));
+ expect(page.rootInstance.mode).toBe("menu");
+ expect(badge.position).toBe("inline");
+
+ document.dispatchEvent(new CustomEvent("icNavigationMenuClosed"));
+ expect(page.rootInstance.mode).toBe("navbar");
+ expect(badge.position).toBe("near");
+ });
});
diff --git a/packages/web-components/src/components/ic-navigation-button/ic-navigation-button.css b/packages/web-components/src/components/ic-navigation-button/ic-navigation-button.css
index 0fd9c5f150..de177043f4 100644
--- a/packages/web-components/src/components/ic-navigation-button/ic-navigation-button.css
+++ b/packages/web-components/src/components/ic-navigation-button/ic-navigation-button.css
@@ -28,3 +28,7 @@
color: var(--ic-top-navigation-icon-pressed);
background-color: var(--ic-top-navigation-icon-pressed-background);
}
+
+:host(.in-side-menu) ::slotted(ic-badge) {
+ margin-left: var(--ic-space-xs);
+}
diff --git a/packages/web-components/src/components/ic-navigation-button/ic-navigation-button.tsx b/packages/web-components/src/components/ic-navigation-button/ic-navigation-button.tsx
index 9b5192abd9..1b5073ebfd 100644
--- a/packages/web-components/src/components/ic-navigation-button/ic-navigation-button.tsx
+++ b/packages/web-components/src/components/ic-navigation-button/ic-navigation-button.tsx
@@ -212,9 +212,7 @@ export class NavigationButton {
>
{label}
- {isSlotUsed(this.el, "badge") && variant === "icon" && (
-
- )}
+ {isSlotUsed(this.el, "badge") && }
);
diff --git a/packages/web-components/src/components/ic-top-navigation/ic-top-navigation.stories.mdx b/packages/web-components/src/components/ic-top-navigation/ic-top-navigation.stories.mdx
index e800baa6fe..d3cd501b60 100644
--- a/packages/web-components/src/components/ic-top-navigation/ic-top-navigation.stories.mdx
+++ b/packages/web-components/src/components/ic-top-navigation/ic-top-navigation.stories.mdx
@@ -191,8 +191,9 @@ import NavigationGroup from "../ic-navigation-group/readme.md";
Date: Tue, 11 Feb 2025 13:53:49 +0000
Subject: [PATCH 2/2] fix(react): update IcTopNavigation visual regression
image
Update IcTopNavigation visual regression image
---
.../IcTopNavigation.cy.tsx/icon-buttons.png | Bin 18556 -> 18507 bytes
.../IcTopNavigationTestData.tsx | 8 +++++++-
.../src/stories/ic-top-navigation.stories.mdx | 14 ++++++++------
3 files changed, 15 insertions(+), 7 deletions(-)
diff --git a/packages/react/cypress-image-diff-screenshots/baseline/IcTopNavigation.cy.tsx/icon-buttons.png b/packages/react/cypress-image-diff-screenshots/baseline/IcTopNavigation.cy.tsx/icon-buttons.png
index 28bd78b3b51882f0d72ff50ae326334057a35791..22cc5c0c48ea4278af3b9b45405d1bb73cdf863c 100755
GIT binary patch
literal 18507
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
literal 18556
zcmeIZWl$X7w>BC=2yP+x;2zu=Gy#GHOGtvdy9~iC1b6oVl3)og!6mpeKyZfvhT!h@
zHa|K4^Pal*%l&YwZdG>GNOkw@*}eACXFVPIT3HqwgAC)rg9q61a?+{~9-!nrc<^u+
z?J;oVO*20Ag9ma_^3pHfxgl-0Vm>Df_;Po!2ZpwT(Sq|)U!o`?5kx#ypkv_Xqe`uR
zGFeh(A3{7j*|t=R4VSszV31#d^kj|Hl$w@tyM>?Poaf=7y^kgxRVI
z85x=T&d!HSPh*slAeq%oID+DdATs{HBlZYyx=L*C+MQMkPRmV(4GkNy_^k55+-_?z
zLrH)At*Tn2j@W-&D>VO&e`&sTNQSXcb)^La3&}S4zzn}T1Pjw>Y-uaDF#O+%@$qAi
zh8twj&hEB}qTc-YB!NTKmAyd-?Yog^2<$1@i7gC9|NGk5{+Q(Pp4u-Nd8orBx3vvivr7iBTy=mYzGQg!3u4!MKB=F4=&|o(!QLBpbc*SbPTr4C9+ocshKetvZ
zx(QNfMOb!D&LS5!kO~UYF~;L(x3=U?OpOKfkIP9((M8pJ^s!ohFL0#(TXBfh)ON+;
zS3yo36_7KUzy2-yeKuKs?1`HiDsgQI|z)z*18Y8IV3uHarwEvXJ7LI!zfNBje}ox)Z10!gF{&cwvX
zSU`x*mjN?DMuyXs$U92ey9Hg~$29roj)IQu&R^&wx22j2V|{J!lDfJWIq3acpKD8S
zN{U<>AN?@mBe775c#ND$Np$TkW@+_F%Uldt2*kafr7zmY+ZYeOF0E)brMGLFM=SlX
zPfMpn25yJ8@<>;9e?MEk!_Dzi{_P)+`wPjvMAbr(|?ug@e4aE0se
zfV=!cab51NWx1nhCnNmma%s9NLkz`~Pe6d?Z#k{+a^9UMh}bnnQQ}hw5om%@2E1J<
zAkL0QIHBpSrX7Wmfx%2T@Wk#t#6&vn@3943|JIfRtjEZ$J2xc5Owg?8X7uoe(80y+
z)-@|>X{}O@R$I;eL;8}v1$3~l;TM;ng(ojBiR%*HgI2vX=9E65+lA)`2eO8a&qvfG
zCvN&H1BMQ0YHWYE(i@-SEpq>mo^g};E=2*e<=6BW(0N(fh;C?V>g$
zHNH{c7N#yPII+6Uc~IQNibmUq_uk!Nl)j70D?hJS$)+3tl_+PQ&
zKse^+B0lVrd<0xmVviL!!3_6DiVFrlKE8i-tV?qpzA^br?uswHW4S5xH|Sqqr>LyQ
zjVV4SZFWkzx@iLE!3Vsd_K-?Tw^{DAx&HQ2uet=ir!0*GqTY_e?NHFwVa55&2ki2r
zWpdp8%3#FdV3eeE&Iwl?Y3kj;P#t3}J7n1z-L4;+-yMIxL|#iq1}1;}*{S;h+b&~?
ziJB`xhR9_ludjsC-xjWuF*j(3MK$byo=yvRINI7KDkUYQZFV*~*8Gprf;Pq%X>2;!
zk=H4JD>gCPTQ<_-_I)