diff --git a/src/core/render/index.js b/src/core/render/index.js index f4db19375..94f3316fc 100644 --- a/src/core/render/index.js +++ b/src/core/render/index.js @@ -324,8 +324,12 @@ export function Render(Base) { this.#addTextAsTitleAttribute('.sidebar-nav a'); if (loadSidebar && activeEl) { - const parent = /** @type {HTMLElement} */ (activeEl.parentElement); - parent.innerHTML += this.compiler.subSidebar(subMaxLevel) || ''; + activeEl + .closest('li') + ?.insertAdjacentHTML( + 'beforeend', + this.compiler.subSidebar(subMaxLevel) || '', + ); } else { this.compiler.resetToc(); } diff --git a/src/themes/shared/_sidebar.css b/src/themes/shared/_sidebar.css index 60444045a..0f83baef9 100644 --- a/src/themes/shared/_sidebar.css +++ b/src/themes/shared/_sidebar.css @@ -89,7 +89,7 @@ } &.collapse { - > :not(a) { + > :not(a, p:has(> a.page-link)) { display: none; } } diff --git a/test/e2e/sidebar.test.js b/test/e2e/sidebar.test.js index 88b444d9a..694ab5597 100644 --- a/test/e2e/sidebar.test.js +++ b/test/e2e/sidebar.test.js @@ -68,6 +68,50 @@ test.describe('Sidebar Tests', () => { await expect(activeLinkElm).toHaveText('Test >'); expect(page.url()).toMatch(/\/test%3Efoo$/); }); + + test('keeps a loose-list page link visible when collapsed', async ({ + page, + }) => { + await docsifyInit({ + config: { + subMaxLevel: 2, + }, + markdown: { + homepage: '# Home', + sidebar: ` + - Getting started + + - [Introduction](introduction.md) + + - [Quick start](quickstart.md) + `, + }, + routes: { + '/quickstart.md': ` + # Quick start + + ## Installation + `, + }, + styleURLs: ['/dist/themes/core.css'], + }); + + const quickStartLink = page.locator('.sidebar-nav a[href="#/quickstart"]'); + + await quickStartLink.click(); + + const quickStartItem = page.locator( + '.sidebar-nav li:has(> p > a[href="#/quickstart"])', + ); + const subSidebar = quickStartItem.locator(':scope > .app-sub-sidebar'); + await expect(subSidebar).toBeVisible(); + + await quickStartLink.click(); + + await expect(quickStartItem).toHaveClass(/collapse/); + await expect(subSidebar).toBeHidden(); + await expect(quickStartLink).toBeVisible(); + }); }); test.describe('Mobile sidebar toggle', () => {