diff --git a/packages/core/component-doc.json b/packages/core/component-doc.json index 3786ee17195..4a0d82ec644 100644 --- a/packages/core/component-doc.json +++ b/packages/core/component-doc.json @@ -10507,7 +10507,7 @@ "resolved": "string", "references": {} }, - "mutable": false, + "mutable": true, "attr": "icon", "reflectToAttr": false, "docs": "Name of the icon you want to display. Icon names can be resolved from the documentation", @@ -10554,7 +10554,7 @@ "resolved": "string", "references": {} }, - "mutable": false, + "mutable": true, "attr": "tab-icon", "reflectToAttr": false, "docs": "Name of the icon you want to display. Icon names can be resolved from the documentation", @@ -10568,7 +10568,6 @@ "text": "since 2.0.0 use `icon` property. Will be removed in 3.0.0" } ], - "default": "'document'", "deprecation": "since 2.0.0 use `icon` property. Will be removed in 3.0.0", "values": [ { diff --git a/packages/core/src/components/menu-category/menu-category.scss b/packages/core/src/components/menu-category/menu-category.scss index 0c4bf001b21..3f55c9404ca 100644 --- a/packages/core/src/components/menu-category/menu-category.scss +++ b/packages/core/src/components/menu-category/menu-category.scss @@ -8,6 +8,7 @@ */ @import 'mixins/shadow-dom/component'; +@import 'mixins/text-truncation'; :host { @include ix-component; @@ -23,6 +24,12 @@ height: 100%; } + .category-text { + width: 100%; + padding-right: 0.25rem; + @include ellipsis; + } + .category-chevron { margin-left: auto; margin-right: 0px; @@ -44,6 +51,10 @@ max-height: 999999999px; } + .menu-items--collapsed { + display: none; + } + .category-dropdown { ::slotted(ix-menu-item) { --ix-menu-item-height: 2.5rem; @@ -52,6 +63,7 @@ .category-dropdown-header { pointer-events: none; + padding-left: 0.125rem; min-width: 256px; } diff --git a/packages/core/src/components/menu-category/menu-category.tsx b/packages/core/src/components/menu-category/menu-category.tsx index dbbedd9b414..7fdc8390022 100644 --- a/packages/core/src/components/menu-category/menu-category.tsx +++ b/packages/core/src/components/menu-category/menu-category.tsx @@ -171,7 +171,7 @@ export class MenuCategory { onClick={(e) => this.onCategoryClicked(e)} >
- {this.label} +
{this.label}
{this.showItems ? : null} diff --git a/packages/core/src/components/menu-category/test/menu-category.ct.ts b/packages/core/src/components/menu-category/test/menu-category.ct.ts index e082821cd78..d88337979c1 100644 --- a/packages/core/src/components/menu-category/test/menu-category.ct.ts +++ b/packages/core/src/components/menu-category/test/menu-category.ct.ts @@ -118,7 +118,9 @@ test('should show items as dropdown', async ({ mount, page }) => { const dropdown = menuCategory.locator('ix-dropdown'); await expect(dropdown).toBeVisible(); - await expect(menuCategory.locator('.menu-items')).toHaveClass('menu-items'); + await expect(menuCategory.locator('.menu-items')).toHaveClass( + 'menu-items menu-items--collapsed' + ); const dropdownHeader = dropdown.locator('ix-dropdown-item'); await expect(dropdownHeader).toHaveText('Category label'); @@ -164,5 +166,38 @@ test('should collapse category after collapse menu', async ({ ); await menuButton.click(); - await expect(menuCategory.locator('.menu-items')).toHaveClass('menu-items'); + await expect(menuCategory.locator('.menu-items')).toHaveClass( + 'menu-items menu-items--collapsed' + ); +}); + +test('should hide menu-items when collapsed', async ({ mount, page }) => { + await mount(` + + + + Test Item 1 + Test Item 2 + + + + `); + + await page.waitForSelector('ix-menu'); + const menu = page.locator('ix-menu'); + await page + .locator('ix-basic-navigation') + .evaluate( + (menu: HTMLIxBasicNavigationElement) => (menu.breakpoints = ['md']) + ); + + const menuButton = menu.locator('ix-burger-menu'); + await menuButton.click(); + + const menuCategory = page.locator('ix-menu-category'); + + await expect(menuCategory.locator('.menu-items')).toHaveClass( + 'menu-items menu-items--collapsed' + ); + await expect(menuCategory.locator('.menu-items')).toBeHidden(); }); diff --git a/packages/core/src/components/menu-item/menu-item.scss b/packages/core/src/components/menu-item/menu-item.scss index 854236756f4..af866e6bf36 100644 --- a/packages/core/src/components/menu-item/menu-item.scss +++ b/packages/core/src/components/menu-item/menu-item.scss @@ -56,7 +56,7 @@ $menuItemPadding: 0.875rem; display: inline-flex; position: absolute; top: 0.25rem; - left: 1.75rem; + left: 1.5rem; .pill { display: inline-flex; @@ -159,7 +159,28 @@ $menuItemPadding: 0.875rem; } :host(.tab-nested) { - .tab::before { - display: none; + .tab { + flex-direction: row; + padding-left: calc(0.5rem + $menuItemPadding); + + .notification { + position: relative; + top: 0; + left: 0; + padding-left: 0.5rem; + } + + .tab-icon { + padding-left: 0.5rem; + padding-right: 0.5rem; + } + + .tab-text { + margin-left: 0.5rem; + } + + &::before { + display: none; + } } } diff --git a/packages/core/src/components/menu-item/menu-item.tsx b/packages/core/src/components/menu-item/menu-item.tsx index 99d380bff2c..cede08e2027 100644 --- a/packages/core/src/components/menu-item/menu-item.tsx +++ b/packages/core/src/components/menu-item/menu-item.tsx @@ -7,7 +7,7 @@ * LICENSE file in the root directory of this source tree. */ -import { Component, Element, h, Host, Prop, State } from '@stencil/core'; +import { Component, Element, h, Host, Prop, State, Watch } from '@stencil/core'; import { createMutationObserver } from '../utils/mutation-observer'; /** @@ -36,12 +36,12 @@ export class MenuItem { * * @deprecated since 2.0.0 use `icon` property. Will be removed in 3.0.0 */ - @Prop() tabIcon = 'document'; + @Prop({ mutable: true }) tabIcon: string; /** * Name of the icon you want to display. Icon names can be resolved from the documentation @link https://ix.siemens.io/docs/icon-library/icons */ - @Prop() icon: string; + @Prop({ mutable: true }) icon: string; /** * Show notification count on tab @@ -68,6 +68,9 @@ export class MenuItem { componentWillLoad() { this.isHostedInsideCategory = !!this.hostElement.closest('ix-menu-category'); + + this.onIconChange(); + this.onTabIconChange(); } componentWillRender() { @@ -92,6 +95,28 @@ export class MenuItem { } } + @Watch('icon') + onIconChange() { + if ( + !this.isHostedInsideCategory && + !this.hostElement.icon && + !this.hostElement.tabIcon + ) { + this.icon = 'document'; + } + } + + @Watch('tabIcon') + onTabIconChange() { + if ( + !this.isHostedInsideCategory && + !this.hostElement.icon && + !this.hostElement.tabIcon + ) { + this.tabIcon = 'document'; + } + } + render() { let extendedAttributes = {}; if (this.home) { @@ -122,15 +147,17 @@ export class MenuItem { tabIndex={this.disabled ? -1 : 0} role="listitem" > - -
- {this.notifications ? ( + {(this.icon || this.tabIcon) && ( + + )} + {this.notifications ? ( +
{this.notifications}
- ) : null} -
+
+ ) : null} diff --git a/packages/core/src/tests/menu/basic/index.html b/packages/core/src/tests/menu/basic/index.html new file mode 100644 index 00000000000..ae8dd683bc4 --- /dev/null +++ b/packages/core/src/tests/menu/basic/index.html @@ -0,0 +1,31 @@ + + + + + + + + Stencil Component Starter + + + + + Item 1 + + Sub 1 + Sub 2 + Sub 3 + Sub 4 + + + + + + diff --git a/packages/core/src/tests/menu/link/index.html b/packages/core/src/tests/menu/link/index.html new file mode 100644 index 00000000000..f08838c53ae --- /dev/null +++ b/packages/core/src/tests/menu/link/index.html @@ -0,0 +1,41 @@ + + + + + + + + Stencil Component Starter + + + + + + Link 1 + + + + Link 2 + + + Link 3 + + + Link 4 + + + Link 5 + + + + + + + diff --git a/packages/core/src/tests/menu/menu.e2e.ts b/packages/core/src/tests/menu/menu.e2e.ts index 09de1f8f18d..b3117061417 100644 --- a/packages/core/src/tests/menu/menu.e2e.ts +++ b/packages/core/src/tests/menu/menu.e2e.ts @@ -7,52 +7,60 @@ * LICENSE file in the root directory of this source tree. */ -import { expect } from '@playwright/test'; -import { test, viewPorts } from '@utils/test'; - -test('should render menu items with a[href]', async ({ mount, page }) => { - await page.setViewportSize(viewPorts.lg); - await mount(` - - - - Link 1 - - - - Link 2 - - - Link 3 - - - Link 4 - - - Link 5 - - - - `); - - const basicNavigationElement = page.locator('ix-basic-navigation'); - - const category = page.locator('ix-menu-category'); - await category.click(); - - const link1 = page.getByText('Link 1'); - await expect(link1).toBeVisible(); - - const link2 = page.getByText('Link 2'); - await expect(link2).toBeVisible(); - - await link2.hover(); - - await page.waitForTimeout(1000); - - expect( - await basicNavigationElement.screenshot({ - animations: 'disabled', - }) - ).toMatchSnapshot(); +import { expect, test } from '@playwright/test'; +import { regressionTest, viewPorts } from '@utils/test'; + +test.describe('menu', () => { + regressionTest( + 'basic md - no default icon on second level, scaling for popup window', + async ({ page }) => { + await page.setViewportSize(viewPorts.md); + await page.goto('menu/basic'); + + const category = page.locator('ix-menu-category'); + await category.click(); + + await page.waitForTimeout(1000); + + await expect(page).toHaveScreenshot(); + } + ); + + regressionTest( + 'basic lg - no default icon on second level, visible ellipsis for category', + async ({ page }) => { + await page.setViewportSize(viewPorts.lg); + await page.goto('menu/basic'); + + const category = page.locator('ix-menu-category'); + await category.click(); + + await page.waitForTimeout(1000); + + await expect(page).toHaveScreenshot(); + } + ); + + regressionTest( + 'link - should render menu items with a[href]', + async ({ page }) => { + await page.setViewportSize(viewPorts.lg); + await page.goto('menu/link'); + + const category = page.locator('ix-menu-category'); + await category.click(); + + const link1 = page.getByText('Link 1'); + await expect(link1).toBeVisible(); + + const link2 = page.getByText('Link 2'); + await expect(link2).toBeVisible(); + + await link2.hover(); + + await page.waitForTimeout(1000); + + await expect(page).toHaveScreenshot(); + } + ); }); diff --git a/packages/core/src/tests/menu/menu.e2e.ts-snapshots/menu-basic-lg---no-default-icon-on-second-level-visible-ellipsis-for-category-1-chromium---theme-classic-dark-linux.png b/packages/core/src/tests/menu/menu.e2e.ts-snapshots/menu-basic-lg---no-default-icon-on-second-level-visible-ellipsis-for-category-1-chromium---theme-classic-dark-linux.png new file mode 100644 index 00000000000..0a79112cdd6 Binary files /dev/null and b/packages/core/src/tests/menu/menu.e2e.ts-snapshots/menu-basic-lg---no-default-icon-on-second-level-visible-ellipsis-for-category-1-chromium---theme-classic-dark-linux.png differ diff --git a/packages/core/src/tests/menu/menu.e2e.ts-snapshots/menu-basic-lg---no-default-icon-on-second-level-visible-ellipsis-for-category-1-chromium---theme-classic-light-linux.png b/packages/core/src/tests/menu/menu.e2e.ts-snapshots/menu-basic-lg---no-default-icon-on-second-level-visible-ellipsis-for-category-1-chromium---theme-classic-light-linux.png new file mode 100644 index 00000000000..50923a778eb Binary files /dev/null and b/packages/core/src/tests/menu/menu.e2e.ts-snapshots/menu-basic-lg---no-default-icon-on-second-level-visible-ellipsis-for-category-1-chromium---theme-classic-light-linux.png differ diff --git a/packages/core/src/tests/menu/menu.e2e.ts-snapshots/menu-basic-md---no-default-icon-on-second-level-scaling-for-popup-window-1-chromium---theme-classic-dark-linux.png b/packages/core/src/tests/menu/menu.e2e.ts-snapshots/menu-basic-md---no-default-icon-on-second-level-scaling-for-popup-window-1-chromium---theme-classic-dark-linux.png new file mode 100644 index 00000000000..5a58c347408 Binary files /dev/null and b/packages/core/src/tests/menu/menu.e2e.ts-snapshots/menu-basic-md---no-default-icon-on-second-level-scaling-for-popup-window-1-chromium---theme-classic-dark-linux.png differ diff --git a/packages/core/src/tests/menu/menu.e2e.ts-snapshots/menu-basic-md---no-default-icon-on-second-level-scaling-for-popup-window-1-chromium---theme-classic-light-linux.png b/packages/core/src/tests/menu/menu.e2e.ts-snapshots/menu-basic-md---no-default-icon-on-second-level-scaling-for-popup-window-1-chromium---theme-classic-light-linux.png new file mode 100644 index 00000000000..479faa2f9df Binary files /dev/null and b/packages/core/src/tests/menu/menu.e2e.ts-snapshots/menu-basic-md---no-default-icon-on-second-level-scaling-for-popup-window-1-chromium---theme-classic-light-linux.png differ diff --git a/packages/core/src/tests/menu/menu.e2e.ts-snapshots/menu-link---should-render-menu-items-with-a-href-1-chromium---theme-classic-dark-linux.png b/packages/core/src/tests/menu/menu.e2e.ts-snapshots/menu-link---should-render-menu-items-with-a-href-1-chromium---theme-classic-dark-linux.png new file mode 100644 index 00000000000..69d7fcbb272 Binary files /dev/null and b/packages/core/src/tests/menu/menu.e2e.ts-snapshots/menu-link---should-render-menu-items-with-a-href-1-chromium---theme-classic-dark-linux.png differ diff --git a/packages/core/src/tests/menu/menu.e2e.ts-snapshots/menu-link---should-render-menu-items-with-a-href-1-chromium---theme-classic-light-linux.png b/packages/core/src/tests/menu/menu.e2e.ts-snapshots/menu-link---should-render-menu-items-with-a-href-1-chromium---theme-classic-light-linux.png new file mode 100644 index 00000000000..d8023b44b2e Binary files /dev/null and b/packages/core/src/tests/menu/menu.e2e.ts-snapshots/menu-link---should-render-menu-items-with-a-href-1-chromium---theme-classic-light-linux.png differ diff --git a/packages/core/src/tests/menu/menu.e2e.ts-snapshots/should-render-menu-items-with-a-href-1-chromium---theme-classic-dark-linux.png b/packages/core/src/tests/menu/menu.e2e.ts-snapshots/should-render-menu-items-with-a-href-1-chromium---theme-classic-dark-linux.png deleted file mode 100644 index aacb160cf12..00000000000 Binary files a/packages/core/src/tests/menu/menu.e2e.ts-snapshots/should-render-menu-items-with-a-href-1-chromium---theme-classic-dark-linux.png and /dev/null differ diff --git a/packages/core/src/tests/menu/menu.e2e.ts-snapshots/should-render-menu-items-with-a-href-1-chromium---theme-classic-light-linux.png b/packages/core/src/tests/menu/menu.e2e.ts-snapshots/should-render-menu-items-with-a-href-1-chromium---theme-classic-light-linux.png deleted file mode 100644 index 09869558437..00000000000 Binary files a/packages/core/src/tests/menu/menu.e2e.ts-snapshots/should-render-menu-items-with-a-href-1-chromium---theme-classic-light-linux.png and /dev/null differ