diff --git a/packages/js/components/changelog/add-39875 b/packages/js/components/changelog/add-39875 new file mode 100644 index 00000000000..67e499eabf5 --- /dev/null +++ b/packages/js/components/changelog/add-39875 @@ -0,0 +1,4 @@ +Significance: patch +Type: fix + +Fix select control dropdown menu double scroll and width diff --git a/packages/js/components/src/experimental-select-control/menu-item.scss b/packages/js/components/src/experimental-select-control/menu-item.scss index 9f835220792..2387a40d789 100644 --- a/packages/js/components/src/experimental-select-control/menu-item.scss +++ b/packages/js/components/src/experimental-select-control/menu-item.scss @@ -1,5 +1,8 @@ .woocommerce-experimental-select-control__menu-item { - padding: $gap-small; - margin: 0; -} + padding: $gap-small; + margin: 0; + .components-base-control__field { + margin-bottom: 0; + } +} diff --git a/packages/js/components/src/experimental-select-control/menu.scss b/packages/js/components/src/experimental-select-control/menu.scss index 7c1f126b447..1fa08495c05 100644 --- a/packages/js/components/src/experimental-select-control/menu.scss +++ b/packages/js/components/src/experimental-select-control/menu.scss @@ -2,26 +2,30 @@ position: absolute; width: 100%; top: 100%; - left: 0; + left: -1px; margin-top: $gap-smaller; box-sizing: border-box; } .components-popover.woocommerce-experimental-select-control__popover-menu { background: $studio-white; - border: 1px solid $studio-gray-5; border-radius: 3px; display: none; &.is-open.has-results { display: block; } } +.woocommerce-experimental-select-control__popover-menu { + .components-popover__content { + max-height: 300px; + overflow-y: scroll; + } +} .woocommerce-experimental-select-control__popover-menu-container { margin: 0; - max-height: 300px; - overflow-y: scroll; + width: 100%; - > .category-field-dropdown__item:not( :first-child ) { + > .category-field-dropdown__item:not(:first-child) { .category-field-dropdown__item-content { border-top: 1px solid $gray-200; } diff --git a/packages/js/components/src/experimental-select-control/menu.tsx b/packages/js/components/src/experimental-select-control/menu.tsx index 2587e8422f2..0f106acfc58 100644 --- a/packages/js/components/src/experimental-select-control/menu.tsx +++ b/packages/js/components/src/experimental-select-control/menu.tsx @@ -7,7 +7,6 @@ import { createElement, useEffect, useRef, - useState, createPortal, Children, useLayoutEffect, @@ -35,21 +34,28 @@ export const Menu = ( { position = 'bottom right', scrollIntoViewOnOpen = false, }: MenuProps ) => { - const [ boundingRect, setBoundingRect ] = useState< DOMRect >(); const selectControlMenuRef = useRef< HTMLDivElement >( null ); + const popoverRef = useRef< HTMLDivElement >( null ); useLayoutEffect( () => { - if ( - selectControlMenuRef.current?.parentElement && - selectControlMenuRef.current?.parentElement.clientWidth > 0 - ) { - setBoundingRect( - selectControlMenuRef.current.parentElement.getBoundingClientRect() + const comboboxWrapper = selectControlMenuRef.current?.closest( + '.woocommerce-experimental-select-control__combo-box-wrapper' + ); + const popoverContent = + popoverRef.current?.querySelector< HTMLDivElement >( + '.components-popover__content' ); + if ( comboboxWrapper && comboboxWrapper?.clientWidth > 0 ) { + if ( popoverContent ) { + popoverContent.style.width = `${ + comboboxWrapper.getBoundingClientRect().width + }px`; + } } }, [ selectControlMenuRef.current, selectControlMenuRef.current?.clientWidth, + popoverRef.current, ] ); // Scroll the selected item into view when the menu opens. @@ -80,6 +86,8 @@ export const Menu = ( { ) } position={ position } animate={ false } + resize={ false } + ref={ popoverRef } >