From 0f02c2e769f1fbfc321e4ebe0bf31a024c1663be Mon Sep 17 00:00:00 2001 From: ariellalgilmore Date: Fri, 21 Feb 2025 08:09:50 -0800 Subject: [PATCH 1/6] feat(breadcrumb): sm size --- .../__snapshots__/PublicAPI-test.js.snap | 9 +++ .../Breadcrumb/Breadcrumb.stories.js | 12 +++- .../src/components/Breadcrumb/Breadcrumb.tsx | 13 ++++ .../Breadcrumb/__tests__/Breadcrumb-test.js | 8 +++ .../components/breadcrumb/_breadcrumb.scss | 22 ++++++ .../scss/components/tooltip/_tooltip.scss | 1 + .../src/components/badge-indicator/defs.ts | 70 ++++++++++++++++++ .../src/components/breadcrumb/breadcrumb.scss | 17 +++++ .../breadcrumb/breadcrumb.stories.ts | 72 ++++++++++++------- .../src/components/breadcrumb/breadcrumb.ts | 25 ++++++- .../src/components/breadcrumb/defs.ts | 23 ++++++ 11 files changed, 244 insertions(+), 28 deletions(-) create mode 100644 packages/web-components/src/components/badge-indicator/defs.ts create mode 100644 packages/web-components/src/components/breadcrumb/defs.ts diff --git a/packages/react/__tests__/__snapshots__/PublicAPI-test.js.snap b/packages/react/__tests__/__snapshots__/PublicAPI-test.js.snap index 4638979e34aa..eb9a565dce52 100644 --- a/packages/react/__tests__/__snapshots__/PublicAPI-test.js.snap +++ b/packages/react/__tests__/__snapshots__/PublicAPI-test.js.snap @@ -324,6 +324,15 @@ Map { "noTrailingSlash": Object { "type": "bool", }, + "size": Object { + "args": Array [ + Array [ + "sm", + "md", + ], + ], + "type": "oneOf", + }, }, "render": [Function], }, diff --git a/packages/react/src/components/Breadcrumb/Breadcrumb.stories.js b/packages/react/src/components/Breadcrumb/Breadcrumb.stories.js index a846d3152d2f..8fae58c698d5 100644 --- a/packages/react/src/components/Breadcrumb/Breadcrumb.stories.js +++ b/packages/react/src/components/Breadcrumb/Breadcrumb.stories.js @@ -33,6 +33,10 @@ const sharedArgTypes = { disable: true, }, }, + size: { + options: ['sm', 'md'], + control: { type: 'select' }, + }, }; export const Default = (args) => ( @@ -40,7 +44,9 @@ export const Default = (args) => ( Breadcrumb 1 - Breadcrumb 2 + + Breadcrumb 2 + Breadcrumb 3 Breadcrumb 4 @@ -50,6 +56,10 @@ Default.argTypes = { ...sharedArgTypes, }; +Default.argTypes = { + ...sharedArgTypes, +}; + export const BreadcrumbWithOverflowMenu = (args) => ( diff --git a/packages/react/src/components/Breadcrumb/Breadcrumb.tsx b/packages/react/src/components/Breadcrumb/Breadcrumb.tsx index 7b1e11a76919..82c0f78df98c 100644 --- a/packages/react/src/components/Breadcrumb/Breadcrumb.tsx +++ b/packages/react/src/components/Breadcrumb/Breadcrumb.tsx @@ -26,6 +26,12 @@ export interface BreadcrumbProps extends React.HTMLAttributes { * Optional prop to omit the trailing slash for the breadcrumbs */ noTrailingSlash?: boolean; + + /** + * Specify the size of the Breadcrumb. Currently + * supports the following: `sm` & `md` (default: 'md') + */ + size?: 'sm' | 'md'; } const Breadcrumb: ForwardRefReturn = @@ -35,6 +41,7 @@ const Breadcrumb: ForwardRefReturn = children, className: customClassNameNav, noTrailingSlash, + size, ...rest }: PropsWithChildren, ref: React.Ref @@ -43,6 +50,7 @@ const Breadcrumb: ForwardRefReturn = const className = cx({ [`${prefix}--breadcrumb`]: true, [`${prefix}--breadcrumb--no-trailing-slash`]: noTrailingSlash, + [`${prefix}--breadcrumb--sm`]: size === 'sm', }); return ( @@ -77,6 +85,11 @@ Breadcrumb.propTypes = { * Optional prop to omit the trailing slash for the breadcrumbs */ noTrailingSlash: PropTypes.bool, + + /** + * Specify the size of the Breadcrumb. Currently supports the following: + */ + size: PropTypes.oneOf(['sm', 'md']), }; export default Breadcrumb; diff --git a/packages/react/src/components/Breadcrumb/__tests__/Breadcrumb-test.js b/packages/react/src/components/Breadcrumb/__tests__/Breadcrumb-test.js index 8049d50992cc..4ed68282130a 100644 --- a/packages/react/src/components/Breadcrumb/__tests__/Breadcrumb-test.js +++ b/packages/react/src/components/Breadcrumb/__tests__/Breadcrumb-test.js @@ -56,6 +56,14 @@ describe('Breadcrumb', () => { ); }); + it('should respect size prop', () => { + const { container } = render(); + + expect(container.firstChild.firstChild).toHaveClass( + `${prefix}--breadcrumb--sm` + ); + }); + it('should accept a `className` for outermost DOM node', () => { const { container } = render(); diff --git a/packages/styles/scss/components/breadcrumb/_breadcrumb.scss b/packages/styles/scss/components/breadcrumb/_breadcrumb.scss index 8601f11072ff..4c2cf53fee3a 100644 --- a/packages/styles/scss/components/breadcrumb/_breadcrumb.scss +++ b/packages/styles/scss/components/breadcrumb/_breadcrumb.scss @@ -30,6 +30,14 @@ } } + .#{$prefix}--breadcrumb--sm { + @include type-style('label-01'); + } + + .#{$prefix}--breadcrumb .#{$prefix}--link { + font: inherit; + } + .#{$prefix}--breadcrumb-item { position: relative; display: flex; @@ -37,6 +45,10 @@ margin-inline-end: $spacing-03; } + .#{$prefix}--breadcrumb--sm .#{$prefix}--breadcrumb-item { + margin-inline-end: $spacing-02; + } + .#{$prefix}--breadcrumb-item .#{$prefix}--link:visited { color: $link-primary; @@ -51,6 +63,10 @@ margin-inline-start: $spacing-03; } + .#{$prefix}--breadcrumb--sm .#{$prefix}--breadcrumb-item::after { + margin-inline-start: $spacing-02; + } + .#{$prefix}--breadcrumb--no-trailing-slash .#{$prefix}--breadcrumb-item:last-child::after { content: ''; @@ -107,6 +123,12 @@ } } + .#{$prefix}--breadcrumb--sm + .#{$prefix}--breadcrumb-item + .#{$prefix}--overflow-menu { + inline-size: $spacing-05; + } + .#{$prefix}--breadcrumb-item .#{$prefix}--overflow-menu:hover::after { opacity: 1; } diff --git a/packages/styles/scss/components/tooltip/_tooltip.scss b/packages/styles/scss/components/tooltip/_tooltip.scss index 727eb182074f..2f7511a27e1d 100644 --- a/packages/styles/scss/components/tooltip/_tooltip.scss +++ b/packages/styles/scss/components/tooltip/_tooltip.scss @@ -64,6 +64,7 @@ $tooltip-padding-inline: custom-property.get-var( padding: convert.to-rem(8px) convert.to-rem(16px); max-inline-size: convert.to-rem(176px); + text-wrap: auto; } } diff --git a/packages/web-components/src/components/badge-indicator/defs.ts b/packages/web-components/src/components/badge-indicator/defs.ts new file mode 100644 index 000000000000..96497c6d6d34 --- /dev/null +++ b/packages/web-components/src/components/badge-indicator/defs.ts @@ -0,0 +1,70 @@ +/** + * @license + * + * Copyright IBM Corp. 2020, 2023 + * + * This source code is licensed under the Apache-2.0 license found in the + * LICENSE file in the root directory of this source tree. + */ + +export enum ICON_INDICATOR_KIND { + /** + * Failed + */ + FAILED = 'failed', + + /** + * Caution major. + */ + 'CAUTION-MAJOR' = 'caution-major', + + /** + * Caution minor. + */ + 'CAUTION-MINOR' = 'caution-minor', + + /** + * Undefined. + */ + UNDEFINED = 'undefined', + + /** + * Succeeded. + */ + SUCCEEDED = 'succeeded', + + /** + * Normal. + */ + NORMAL = 'normal', + + /** + * In-progress. + */ + 'IN-PROGRESS' = 'in-progress', + + /** + * Incomplete. + */ + INCOMPLETE = 'incomplete', + + /** + * Not started. + */ + 'NOT-STARTED' = 'not-started', + + /** + * Pending. + */ + PENDING = 'pending', + + /** + * Unknown. + */ + UNKNOWN = 'unknown', + + /** + * Informative. + */ + INFORMATIVE = 'informative', +} diff --git a/packages/web-components/src/components/breadcrumb/breadcrumb.scss b/packages/web-components/src/components/breadcrumb/breadcrumb.scss index 20dc9c731acd..0a78895e557d 100644 --- a/packages/web-components/src/components/breadcrumb/breadcrumb.scss +++ b/packages/web-components/src/components/breadcrumb/breadcrumb.scss @@ -36,6 +36,14 @@ $css--plex: true !default; } } +:host(#{$prefix}-breadcrumb[size='sm']) ::slotted(#{$prefix}-breadcrumb-item) { + margin-inline-end: $spacing-02; + + &::after { + margin-inline-start: $spacing-02; + } +} + :host(#{$prefix}-breadcrumb-overflow-menu) { position: relative; block-size: rem(18px); @@ -70,6 +78,11 @@ $css--plex: true !default; } } +:host(#{$prefix}-breadcrumb-item[size='sm']) + ::slotted(#{$prefix}-breadcrumb-overflow-menu) { + inline-size: $spacing-05; +} + :host(#{$prefix}-breadcrumb-overflow-menu[open]) { background: transparent; box-shadow: none; @@ -93,6 +106,10 @@ $css--plex: true !default; :host(#{$prefix}-breadcrumb-link) { outline: none; + .#{$prefix}--link { + font: inherit; + } + // Re-define the ruleset so this wins over `.#{$prefix}--link:visited`, etc. .#{$prefix}--link--disabled { color: $text-disabled; diff --git a/packages/web-components/src/components/breadcrumb/breadcrumb.stories.ts b/packages/web-components/src/components/breadcrumb/breadcrumb.stories.ts index 42190f50828f..0e2c4b8ca2ce 100644 --- a/packages/web-components/src/components/breadcrumb/breadcrumb.stories.ts +++ b/packages/web-components/src/components/breadcrumb/breadcrumb.stories.ts @@ -14,7 +14,12 @@ import './breadcrumb-link'; import './breadcrumb-overflow-menu'; import '../overflow-menu/overflow-menu-body'; import './breadcrumb-skeleton'; +import { BREADCRUMB_SIZE } from './defs'; +const sizes = { + [`Small size (${BREADCRUMB_SIZE.SMALL})`]: BREADCRUMB_SIZE.SMALL, + [`Medium size (${BREADCRUMB_SIZE.MEDIUM})`]: BREADCRUMB_SIZE.MEDIUM, +}; const args = { ariaLabel: '', classes: '', @@ -37,6 +42,11 @@ const argTypes = { description: 'Optional prop to omit the trailing slash for the breadcrumbs.', }, + size: { + control: 'select', + description: 'Specify the size of the Accordion.', + options: sizes, + }, }; export const Default = { @@ -61,30 +71,39 @@ export const Default = { }; export const BreadcrumbWithOverflowMenu = { - render: () => html` - - - Breadcrumb 1 - - - Breadcrumb 2 - - - - - Breadcrumb 3 - Breadcrumb 4 - - - - - Breadcrumb 5 - - - Breadcrumb 6 - - - `, + args, + argTypes, + render: (args) => { + const { ariaLabel, classes, noTrailingSlash, size } = args ?? {}; + return html` + + + Breadcrumb 1 + + + Breadcrumb 2 + + + + + Breadcrumb 3 + Breadcrumb 4 + + + + + Breadcrumb 5 + + + Breadcrumb 6 + + + `; + }, }; export const Skeleton = { @@ -97,12 +116,13 @@ export const Playground = { args, argTypes, render: (args) => { - const { ariaLabel, classes, noTrailingSlash } = args ?? {}; + const { ariaLabel, classes, noTrailingSlash, size } = args ?? {}; return html` + aria-label="${ariaLabel}" + size="${size}"> Breadcrumb 1 diff --git a/packages/web-components/src/components/breadcrumb/breadcrumb.ts b/packages/web-components/src/components/breadcrumb/breadcrumb.ts index ccb2c49c1511..65f9a597b11f 100644 --- a/packages/web-components/src/components/breadcrumb/breadcrumb.ts +++ b/packages/web-components/src/components/breadcrumb/breadcrumb.ts @@ -11,6 +11,7 @@ import { classMap } from 'lit/directives/class-map.js'; import { LitElement, html } from 'lit'; import { property } from 'lit/decorators.js'; import { prefix } from '../../globals/settings'; +import { BREADCRUMB_SIZE } from './defs'; import styles from './breadcrumb.scss?lit'; import { carbonElement as customElement } from '../../globals/decorators/carbon-element'; @@ -27,6 +28,27 @@ class CDSBreadcrumb extends LitElement { @property({ type: Boolean, reflect: true, attribute: 'no-trailing-slash' }) noTrailingSlash = false; + /** + * Specify the size of the Breadcrumb. Currently + * supports the following: `sm` & `md` (default: 'md') + */ + @property() + size = BREADCRUMB_SIZE.MEDIUM; + + /** + * Handles `slotchange` event. + */ + private _handleSlotChange({ target }: Event) { + const items = (target as HTMLSlotElement) + .assignedNodes() + .filter( + (node) => node.nodeType !== Node.TEXT_NODE || node!.textContent!.trim() + ); + items.forEach((item) => { + (item as HTMLElement).setAttribute('size', this.size); + }); + } + connectedCallback() { if (!this.hasAttribute('role')) { this.setAttribute('role', 'navigation'); @@ -38,10 +60,11 @@ class CDSBreadcrumb extends LitElement { const classes = classMap({ [`${prefix}--breadcrumb`]: true, [`${prefix}--breadcrumb--no-trailing-slash`]: this.noTrailingSlash, + [`${prefix}--breadcrumb--sm`]: this.size === BREADCRUMB_SIZE.SMALL, }); return html`
    - +
`; } diff --git a/packages/web-components/src/components/breadcrumb/defs.ts b/packages/web-components/src/components/breadcrumb/defs.ts new file mode 100644 index 000000000000..37d20c609b1a --- /dev/null +++ b/packages/web-components/src/components/breadcrumb/defs.ts @@ -0,0 +1,23 @@ +/** + * @license + * + * Copyright IBM Corp. 2020, 2022, 2023 + * + * This source code is licensed under the Apache-2.0 license found in the + * LICENSE file in the root directory of this source tree. + */ + +/** + * Breadcrumb size. + */ +export enum BREADCRUMB_SIZE { + /** + * Small size. + */ + SMALL = 'sm', + + /** + * Medium size. + */ + MEDIUM = 'md', +} From ba6704d96fadd821b892709d151b3d1cd1eb9a05 Mon Sep 17 00:00:00 2001 From: ariellalgilmore Date: Mon, 24 Feb 2025 07:34:26 -0800 Subject: [PATCH 2/6] fix(push): error --- .../src/components/badge-indicator/defs.ts | 70 ------------------- 1 file changed, 70 deletions(-) delete mode 100644 packages/web-components/src/components/badge-indicator/defs.ts diff --git a/packages/web-components/src/components/badge-indicator/defs.ts b/packages/web-components/src/components/badge-indicator/defs.ts deleted file mode 100644 index 96497c6d6d34..000000000000 --- a/packages/web-components/src/components/badge-indicator/defs.ts +++ /dev/null @@ -1,70 +0,0 @@ -/** - * @license - * - * Copyright IBM Corp. 2020, 2023 - * - * This source code is licensed under the Apache-2.0 license found in the - * LICENSE file in the root directory of this source tree. - */ - -export enum ICON_INDICATOR_KIND { - /** - * Failed - */ - FAILED = 'failed', - - /** - * Caution major. - */ - 'CAUTION-MAJOR' = 'caution-major', - - /** - * Caution minor. - */ - 'CAUTION-MINOR' = 'caution-minor', - - /** - * Undefined. - */ - UNDEFINED = 'undefined', - - /** - * Succeeded. - */ - SUCCEEDED = 'succeeded', - - /** - * Normal. - */ - NORMAL = 'normal', - - /** - * In-progress. - */ - 'IN-PROGRESS' = 'in-progress', - - /** - * Incomplete. - */ - INCOMPLETE = 'incomplete', - - /** - * Not started. - */ - 'NOT-STARTED' = 'not-started', - - /** - * Pending. - */ - PENDING = 'pending', - - /** - * Unknown. - */ - UNKNOWN = 'unknown', - - /** - * Informative. - */ - INFORMATIVE = 'informative', -} From df83a6532b58caf8ee1cbaa2ddab2d2c51daa4d0 Mon Sep 17 00:00:00 2001 From: ariellalgilmore Date: Mon, 24 Feb 2025 10:49:01 -0800 Subject: [PATCH 3/6] fix(comments): update --- .../react/src/components/Breadcrumb/Breadcrumb.stories.js | 2 +- packages/styles/scss/components/breadcrumb/_breadcrumb.scss | 4 +++- .../src/components/breadcrumb/breadcrumb.stories.ts | 2 +- 3 files changed, 5 insertions(+), 3 deletions(-) diff --git a/packages/react/src/components/Breadcrumb/Breadcrumb.stories.js b/packages/react/src/components/Breadcrumb/Breadcrumb.stories.js index 8fae58c698d5..5559ac2e0ad3 100644 --- a/packages/react/src/components/Breadcrumb/Breadcrumb.stories.js +++ b/packages/react/src/components/Breadcrumb/Breadcrumb.stories.js @@ -67,7 +67,7 @@ export const BreadcrumbWithOverflowMenu = (args) => (
Breadcrumb 2 - + diff --git a/packages/styles/scss/components/breadcrumb/_breadcrumb.scss b/packages/styles/scss/components/breadcrumb/_breadcrumb.scss index 4c2cf53fee3a..748dacc2850d 100644 --- a/packages/styles/scss/components/breadcrumb/_breadcrumb.scss +++ b/packages/styles/scss/components/breadcrumb/_breadcrumb.scss @@ -139,7 +139,9 @@ box-shadow: none; } - .#{$prefix}--breadcrumb-item .#{$prefix}--overflow-menu__icon { + .#{$prefix}--breadcrumb-item + .#{$prefix}--overflow-menu + .#{$prefix}--overflow-menu__icon { position: relative; fill: $link-primary; transform: translateY(4px); diff --git a/packages/web-components/src/components/breadcrumb/breadcrumb.stories.ts b/packages/web-components/src/components/breadcrumb/breadcrumb.stories.ts index 0e2c4b8ca2ce..be3d346003ed 100644 --- a/packages/web-components/src/components/breadcrumb/breadcrumb.stories.ts +++ b/packages/web-components/src/components/breadcrumb/breadcrumb.stories.ts @@ -12,7 +12,7 @@ import './breadcrumb'; import './breadcrumb-item'; import './breadcrumb-link'; import './breadcrumb-overflow-menu'; -import '../overflow-menu/overflow-menu-body'; +import '../overflow-menu/index'; import './breadcrumb-skeleton'; import { BREADCRUMB_SIZE } from './defs'; From 3addda27271be9ee6e26bcbeeef2120251789ba9 Mon Sep 17 00:00:00 2001 From: ariellalgilmore Date: Mon, 24 Feb 2025 15:17:15 -0800 Subject: [PATCH 4/6] fix(breadcrumb): story revert --- .../react/src/components/Breadcrumb/Breadcrumb.stories.js | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/packages/react/src/components/Breadcrumb/Breadcrumb.stories.js b/packages/react/src/components/Breadcrumb/Breadcrumb.stories.js index 5559ac2e0ad3..5f1470f4e40e 100644 --- a/packages/react/src/components/Breadcrumb/Breadcrumb.stories.js +++ b/packages/react/src/components/Breadcrumb/Breadcrumb.stories.js @@ -44,9 +44,7 @@ export const Default = (args) => ( Breadcrumb 1 - - Breadcrumb 2 - + Breadcrumb 2 Breadcrumb 3 Breadcrumb 4
From aea1debce8dcd0d218540411490a19b4ffd5de5e Mon Sep 17 00:00:00 2001 From: Ariella Gilmore Date: Tue, 25 Feb 2025 12:13:30 -0800 Subject: [PATCH 5/6] Update packages/react/src/components/Breadcrumb/__tests__/Breadcrumb-test.js Co-authored-by: Taylor Jones --- .../src/components/Breadcrumb/__tests__/Breadcrumb-test.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/react/src/components/Breadcrumb/__tests__/Breadcrumb-test.js b/packages/react/src/components/Breadcrumb/__tests__/Breadcrumb-test.js index 4ed68282130a..d836180f8c92 100644 --- a/packages/react/src/components/Breadcrumb/__tests__/Breadcrumb-test.js +++ b/packages/react/src/components/Breadcrumb/__tests__/Breadcrumb-test.js @@ -57,9 +57,9 @@ describe('Breadcrumb', () => { }); it('should respect size prop', () => { - const { container } = render(); + render(); - expect(container.firstChild.firstChild).toHaveClass( + expect(screen.getByRole('list')).toHaveClass( `${prefix}--breadcrumb--sm` ); }); From 5c4bccb52f4ef46055c3ae10b15386c156adca0a Mon Sep 17 00:00:00 2001 From: ariellalgilmore Date: Wed, 26 Feb 2025 06:50:24 -0800 Subject: [PATCH 6/6] fix(breadcrumb): tests --- e2e/components/Breadcrumb/Breadcrumb-test.e2e.js | 16 ++++++++++++++++ .../Breadcrumb/__tests__/Breadcrumb-test.js | 4 +--- 2 files changed, 17 insertions(+), 3 deletions(-) diff --git a/e2e/components/Breadcrumb/Breadcrumb-test.e2e.js b/e2e/components/Breadcrumb/Breadcrumb-test.e2e.js index 826bce39b829..00a3035f856f 100644 --- a/e2e/components/Breadcrumb/Breadcrumb-test.e2e.js +++ b/e2e/components/Breadcrumb/Breadcrumb-test.e2e.js @@ -38,6 +38,22 @@ test.describe('breadcrumb', () => { theme, }); }); + + test('breadcrumb size sm with overflow menu @vrt', async ({ page }) => { + await visitStory(page, { + component: 'breadcrumb', + story: 'breadcrumb-with-overflow-menu', + theme, + args: { + size: 'sm', + }, + }); + await snapshot(page, { + component: 'breadcrumb', + story: 'breadcrumb-with-overflow-menu', + theme, + }); + }); }); }); }); diff --git a/packages/react/src/components/Breadcrumb/__tests__/Breadcrumb-test.js b/packages/react/src/components/Breadcrumb/__tests__/Breadcrumb-test.js index d836180f8c92..c288fbd07ba2 100644 --- a/packages/react/src/components/Breadcrumb/__tests__/Breadcrumb-test.js +++ b/packages/react/src/components/Breadcrumb/__tests__/Breadcrumb-test.js @@ -59,9 +59,7 @@ describe('Breadcrumb', () => { it('should respect size prop', () => { render(); - expect(screen.getByRole('list')).toHaveClass( - `${prefix}--breadcrumb--sm` - ); + expect(screen.getByRole('list')).toHaveClass(`${prefix}--breadcrumb--sm`); }); it('should accept a `className` for outermost DOM node', () => {