diff --git a/packages/core/src/components.d.ts b/packages/core/src/components.d.ts index 908662782d0..86a6964a09b 100644 --- a/packages/core/src/components.d.ts +++ b/packages/core/src/components.d.ts @@ -450,6 +450,10 @@ export namespace Components { crossAxis?: number; alignmentAxis?: number; }; + "overwriteDropdownStyle": (delegate: { + dropdownRef: HTMLElement; + triggerRef?: HTMLElement; + }) => Promise>; /** * Placement of the dropdown */ @@ -2715,6 +2719,10 @@ declare namespace LocalJSX { * Fire event after visibility of dropdown has changed */ "onShowChanged"?: (event: IxDropdownCustomEvent) => void; + "overwriteDropdownStyle"?: (delegate: { + dropdownRef: HTMLElement; + triggerRef?: HTMLElement; + }) => Promise>; /** * Placement of the dropdown */ diff --git a/packages/core/src/components/dropdown/dropdown.tsx b/packages/core/src/components/dropdown/dropdown.tsx index d1e3e334371..85c5358648c 100644 --- a/packages/core/src/components/dropdown/dropdown.tsx +++ b/packages/core/src/components/dropdown/dropdown.tsx @@ -8,10 +8,10 @@ */ import { - autoPlacement, autoUpdate, computePosition, ComputePositionConfig, + flip, inline, offset, shift, @@ -28,7 +28,6 @@ import { Prop, Watch, } from '@stencil/core'; -import { getAlignment } from './alignment'; import { DropdownTriggerEvent } from './dropdown-trigger-event'; import { BasePlacement, Placement, PlacementWithAlignment } from './placement'; @@ -106,6 +105,14 @@ export class Dropdown { */ @Prop() triggerEvent: DropdownTriggerEvent | DropdownTriggerEvent[] = 'click'; + /** + * @internal + */ + @Prop() overwriteDropdownStyle: (delegate: { + dropdownRef: HTMLElement; + triggerRef?: HTMLElement; + }) => Promise>; + /** * Fire event after visibility of dropdown has changed */ @@ -314,11 +321,7 @@ export class Dropdown { }; if (this.placement.includes('auto')) { - positionConfig.middleware.push( - autoPlacement({ - alignment: getAlignment(this.placement), - }) - ); + positionConfig.middleware.push(flip()); } else { positionConfig.placement = this.placement as | BasePlacement @@ -355,6 +358,14 @@ export class Dropdown { computeResponse.x )}px,${Math.round(computeResponse.y)}px)`, }); + if (this.overwriteDropdownStyle) { + const overwriteStyle = await this.overwriteDropdownStyle({ + dropdownRef: this.dropdownRef, + triggerRef: this.triggerElement as HTMLElement, + }); + + Object.assign(this.dropdownRef.style, overwriteStyle); + } }, { ancestorResize: true, diff --git a/packages/core/src/components/my-component/my-component.scss b/packages/core/src/components/my-component/my-component.scss index 625fd810a11..310abcff059 100644 --- a/packages/core/src/components/my-component/my-component.scss +++ b/packages/core/src/components/my-component/my-component.scss @@ -10,7 +10,7 @@ @import 'common-variables'; :host { - display: flex; + display: block; position: relative; width: 100vw; height: 100vh; diff --git a/packages/core/src/components/select/select.tsx b/packages/core/src/components/select/select.tsx index 43d930b77b0..09c8ad7d218 100644 --- a/packages/core/src/components/select/select.tsx +++ b/packages/core/src/components/select/select.tsx @@ -429,9 +429,6 @@ export class Select { (this.dropdownRef = ref)} show={this.dropdownShow} - style={{ - width: '100%', - }} class={{ 'd-none': this.disabled || @@ -441,8 +438,12 @@ export class Select { anchor={this.dropdownAnchor} trigger={this.dropdownWrapperRef} onShowChanged={(e) => this.dropdownVisibilityChanged(e)} - placement="bottom-start" - positioningStrategy={'absolute'} + placement="auto-start" + overwriteDropdownStyle={async (delegateConfig) => { + return { + width: `${delegateConfig.triggerRef.clientWidth}px`, + }; + }} >
{this.i18nSelectListHeader} diff --git a/packages/core/src/tests/select/autoplacement/index.html b/packages/core/src/tests/select/autoplacement/index.html new file mode 100644 index 00000000000..ab724efcb25 --- /dev/null +++ b/packages/core/src/tests/select/autoplacement/index.html @@ -0,0 +1,26 @@ + + + + + + + Stencil Component Starter + + +
+ + + + + +
+ + + diff --git a/packages/core/src/tests/select/overflow/index.html b/packages/core/src/tests/select/overflow/index.html new file mode 100644 index 00000000000..c24d394f9cf --- /dev/null +++ b/packages/core/src/tests/select/overflow/index.html @@ -0,0 +1,26 @@ + + + + + + + Stencil Component Starter + + + + + + + + + + + + diff --git a/packages/core/src/tests/select/select.e2e.ts b/packages/core/src/tests/select/select.e2e.ts index baf6e8eb6da..4b126cae840 100644 --- a/packages/core/src/tests/select/select.e2e.ts +++ b/packages/core/src/tests/select/select.e2e.ts @@ -50,4 +50,18 @@ regressionTest.describe('select', () => { expect(await page.screenshot({ fullPage: true })).toMatchSnapshot(); }); + + regressionTest('overflow', async ({ page }) => { + await page.goto('select/overflow'); + await page.locator('.chevron-down-container').click(); + await page.waitForSelector('.dropdown-menu.show'); + expect(await page.screenshot({ fullPage: true })).toMatchSnapshot(); + }); + + regressionTest('autoplacement', async ({ page }) => { + await page.goto('select/autoplacement'); + await page.locator('.chevron-down-container').click(); + await page.waitForSelector('.dropdown-menu.show'); + expect(await page.screenshot({ fullPage: true })).toMatchSnapshot(); + }); }); diff --git a/packages/core/src/tests/select/select.e2e.ts-snapshots/select-autoplacement-1-chromium---theme-classic-dark-linux.png b/packages/core/src/tests/select/select.e2e.ts-snapshots/select-autoplacement-1-chromium---theme-classic-dark-linux.png new file mode 100644 index 00000000000..a2c6a7975e7 Binary files /dev/null and b/packages/core/src/tests/select/select.e2e.ts-snapshots/select-autoplacement-1-chromium---theme-classic-dark-linux.png differ diff --git a/packages/core/src/tests/select/select.e2e.ts-snapshots/select-autoplacement-1-chromium---theme-classic-light-linux.png b/packages/core/src/tests/select/select.e2e.ts-snapshots/select-autoplacement-1-chromium---theme-classic-light-linux.png new file mode 100644 index 00000000000..09239231ef9 Binary files /dev/null and b/packages/core/src/tests/select/select.e2e.ts-snapshots/select-autoplacement-1-chromium---theme-classic-light-linux.png differ diff --git a/packages/core/src/tests/select/select.e2e.ts-snapshots/select-overflow-1-chromium---theme-classic-dark-linux.png b/packages/core/src/tests/select/select.e2e.ts-snapshots/select-overflow-1-chromium---theme-classic-dark-linux.png new file mode 100644 index 00000000000..586027f0cd9 Binary files /dev/null and b/packages/core/src/tests/select/select.e2e.ts-snapshots/select-overflow-1-chromium---theme-classic-dark-linux.png differ diff --git a/packages/core/src/tests/select/select.e2e.ts-snapshots/select-overflow-1-chromium---theme-classic-light-linux.png b/packages/core/src/tests/select/select.e2e.ts-snapshots/select-overflow-1-chromium---theme-classic-light-linux.png new file mode 100644 index 00000000000..2c5ae418435 Binary files /dev/null and b/packages/core/src/tests/select/select.e2e.ts-snapshots/select-overflow-1-chromium---theme-classic-light-linux.png differ