Skip to content

Commit 9963923

Browse files
committed
(#997) Highlight Active page
The change here ensures the left side navigation always highlights the active page. This also makes sure that an expanded navigation item does not collapse on reload. The trailing slash, or lack of, has been accounted for now.
1 parent c5f55ce commit 9963923

File tree

3 files changed

+10
-11
lines changed

3 files changed

+10
-11
lines changed
Lines changed: 2 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
---
22
// Scripts and types
33
import type { ContentTree } from '@scripts/types';
4+
import { isActivePage } from '@scripts/is-active-page';
45
56
interface Props {
67
content: ContentTree;
@@ -9,12 +10,8 @@ interface Props {
910
1011
const { content, paddingClass } = Astro.props;
1112
const activeSlug = Astro.url.pathname;
12-
13-
const isActivePage = () => {
14-
return content.slug === activeSlug || content.slug.slice(0, -1) === activeSlug;
15-
};
1613
---
1714

1815
<li class={`nav-item nav-item-blue`}>
19-
<a class={`nav-link ${paddingClass} ${isActivePage() ? 'active active-page' : ''}`} href={content.slug}>{content.data.title}</a>
16+
<a class={`nav-link ${paddingClass} ${isActivePage(content.slug, activeSlug) ? 'active active-page' : ''}`} href={content.slug}>{content.data.title}</a>
2017
</li>

src/components/sidebar/SidebarSelf.astro

Lines changed: 3 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
---
22
// Scripts and types
33
import type { ContentTree } from '@scripts/types';
4+
import { isActivePage } from '@scripts/is-active-page';
45
import { slugId } from '@scripts/helpers';
56
67
// Components
@@ -75,7 +76,7 @@ const isActiveChild = (doc: ContentTree) => {
7576
}
7677
7778
// Check if the current document's slug matches the activeSlug
78-
if (currentDoc.slug === activeSlug || currentDoc.slug.slice(0, -1) === activeSlug) {
79+
if (isActivePage(currentDoc.slug, activeSlug)) {
7980
return true;
8081
}
8182
@@ -90,16 +91,12 @@ const isActiveChild = (doc: ContentTree) => {
9091
// If the activeSlug is not found in any document, return false
9192
return false;
9293
};
93-
94-
const isActivePage = (doc: ContentTree) => {
95-
return doc.slug === activeSlug || doc.slug.slice(0, -1) === activeSlug;
96-
};
9794
---
9895

9996
{content.filter(doc => doc.data.showInSidebar === true).map(doc => (
10097
doc.children && doc.children.length > 0 ? (
10198
<li class={`nav-item nav-item-blue ${isActiveChild(doc) ? 'active' : ''}`}>
102-
<div class={`nav-link nav-link-collapse d-flex ${isActiveChild(doc) ? 'active' : ''} ${isActivePage(doc) ? 'active-page' : ''}`}>
99+
<div class={`nav-link nav-link-collapse d-flex ${isActiveChild(doc) ? 'active' : ''} ${isActivePage(doc.slug, activeSlug) ? 'active-page' : ''}`}>
103100
<button class={`btn btn-collapse rounded-0 border-0 ${listPaddingClass(doc.data.depth)} ${isActiveChild(doc) ? '' : 'collapsed'}`} type="button" data-bs-toggle="collapse" aria-expanded={`${isActiveChild(doc) ? 'true' : 'false'}`} aria-controls={slugId(`id-${doc.slug}`)} aria-label="collapse or expand navigation" data-bs-target={slugId(`#id-${doc.slug}`)}></button>
104101
<a href={doc.slug}>{doc.data.title}</a>
105102
</div>

src/scripts/is-active-page.ts

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
import type { ContentTree } from '@scripts/types';
2+
3+
export const isActivePage = (passedSlug: string | ContentTree[], activeSlug: string) => {
4+
return passedSlug === activeSlug || `${passedSlug}/` === activeSlug || passedSlug.slice(0, -1) === activeSlug;
5+
};

0 commit comments

Comments
 (0)