Skip to content

Commit 4e815a7

Browse files
committed
Add 'skip to main content' feature
1 parent 09dbcda commit 4e815a7

File tree

12 files changed

+78
-5
lines changed

12 files changed

+78
-5
lines changed

src/components/LayoutComposer/LayoutSideNavigation/LayoutSideNavigation.js

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -73,7 +73,9 @@ const LayoutSideNavigation = props => {
7373
) : null}
7474
{sideNavContent}
7575
</aside>
76-
<main className={classNames(css.main, mainColumnClassName)}>{children}</main>
76+
<main id="main-content" className={classNames(css.main, mainColumnClassName)}>
77+
{children}
78+
</main>
7779
</Main>
7880
<Footer>{footerContent}</Footer>
7981
</>

src/components/LayoutComposer/LayoutSideNavigation/LayoutSideNavigation.module.css

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -40,6 +40,7 @@
4040
flex-direction: column;
4141

4242
padding: 24px;
43+
scroll-margin-top: var(--topbarHeight);
4344

4445
@media (--viewportLarge) {
4546
/**
@@ -51,6 +52,8 @@
5152
border-left-width: 1px;
5253
border-left-style: solid;
5354
border-left-color: var(--colorGrey100);
55+
56+
scroll-margin-top: var(--topbarHeightDesktop);
5457
}
5558

5659
@media (--viewportLargeWithPaddings) {

src/components/LayoutComposer/LayoutSingleColumn/LayoutSingleColumn.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -45,7 +45,7 @@ const LayoutSingleColumn = props => {
4545
<Topbar as="header" className={css.topbar}>
4646
{topbarContent}
4747
</Topbar>
48-
<Main as="main" className={classNames(css.main, mainColumnClassName)}>
48+
<Main as="main" id="main-content" className={classNames(css.main, mainColumnClassName)}>
4949
{children}
5050
</Main>
5151
<Footer>{footerContent}</Footer>

src/components/LayoutComposer/LayoutSingleColumn/LayoutSingleColumn.module.css

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
@import '../../../styles/customMediaQueries.css';
12
.root {
23
grid-template-rows: auto 1fr auto;
34
min-height: 100vh;
@@ -11,4 +12,9 @@
1112

1213
.main {
1314
display: grid;
15+
scroll-margin-top: var(--topbarHeight);
16+
17+
@media (--viewportMedium) {
18+
scroll-margin-top: var(--topbarHeightDesktop);
19+
}
1420
}

src/containers/PageBuilder/PageBuilder.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -136,7 +136,7 @@ const PageBuilder = props => {
136136
<Topbar as="header" className={css.topbar}>
137137
<TopbarContainer currentPage={currentPage} />
138138
</Topbar>
139-
<Main as="main" className={css.main}>
139+
<Main as="main" id="main-content" className={css.main}>
140140
{sections.length === 0 && inProgress ? (
141141
<LoadingSpinner />
142142
) : (

src/containers/PageBuilder/PageBuilder.module.css

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,10 @@
1111

1212
.main {
1313
display: grid;
14+
scroll-margin-top: var(--topbarHeight);
15+
@media (--viewportMedium) {
16+
scroll-margin-top: var(--topbarHeightDesktop);
17+
}
1418
}
1519

1620
.loading {

src/containers/SearchPage/SearchPage.module.css

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,7 @@
3232
position: relative;
3333
padding-top: var(--topbarHeightDesktop);
3434
min-height: calc(100vh - var(--topbarHeightDesktop));
35+
scroll-margin-top: var(--topbarHeightDesktop);
3536
}
3637
}
3738

@@ -151,6 +152,8 @@
151152
border-left-width: 1px;
152153
border-left-style: solid;
153154
border-left-color: var(--colorGrey100);
155+
156+
scroll-margin-top: var(--topbarHeightDesktop);
154157
}
155158

156159
@media (--viewportLarge) {

src/containers/SearchPage/SearchPageWithGrid.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -420,7 +420,7 @@ export class SearchPageComponent extends Component {
420420
</div>
421421
</aside>
422422

423-
<div className={css.layoutWrapperMain} role="main">
423+
<div id="main-content" className={css.layoutWrapperMain} role="main">
424424
<div className={css.searchResultContainer}>
425425
<SearchFiltersMobile
426426
className={css.searchFiltersMobileList}

src/containers/SearchPage/SearchPageWithMap.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -533,7 +533,7 @@ export class SearchPageComponent extends Component {
533533
schema={schema}
534534
>
535535
<TopbarContainer rootClassName={topbarClasses} currentSearchParams={validQueryParams} />
536-
<div className={css.container} role="main">
536+
<div id="main-content" className={css.container} role="main">
537537
<div className={css.searchResultContainer}>
538538
<SearchFiltersMobile
539539
className={css.searchFiltersMobileMap}

src/containers/TopbarContainer/Topbar/Topbar.js

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@ import { parse, stringify } from '../../../util/urlHelpers';
1212
import { createResourceLocatorString, matchPathname, pathByRouteName } from '../../../util/routes';
1313
import {
1414
Button,
15+
IconArrowHead,
1516
LimitedAccessBanner,
1617
LinkedLogo,
1718
Modal,
@@ -311,8 +312,31 @@ const TopbarComponent = props => {
311312
<div className={css.searchMenu} />
312313
);
313314

315+
const handleSkipToMainContent = e => {
316+
e.preventDefault();
317+
const mainContent = document.getElementById('main-content');
318+
if (mainContent) {
319+
mainContent.scrollIntoView({ behavior: 'smooth', block: 'start' });
320+
// Focus the main content for screen readers
321+
mainContent.setAttribute('tabindex', '-1');
322+
mainContent.focus();
323+
// Remove tabindex after blur to avoid tabbing into it later
324+
mainContent.addEventListener(
325+
'blur',
326+
() => {
327+
mainContent.removeAttribute('tabindex');
328+
},
329+
{ once: true }
330+
);
331+
}
332+
};
333+
314334
return (
315335
<div className={classes}>
336+
<Button onClick={handleSkipToMainContent} className={css.skipToMainContent}>
337+
<FormattedMessage id="Topbar.skipToMainContent" />
338+
<IconArrowHead direction="right" size="small" rootClassName={css.skiptoMainArrow} />
339+
</Button>
316340
<LimitedAccessBanner
317341
isAuthenticated={isAuthenticated}
318342
isLoggedInAs={isLoggedInAs}

0 commit comments

Comments
 (0)