Skip to content

Commit 928abf0

Browse files
zalabhavyparlough
andauthored
Filter by close icon added for mobile screen (#12373)
A close icon/button should be added to the "Filter by" wrapper on mobile screens to allow users to easily close the sidebar. Fixes #11980 https://github.com/user-attachments/assets/f5ab191f-9cdc-4a6e-b5e3-ad266eb8712f ## Presubmit checklist - [x] If you are unwilling, or unable, to sign the CLA, even for a _tiny_, one-word PR, please file an issue instead of a PR. - [x] If this PR is not meant to land until a future stable release, mark it as draft with an explanation. - [x] This PR follows the [Google Developer Documentation Style Guidelines](https://developers.google.com/style)—for example, it doesn't use _i.e._ or _e.g._, and it avoids _I_ and _we_ (first-person pronouns). - [x] This PR uses [semantic line breaks](https://github.com/dart-lang/site-shared/blob/main/doc/writing-for-dart-and-flutter-websites.md#semantic-line-breaks) of 80 characters or fewer. --------- Co-authored-by: Parker Lougheed <parlough@gmail.com>
1 parent f9703d1 commit 928abf0

File tree

3 files changed

+118
-18
lines changed

3 files changed

+118
-18
lines changed

src/_includes/docs/learning-resources-index/side-filters.liquid

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,11 @@
1+
<input type="checkbox" id="open-filter-toggle" hidden>
2+
<div id="resource-filter-group-wrapper">
13
<div id="resource-filter-group">
4+
<div class="filter-header">
5+
<label for="open-filter-toggle" class="close-icon" aria-hidden="true">
6+
<span class="material-symbols">close</span>
7+
</label>
8+
</div>
29
<div class="table-title">Filter by</div>
310
<div class="table-content">
411
<h4>Subject</h4>
@@ -33,3 +40,4 @@
3340
</ul>
3441
</div>
3542
</div>
43+
</div>

src/_sass/pages/_learning-resources-index.scss

Lines changed: 76 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,81 @@
11
@use '../base/mixins';
22

3+
#resource-filter-group-wrapper {
4+
border: 1px solid var(--site-inset-borderColor);
5+
background-color: var(--site-inset-bgColor);
6+
border-radius: var(--site-radius);
7+
overflow: hidden;
8+
position: sticky;
9+
top: calc(var(--site-header-height) + 1rem);
10+
}
11+
12+
.filter-header {
13+
display: none;
14+
position: absolute;
15+
top: 0;
16+
right: 0;
17+
padding: 0.75rem 1rem;
18+
z-index: 10;
19+
}
20+
21+
.close-icon {
22+
cursor: pointer;
23+
padding: 0.25rem;
24+
border-radius: 4px;
25+
background: none;
26+
border: none;
27+
color: var(--site-base-fgColor-alt);
28+
transition: all 0.2s ease;
29+
position: absolute;
30+
right: 1rem;
31+
top: 75%;
32+
transform: translateY(-50%);
33+
34+
&:hover {
35+
background-color: rgba(0, 0, 0, 0.1);
36+
color: var(--site-primary-color);
37+
}
38+
39+
.material-symbols {
40+
font-size: 20px;
41+
}
42+
}
43+
44+
// Mobile screen customizations.
45+
@media (max-width: 839px) {
46+
.filter-header {
47+
display: block;
48+
}
49+
50+
#resource-filter-group-wrapper {
51+
position: fixed;
52+
top: var(--site-header-height);
53+
bottom: 0;
54+
right: -220px;
55+
width: 220px;
56+
border-bottom: none;
57+
height: 100%;
58+
border-radius: 0;
59+
transition: right 0.3s ease-in-out;
60+
z-index: 1000;
61+
}
62+
63+
#open-filter-toggle:not(:checked) + #resource-filter-group-wrapper { right: -220px; }
64+
#open-filter-toggle:checked + #resource-filter-group-wrapper { right: 0; }
65+
}
66+
67+
//Desktop screens
68+
@media (min-width: 840px) {
69+
#resource-filter-group {
70+
position: static !important;
71+
right: auto !important;
72+
}
73+
74+
.filter-header {
75+
display: none !important;
76+
}
77+
}
78+
379
#resource-index-content {
480
display: flex;
581
flex-direction: row;
@@ -43,13 +119,6 @@
43119
}
44120

45121
#resource-filter-group {
46-
border: 1px solid var(--site-inset-borderColor);
47-
background-color: var(--site-inset-bgColor);
48-
border-radius: var(--site-radius);
49-
overflow: hidden;
50-
position: sticky;
51-
top: calc(var(--site-header-height) + 1rem);
52-
53122
.table-title {
54123
text-align: center;
55124
color: var(--site-base-fgColor-alt);

src/content/assets/js/learning-resources-index.js

Lines changed: 34 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -265,20 +265,42 @@ function _setupDropdownMenu() {
265265
if (!pageContent) return;
266266

267267
const filtersButton = pageContent.querySelector('.show-filters-button');
268-
const filtersEl = pageContent.querySelector('.right-col');
268+
const filtersEl = document.getElementById('resource-filter-group-wrapper') || pageContent.querySelector('.right-col');
269+
const openToggleCheckbox = document.getElementById('open-filter-toggle');
270+
269271
if (!filtersButton || !filtersEl) return;
270272

271273
function _closeMenu() {
272-
filtersEl.classList.remove('show');
274+
if (openToggleCheckbox) {
275+
openToggleCheckbox.checked = false;
276+
} else {
277+
filtersEl.classList.remove('show');
278+
}
273279
filtersButton.ariaExpanded = 'false';
274280
}
275281

282+
function _openMenu() {
283+
if (openToggleCheckbox) {
284+
openToggleCheckbox.checked = true;
285+
} else {
286+
filtersEl.classList.add('show');
287+
}
288+
filtersButton.ariaExpanded = 'true';
289+
}
290+
291+
function _isMenuOpen() {
292+
if (openToggleCheckbox) {
293+
return openToggleCheckbox.checked;
294+
} else {
295+
return filtersEl.classList.contains('show');
296+
}
297+
}
298+
276299
filtersButton.addEventListener('click', (_) => {
277-
if (filtersEl.classList.contains('show')) {
300+
if (_isMenuOpen()) {
278301
_closeMenu();
279302
} else {
280-
filtersEl.classList.add('show');
281-
filtersButton.ariaExpanded = 'true';
303+
_openMenu();
282304
}
283305
});
284306

@@ -290,12 +312,13 @@ function _setupDropdownMenu() {
290312

291313
// Close the dropdown if anywhere not in the filters menu is.
292314
const content = document.getElementById('all-resources-grid');
293-
content.addEventListener('click', (_) => {
294-
if (!filtersEl.classList.contains('show')) {
295-
return;
296-
}
297-
_closeMenu();
298-
});
315+
if (content) {
316+
content.addEventListener('click', () => {
317+
if (_isMenuOpen()) {
318+
_closeMenu();
319+
}
320+
});
321+
}
299322
}
300323

301324
function shuffleElements(container) {

0 commit comments

Comments
 (0)