From d7bd3d786a8cedb1a1622c2a75acddcd59cee1fd Mon Sep 17 00:00:00 2001 From: Michael Haschke Date: Tue, 7 Jul 2026 11:08:33 +0200 Subject: [PATCH 01/13] switch behaviour for primary/accent intent colors --- CHANGELOG.md | 3 ++ .../ProgressBar/ProgressBar.test.tsx | 28 +++++++++++++++++++ src/components/ProgressBar/ProgressBar.tsx | 23 +++++++++++++-- .../Stories/ProgressBar.stories.tsx | 2 +- src/components/ProgressBar/progressbar.scss | 20 +++++++++++++ src/components/index.scss | 1 + 6 files changed, 73 insertions(+), 4 deletions(-) create mode 100644 src/components/ProgressBar/ProgressBar.test.tsx create mode 100644 src/components/ProgressBar/progressbar.scss diff --git a/CHANGELOG.md b/CHANGELOG.md index 6eb665ad3..59dc5ee6f 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -34,6 +34,9 @@ The format is based on [Keep a Changelog](http://keepachangelog.com/) and this p - `Toaster.create` is now an async function - `` - by default, if no searchPredicate or searchListPredicate is defined, the filtering is done via case-insensitive multi-word filtering. +- `` + - color for `intent="primary"` was changed to our brand color + - new option `accent` for `intent` uses the accent color ### Deprecated diff --git a/src/components/ProgressBar/ProgressBar.test.tsx b/src/components/ProgressBar/ProgressBar.test.tsx new file mode 100644 index 000000000..63ff05fce --- /dev/null +++ b/src/components/ProgressBar/ProgressBar.test.tsx @@ -0,0 +1,28 @@ +import React from "react"; +import { render } from "@testing-library/react"; + +import "@testing-library/jest-dom"; + +import { ProgressBar } from "../../../index"; +import { CLASSPREFIX as eccgui } from "../../configuration/constants"; + +describe("ProgressBar", () => { + it("should not apply an intent class when no intent is set", () => { + const { container } = render(); + const progressbar = container.querySelector(`.${eccgui}-progressbar`); + expect(progressbar).not.toBeNull(); + expect((progressbar as HTMLElement).className).not.toMatch(new RegExp(`${eccgui}-progressbar-intent-`)); + }); + it("should apply the matching intent class for a blueprint intent", () => { + const { container } = render(); + const progressbar = container.querySelector(`.${eccgui}-progressbar`); + expect(progressbar).not.toBeNull(); + expect(progressbar).toHaveClass(`${eccgui}-progressbar-intent-success`); + }); + it("should apply the intent class for the custom accent intent", () => { + const { container } = render(); + const progressbar = container.querySelector(`.${eccgui}-progressbar`); + expect(progressbar).not.toBeNull(); + expect(progressbar).toHaveClass(`${eccgui}-progressbar-intent-accent`); + }); +}); diff --git a/src/components/ProgressBar/ProgressBar.tsx b/src/components/ProgressBar/ProgressBar.tsx index 6111e98f2..7a66f711a 100644 --- a/src/components/ProgressBar/ProgressBar.tsx +++ b/src/components/ProgressBar/ProgressBar.tsx @@ -1,5 +1,22 @@ +import React from "react"; import { ProgressBar as BlueprintProgressBar, ProgressBarProps as BlueprintProgressBarProps } from "@blueprintjs/core"; +import classNames from "classnames"; -// we currently do not apply changes or additions -export const ProgressBar = BlueprintProgressBar; -export type ProgressBarProps = BlueprintProgressBarProps; +import { CLASSPREFIX as eccgui } from "../../configuration/constants"; + +export interface ProgressBarProps extends Omit { + intent?: BlueprintProgressBarProps["intent"] | "accent"; +} + +export const ProgressBar = ({ className, intent, ...otherProps }) => { + return ( + + ); +}; + +export default ProgressBar; diff --git a/src/components/ProgressBar/Stories/ProgressBar.stories.tsx b/src/components/ProgressBar/Stories/ProgressBar.stories.tsx index f180cc134..e00f5d98b 100644 --- a/src/components/ProgressBar/Stories/ProgressBar.stories.tsx +++ b/src/components/ProgressBar/Stories/ProgressBar.stories.tsx @@ -9,7 +9,7 @@ export default { argTypes: { intent: { ...helpersArgTypes.exampleIntent, - options: ["UNDEFINED", "primary", "success", "warning", "danger"], + options: ["UNDEFINED", "primary", "accent", "success", "warning", "danger"], }, }, } as Meta; diff --git a/src/components/ProgressBar/progressbar.scss b/src/components/ProgressBar/progressbar.scss new file mode 100644 index 000000000..e3d3839c7 --- /dev/null +++ b/src/components/ProgressBar/progressbar.scss @@ -0,0 +1,20 @@ +// lib import +@import "~@blueprintjs/core/src/components/progress-bar/progress-bar"; + +.#{$ns}-progress-meter { + .#{$ns}-progress-bar.#{$eccgui}-progressbar-intent-primary & { + background-color: $eccgui-color-primary; + } + .#{$ns}-progress-bar.#{$eccgui}-progressbar-intent-accent & { + background-color: $eccgui-color-accent; + } + .#{$ns}-progress-bar.#{$eccgui}-progressbar-intent-danger & { + background-color: $eccgui-color-danger-text; + } + .#{$ns}-progress-bar.#{$eccgui}-progressbar-intent-warning & { + background-color: $eccgui-color-warning-text; + } + .#{$ns}-progress-bar.#{$eccgui}-progressbar-intent-success & { + background-color: $eccgui-color-success-text; + } +} diff --git a/src/components/index.scss b/src/components/index.scss index 7d0bc7352..b3852c483 100644 --- a/src/components/index.scss +++ b/src/components/index.scss @@ -46,3 +46,4 @@ @import "./PropertyValuePair/propertyvalue"; @import "./MultiSuggestField/multisuggestfield"; @import "./ContentGroup/contentgroup"; +@import "./ProgressBar/progressbar"; From 52aa6201c59c92bee1b9b77d8a3f8425d6a89216 Mon Sep 17 00:00:00 2001 From: Michael Haschke Date: Tue, 7 Jul 2026 12:55:14 +0200 Subject: [PATCH 02/13] switch behaviour for primary/accent intent colors --- CHANGELOG.md | 2 +- src/components/Menu/MenuItem.test.tsx | 25 ++++++++++ src/components/Menu/MenuItem.tsx | 23 +++++++-- .../Menu/Stories/MenuItem.stories.tsx | 5 ++ src/components/Menu/menu.scss | 48 +++++++++++++++++++ src/components/ProgressBar/ProgressBar.tsx | 3 ++ 6 files changed, 100 insertions(+), 6 deletions(-) create mode 100644 src/components/Menu/MenuItem.test.tsx diff --git a/CHANGELOG.md b/CHANGELOG.md index 59dc5ee6f..13e32d288 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -34,7 +34,7 @@ The format is based on [Keep a Changelog](http://keepachangelog.com/) and this p - `Toaster.create` is now an async function - `` - by default, if no searchPredicate or searchListPredicate is defined, the filtering is done via case-insensitive multi-word filtering. -- `` +- ``, `` - color for `intent="primary"` was changed to our brand color - new option `accent` for `intent` uses the accent color diff --git a/src/components/Menu/MenuItem.test.tsx b/src/components/Menu/MenuItem.test.tsx new file mode 100644 index 000000000..6f72a0b6a --- /dev/null +++ b/src/components/Menu/MenuItem.test.tsx @@ -0,0 +1,25 @@ +import React from "react"; +import { Classes as BlueprintClasses } from "@blueprintjs/core"; +import { render } from "@testing-library/react"; + +import "@testing-library/jest-dom"; + +import { MenuItem } from "../../../index"; +import { CLASSPREFIX as eccgui } from "../../configuration/constants"; + +describe("MenuItem", () => { + it("should not apply an intent class when intent is undefined", () => { + const { container } = render(); + const menuItem = container.querySelector(`.${eccgui}-menu__item`); + expect(menuItem).not.toBeNull(); + expect((menuItem as HTMLElement).className).not.toMatch( + new RegExp(`${BlueprintClasses.getClassNamespace()}-intent-`), + ); + }); + it("should apply the intent class for the custom accent intent", () => { + const { container } = render(); + const menuItem = container.querySelector(`.${eccgui}-menu__item`); + expect(menuItem).not.toBeNull(); + expect(menuItem).toHaveClass(`${BlueprintClasses.getClassNamespace()}-intent-accent`); + }); +}); diff --git a/src/components/Menu/MenuItem.tsx b/src/components/Menu/MenuItem.tsx index 0b18e9cfb..bed6fa6a9 100644 --- a/src/components/Menu/MenuItem.tsx +++ b/src/components/Menu/MenuItem.tsx @@ -1,5 +1,10 @@ import React from "react"; -import { MenuItem as BlueprintMenuItem, MenuItemProps as BlueprintMenuItemProps } from "@blueprintjs/core"; +import { + Classes as BlueprintClasses, + MenuItem as BlueprintMenuItem, + MenuItemProps as BlueprintMenuItemProps, +} from "@blueprintjs/core"; +import classNames from "classnames"; import { openInNewTab } from "../../common/utils/openInNewTab"; import { CLASSPREFIX as eccgui } from "../../configuration/constants"; @@ -11,10 +16,10 @@ import { TestIconProps } from "./../Icon/TestIcon"; export interface MenuItemProps extends - Omit, + Omit, Omit, "onClick" | "onFocus" | "target" | "children"> { - /* - * If set the icon is diplayed on the left side of the menu item. + /** + * If set the icon is displayed on the left side of the menu item. */ icon?: ValidIconName | string[] | React.ReactElement; /** @@ -25,6 +30,10 @@ export interface MenuItemProps * Tooltip, but only added to the label, not to the full menu item. */ tooltip?: string | React.JSX.Element; + /** + * Visual intent color to apply to element. + */ + intent?: BlueprintMenuItemProps["intent"] | "accent"; } /** @@ -38,6 +47,7 @@ export const MenuItem = ({ href, text, tooltip, + intent, ...restProps }: MenuItemProps) => { return ( @@ -56,7 +66,10 @@ export const MenuItem = ({ onClick={(e: React.MouseEvent) => openInNewTab(e as React.MouseEvent, onClick, href) } - className={`${eccgui}-menu__item ` + className} + className={classNames(`${eccgui}-menu__item`, className, { + // control blueprint intent classes to enhance it by new options + [`${BlueprintClasses.getClassNamespace()}-intent-${intent}`]: intent, + })} icon={icon ? typeof icon === "string" || Array.isArray(icon) ? : icon : false} > {children ?? null} diff --git a/src/components/Menu/Stories/MenuItem.stories.tsx b/src/components/Menu/Stories/MenuItem.stories.tsx index a66422a30..f7e9e121b 100644 --- a/src/components/Menu/Stories/MenuItem.stories.tsx +++ b/src/components/Menu/Stories/MenuItem.stories.tsx @@ -3,6 +3,7 @@ import { OverlaysProvider } from "@blueprintjs/core"; import { LogoReact } from "@carbon/icons-react"; import { Meta, StoryFn } from "@storybook/react"; +import { helpersArgTypes } from "../../../../.storybook/helpers"; import { Menu, MenuItem, TestIcon } from "../../../components"; import canonicalIcons from "./../../Icon/canonicalIconNames"; @@ -19,6 +20,10 @@ export default { ...Object.keys(canonicalIcons), }, }, + intent: { + ...helpersArgTypes.exampleIntent, + options: ["UNDEFINED", "primary", "accent", "success", "warning", "danger"], + }, }, } as Meta; diff --git a/src/components/Menu/menu.scss b/src/components/Menu/menu.scss index a7cfae7c7..5dde963a0 100644 --- a/src/components/Menu/menu.scss +++ b/src/components/Menu/menu.scss @@ -68,3 +68,51 @@ span.#{$ns}-menu-item-icon:empty { } } } + +.#{$ns}-menu-item { + @each $intent in ("primary", "accent") { + $colorrange: $intent; + + @if $intent == "primary" { + $colorrange: "brand"; + } + + @include menu-item-intent( + $intent, + false, + eccgui-color-var("identity", $colorrange, "300"), + eccgui-color-var("identity", $colorrange, "700"), + eccgui-color-var("identity", $colorrange, "900") + ); + } +} + +.#{$ns}-submenu { + .#{$ns}-popover-target { + &.#{$ns}-popover-open > .#{$ns}-menu-item { + &[class*="#{$ns}-intent-"] { + &, + &:hover, + &:active { + @each $intent in ("primary", "accent") { + $colorrange: $intent; + + @if $intent == "primary" { + $colorrange: "brand"; + } + &.#{$ns}-intent-#{$intent} { + color: eccgui-color-var("identity", $colorrange, "700"); + background-color: rgba(eccgui-color-var("identity", $colorrange, "300"), 0.1); + + &::before, + .#{$ns}-menu-item-icon, + .#{$ns}-submenu-icon { + color: inherit; + } + } + } + } + } + } + } +} diff --git a/src/components/ProgressBar/ProgressBar.tsx b/src/components/ProgressBar/ProgressBar.tsx index 7a66f711a..ce91a975f 100644 --- a/src/components/ProgressBar/ProgressBar.tsx +++ b/src/components/ProgressBar/ProgressBar.tsx @@ -5,6 +5,9 @@ import classNames from "classnames"; import { CLASSPREFIX as eccgui } from "../../configuration/constants"; export interface ProgressBarProps extends Omit { + /** + * Visual intent color to apply to element. + */ intent?: BlueprintProgressBarProps["intent"] | "accent"; } From 95d0c822f6679ff1d1df8f49f347739249f262e9 Mon Sep 17 00:00:00 2001 From: Michael Haschke Date: Tue, 7 Jul 2026 14:39:59 +0200 Subject: [PATCH 03/13] switch primary and accent colors --- CHANGELOG.md | 2 + src/components/TextField/TextArea.tsx | 2 +- src/components/TextField/TextField.tsx | 2 +- src/components/TextField/textfield.scss | 60 +++++++++++++++++++------ 4 files changed, 50 insertions(+), 16 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 13e32d288..0b960bb80 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -37,6 +37,8 @@ The format is based on [Keep a Changelog](http://keepachangelog.com/) and this p - ``, `` - color for `intent="primary"` was changed to our brand color - new option `accent` for `intent` uses the accent color +- ``, `