Skip to content
This repository was archived by the owner on Jul 28, 2026. It is now read-only.

Commit d3e24c2

Browse files
committed
feat: sidebar collapse on logo click
- Click the sidebar logo to collapse/expand sidebar - Collapsed mode shows only icons (60px width) - Logo image remains visible, text hidden - Nav items show only SVG icons, text hidden via font-size:0 - User avatar visible, name/email hidden - Resizer disabled in collapsed mode - State persisted in localStorage (zh_sidebar_collapsed) - Restores previous width on expand
1 parent c01bee2 commit d3e24c2

2 files changed

Lines changed: 95 additions & 7 deletions

File tree

public/css/style.css

Lines changed: 61 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -488,6 +488,67 @@ cap-widget {
488488
background: var(--accent-1);
489489
}
490490

491+
.sidebar.collapsed {
492+
width: 60px;
493+
}
494+
495+
.sidebar.collapsed .sidebar-resizer {
496+
display: none;
497+
}
498+
499+
.sidebar.collapsed .sidebar-logo {
500+
justify-content: center;
501+
}
502+
503+
.sidebar.collapsed .sidebar-logo-text {
504+
display: none;
505+
}
506+
507+
.sidebar.collapsed .sidebar-header {
508+
padding: 16px 12px;
509+
justify-content: center;
510+
}
511+
512+
.sidebar.collapsed .sidebar-nav {
513+
padding: 12px 8px;
514+
}
515+
516+
.sidebar.collapsed .nav-section-label {
517+
display: none;
518+
}
519+
520+
.sidebar.collapsed .nav-item {
521+
font-size: 0;
522+
justify-content: center;
523+
padding: 10px 0;
524+
gap: 0;
525+
}
526+
527+
.sidebar.collapsed .nav-item svg {
528+
font-size: 1rem;
529+
width: 20px;
530+
height: 20px;
531+
}
532+
533+
.sidebar.collapsed .sidebar-footer {
534+
padding: 8px 0;
535+
}
536+
537+
.sidebar.collapsed .user-info {
538+
justify-content: center;
539+
padding: 8px 0;
540+
}
541+
542+
.sidebar.collapsed .user-name,
543+
.sidebar.collapsed .user-email,
544+
.sidebar.collapsed .sidebar-footer > div:last-child {
545+
display: none;
546+
}
547+
548+
.sidebar.collapsed ~ .main-content {
549+
margin-left: 60px;
550+
}
551+
491552
.main-content {
492553
position: relative;
493554
z-index: 1;

public/js/app.js

Lines changed: 34 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -360,13 +360,18 @@ function initSidebarResize() {
360360
const resizer = $('#sidebar-resizer');
361361
if (!sidebar || !resizer) return;
362362

363-
const saved = localStorage.getItem('zh_sidebar_width');
364-
if (saved) {
365-
const w = parseInt(saved, 10);
366-
if (w >= 180 && w <= 600) {
367-
sidebar.style.width = w + 'px';
368-
sidebar.style.setProperty('--sidebar-w', w + 'px');
369-
document.querySelector('.main-content').style.marginLeft = w + 'px';
363+
if (localStorage.getItem('zh_sidebar_collapsed') === 'true') {
364+
sidebar.classList.add('collapsed');
365+
document.querySelector('.main-content').style.marginLeft = '';
366+
} else {
367+
const saved = localStorage.getItem('zh_sidebar_width');
368+
if (saved) {
369+
const w = parseInt(saved, 10);
370+
if (w >= 180 && w <= 600) {
371+
sidebar.style.width = w + 'px';
372+
sidebar.style.setProperty('--sidebar-w', w + 'px');
373+
document.querySelector('.main-content').style.marginLeft = w + 'px';
374+
}
370375
}
371376
}
372377

@@ -400,6 +405,23 @@ function initSidebarResize() {
400405
resizer.addEventListener('mousedown', onMouseDown);
401406
}
402407

408+
function toggleSidebarCollapse() {
409+
const sidebar = $('#sidebar');
410+
const isCollapsed = sidebar.classList.toggle('collapsed');
411+
localStorage.setItem('zh_sidebar_collapsed', isCollapsed);
412+
const main = document.querySelector('.main-content');
413+
if (isCollapsed) {
414+
sidebar.dataset.prevWidth = sidebar.style.width || getComputedStyle(sidebar).width;
415+
sidebar.style.width = '';
416+
main.style.marginLeft = '';
417+
} else {
418+
const prev = sidebar.dataset.prevWidth || localStorage.getItem('zh_sidebar_width') || '260';
419+
sidebar.style.width = prev;
420+
sidebar.style.setProperty('--sidebar-w', prev);
421+
main.style.marginLeft = prev;
422+
}
423+
}
424+
403425
// ===== DASHBOARD =====
404426
async function renderDashboard() {
405427
const app = $('#app');
@@ -505,6 +527,11 @@ async function renderDashboard() {
505527
navigateTo('account');
506528
});
507529

530+
$('#sidebar-logo-link').addEventListener('click', (e) => {
531+
e.preventDefault();
532+
toggleSidebarCollapse();
533+
});
534+
508535
$('#hamburger-toggle').addEventListener('click', () => {
509536
$('#sidebar').classList.toggle('open');
510537
});

0 commit comments

Comments
 (0)