Skip to content

Commit 983a3fc

Browse files
committed
Menu for mobile
1 parent 63f8f96 commit 983a3fc

3 files changed

Lines changed: 107 additions & 10 deletions

File tree

public/assets/css/site.css

Lines changed: 57 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -88,6 +88,7 @@ a:hover {
8888
}
8989

9090

91+
9192
.content-area {
9293
min-width: 0;
9394
display: flex;
@@ -1216,6 +1217,10 @@ input[type="file"]::-webkit-file-upload-button:hover {
12161217
z-index: 10;
12171218
}
12181219

1220+
.sidebar-overlay {
1221+
display: none;
1222+
}
1223+
12191224
.sidebar-brand {
12201225
color: var(--brand-mark);
12211226
margin-bottom: 12px;
@@ -1540,13 +1545,46 @@ input[type="file"]::-webkit-file-upload-button:hover {
15401545
}
15411546

15421547
.sidebar {
1543-
position: static;
1544-
min-width: 100%;
1545-
width: 100%;
1548+
position: fixed;
1549+
top: 0;
1550+
left: 0;
1551+
height: 100vh;
1552+
width: min(84vw, 320px);
15461553
border-left: none;
1547-
border-right: none;
1554+
border-right: 1px solid var(--border);
15481555
border-radius: 0;
1549-
height: auto;
1556+
transform: translateX(-110%);
1557+
transition: transform 0.25s ease;
1558+
z-index: 20;
1559+
box-shadow: 0 12px 32px rgba(15, 23, 42, 0.2);
1560+
}
1561+
1562+
.page.has-sidebar.sidebar-collapsed .sidebar {
1563+
transform: translateX(-110%);
1564+
}
1565+
1566+
.page.sidebar-open .sidebar {
1567+
transform: translateX(0);
1568+
}
1569+
1570+
.page.sidebar-open {
1571+
overflow: hidden;
1572+
}
1573+
1574+
.sidebar-overlay {
1575+
position: fixed;
1576+
inset: 0;
1577+
background: rgba(12, 18, 28, 0.5);
1578+
opacity: 0;
1579+
pointer-events: none;
1580+
transition: opacity 0.2s ease;
1581+
z-index: 10;
1582+
}
1583+
1584+
.page.sidebar-open .sidebar-overlay {
1585+
display: block;
1586+
opacity: 1;
1587+
pointer-events: auto;
15501588
}
15511589

15521590

@@ -1559,6 +1597,20 @@ input[type="file"]::-webkit-file-upload-button:hover {
15591597
padding: 18px 0;
15601598
}
15611599

1600+
.nav {
1601+
width: 100%;
1602+
display: flex;
1603+
justify-content: flex-end;
1604+
gap: 12px;
1605+
padding-right: 8px;
1606+
}
1607+
1608+
.nav a,
1609+
.nav details,
1610+
.nav form {
1611+
margin-left: 0;
1612+
}
1613+
15621614
.footer-content {
15631615
flex-direction: column;
15641616
align-items: flex-start;

public/assets/js/ui.js

Lines changed: 49 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,21 +1,65 @@
11
(() => {
22
const page = document.querySelector('.page');
33
const toggle = document.querySelector('[data-sidebar-toggle]');
4+
const overlay = document.querySelector('[data-sidebar-overlay]');
45
if (!page || !toggle) {
56
return;
67
}
78

8-
const stored = localStorage.getItem('thriftstack_sidebar');
9-
if (stored === 'collapsed') {
10-
page.classList.add('sidebar-collapsed');
11-
toggle.setAttribute('aria-pressed', 'true');
12-
}
9+
const media = window.matchMedia('(max-width: 768px)');
10+
11+
const applyState = () => {
12+
if (media.matches) {
13+
page.classList.add('sidebar-collapsed');
14+
page.classList.remove('sidebar-open');
15+
toggle.setAttribute('aria-pressed', 'false');
16+
return;
17+
}
18+
page.classList.remove('sidebar-open');
19+
const stored = localStorage.getItem('thriftstack_sidebar');
20+
if (stored === 'collapsed') {
21+
page.classList.add('sidebar-collapsed');
22+
toggle.setAttribute('aria-pressed', 'true');
23+
} else {
24+
page.classList.remove('sidebar-collapsed');
25+
toggle.setAttribute('aria-pressed', 'false');
26+
}
27+
};
1328

1429
toggle.addEventListener('click', () => {
30+
if (media.matches) {
31+
const isOpen = page.classList.toggle('sidebar-open');
32+
page.classList.toggle('sidebar-collapsed', !isOpen);
33+
toggle.setAttribute('aria-pressed', isOpen ? 'true' : 'false');
34+
return;
35+
}
1536
const collapsed = page.classList.toggle('sidebar-collapsed');
1637
toggle.setAttribute('aria-pressed', collapsed ? 'true' : 'false');
1738
localStorage.setItem('thriftstack_sidebar', collapsed ? 'collapsed' : 'expanded');
1839
});
40+
41+
if (overlay) {
42+
overlay.addEventListener('click', () => {
43+
page.classList.remove('sidebar-open');
44+
page.classList.add('sidebar-collapsed');
45+
toggle.setAttribute('aria-pressed', 'false');
46+
});
47+
}
48+
49+
document.addEventListener('keydown', (event) => {
50+
if (event.key === 'Escape' && page.classList.contains('sidebar-open')) {
51+
page.classList.remove('sidebar-open');
52+
page.classList.add('sidebar-collapsed');
53+
toggle.setAttribute('aria-pressed', 'false');
54+
}
55+
});
56+
57+
if (typeof media.addEventListener === 'function') {
58+
media.addEventListener('change', applyState);
59+
} else if (typeof media.addListener === 'function') {
60+
media.addListener(applyState);
61+
}
62+
applyState();
1963
})();
2064

2165
(() => {

views/layouts/app.php

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -110,6 +110,7 @@
110110
</nav>
111111
</div>
112112
</aside>
113+
<div class="sidebar-overlay" data-sidebar-overlay></div>
113114
<?php endif; ?>
114115
<div class="content-area">
115116
<header class="site-header">

0 commit comments

Comments
 (0)