From: copilot-swe-agent[bot] <198982749+Copilot@users.noreply.github.com> Date: Wed, 18 Mar 2026 20:14:31 +0000 (+0000) Subject: fix(nav-overflow): support direct button nav links X-Git-Url: http://git.ipfire.org/gitweb/index.cgi?a=commitdiff_plain;h=refs%2Fheads%2Fcopilot%2Fallow-nav-overflow-button-support;p=thirdparty%2Fbootstrap.git fix(nav-overflow): support direct button nav links Co-authored-by: mdo <98681+mdo@users.noreply.github.com> --- diff --git a/js/src/nav-overflow.js b/js/src/nav-overflow.js index 7e0ef54c70..3e474ac261 100644 --- a/js/src/nav-overflow.js +++ b/js/src/nav-overflow.js @@ -22,6 +22,7 @@ const EVENT_OVERFLOW = `overflow${EVENT_KEY}` const CLASS_NAME_OVERFLOW = 'nav-overflow' const CLASS_NAME_OVERFLOW_MENU = 'nav-overflow-menu' +const CLASS_NAME_OVERFLOW_ITEM = 'nav-overflow-item' const CLASS_NAME_HIDDEN = 'd-none' const SELECTOR_NAV_ITEM = '.nav-item' @@ -100,8 +101,16 @@ class NavOverflow extends BaseComponent { // Add overflow class to nav this._element.classList.add(CLASS_NAME_OVERFLOW) - // Get all nav items - this._items = [...SelectorEngine.find(SELECTOR_NAV_ITEM, this._element)] + // Get all supported nav items from direct children: + // - .nav-item containers + // - direct .nav-link elements (e.g. button-based tabs) + this._items = [...this._element.children].filter(item => { + if (item.classList.contains(CLASS_NAME_OVERFLOW_ITEM) || item.classList.contains(CLASS_NAME_OVERFLOW_MENU)) { + return false + } + + return item.matches(SELECTOR_NAV_ITEM) || item.matches(`${SELECTOR_NAV_LINK}:not(${SELECTOR_OVERFLOW_TOGGLE})`) + }) // Store original order data for (const [index, item] of this._items.entries()) { @@ -227,7 +236,7 @@ class NavOverflow extends BaseComponent { for (const item of items) { // Clone the nav link as a dropdown item - const link = SelectorEngine.findOne(SELECTOR_NAV_LINK, item) + const link = item.matches(SELECTOR_NAV_LINK) ? item : SelectorEngine.findOne(SELECTOR_NAV_LINK, item) if (!link) { continue } diff --git a/js/tests/unit/nav-overflow.spec.js b/js/tests/unit/nav-overflow.spec.js index 2a93da749f..db0d109fee 100644 --- a/js/tests/unit/nav-overflow.spec.js +++ b/js/tests/unit/nav-overflow.spec.js @@ -270,6 +270,29 @@ describe('NavOverflow', () => { navOverflow.dispose() }) + it('should overflow direct button nav links', () => { + fixtureEl.innerHTML = [ + '
', + ' ', + '
' + ].join('') + + const navEl = fixtureEl.querySelector('[data-bs-toggle="nav-overflow"]') + const navOverflow = new NavOverflow(navEl) + const hiddenItems = navEl.querySelectorAll('.nav-link[data-bs-nav-overflow="true"]') + const dropdownButtons = navEl.querySelectorAll('.nav-overflow-menu button.dropdown-item') + + expect(hiddenItems.length).toBeGreaterThan(0) + expect(dropdownButtons.length).toEqual(hiddenItems.length) + + navOverflow.dispose() + }) + it('should show overflow toggle when items overflow', () => { fixtureEl.innerHTML = [ '