Skip to content

Commit ccfbc70

Browse files
committed
Fixed sidebar
1 parent 786f963 commit ccfbc70

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

48 files changed

+593
-46
lines changed

DEVELOPMENT.md

Lines changed: 127 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@ Detailed documentation for developing with the Metis Bootstrap 5 Admin Template.
99
- [Architecture](#architecture)
1010
- [Adding New Features](#adding-new-features)
1111
- [Component Patterns](#component-patterns)
12+
- [Sidebar & Responsive Layout](#sidebar--responsive-layout)
1213
- [Styling Guide](#styling-guide)
1314
- [Build Configuration](#build-configuration)
1415

@@ -50,6 +51,7 @@ src-modern/
5051
│ │ ├── reports.js
5152
│ │ ├── security.js
5253
│ │ ├── settings.js
54+
│ │ ├── sidebar.js # SidebarManager (desktop collapse + mobile overlay)
5355
│ │ └── users.js
5456
│ └── utils/
5557
│ ├── theme-manager.js # Dark/light mode handling
@@ -97,6 +99,24 @@ switch (currentPage) {
9799
}
98100
```
99101

102+
### SidebarManager
103+
104+
The `SidebarManager` class in `scripts/components/sidebar.js` is the single source of truth for all sidebar toggle behavior. It is initialized by `main.js` on every page and handles two distinct modes:
105+
106+
- **Desktop (>=992px):** Toggles between full-width (280px) and collapsed (70px) sidebar via the `sidebar-collapsed` class on `#admin-wrapper`. State is persisted in `localStorage`.
107+
- **Mobile (<992px):** Opens the sidebar as a slide-in overlay with a backdrop. Supports closing via backdrop click, Escape key, and scroll-lock on the body.
108+
109+
**Key elements:**
110+
111+
| Selector | Role |
112+
|----------|------|
113+
| `#admin-wrapper` | Receives `sidebar-collapsed` class on desktop |
114+
| `#admin-sidebar` | The sidebar element; receives `show` class on mobile |
115+
| `[data-sidebar-toggle]` | The hamburger button that triggers `toggle()` |
116+
| `.sidebar-backdrop` | Semi-transparent overlay behind mobile sidebar |
117+
118+
**Important:** Do not add inline `<script>` blocks that also listen for `[data-sidebar-toggle]` clicks. The `SidebarManager` is the only handler needed. Duplicate listeners will cancel each other out on desktop (both toggle the same class on the same click).
119+
100120
### Dynamic Imports
101121

102122
Page components are loaded asynchronously for code splitting:
@@ -323,6 +343,113 @@ const chart = new ApexCharts(document.querySelector('#chart'), chartOptions);
323343
chart.render();
324344
```
325345

346+
## Sidebar & Responsive Layout
347+
348+
The template uses a consistent `lg` breakpoint (992px) across all responsive behavior. Below 992px the layout switches to a mobile-optimized mode.
349+
350+
### Breakpoint Reference
351+
352+
| Breakpoint | Sidebar | Header | Cards & Buttons |
353+
|------------|---------|--------|-----------------|
354+
| >= 992px (desktop) | Fixed left panel, collapsible to 70px mini sidebar | Full navbar with search bar | Standard sizing |
355+
| < 992px (mobile) | Hidden off-screen, slides in as overlay | Compact navbar, hamburger in flow | Compact sizing with smaller padding |
356+
357+
### Desktop Sidebar Collapse
358+
359+
On desktop, clicking the hamburger toggles the `sidebar-collapsed` class on `#admin-wrapper`:
360+
361+
- **Expanded (default):** Sidebar is `var(--sidebar-width)` (280px) with icon + text labels
362+
- **Collapsed:** Sidebar shrinks to `var(--sidebar-mini-width)` (70px) with icons only
363+
364+
The main content area shifts automatically via CSS:
365+
366+
```scss
367+
// layout/_main.scss
368+
.admin-main {
369+
margin-left: var(--sidebar-width);
370+
transition: margin-left 0.3s cubic-bezier(0.4, 0, 0.2, 1);
371+
}
372+
373+
.sidebar-collapsed .admin-main {
374+
margin-left: var(--sidebar-mini-width);
375+
}
376+
```
377+
378+
### Mobile Sidebar Overlay
379+
380+
On mobile, the sidebar is positioned off-screen with `transform: translateX(-100%)` and slides in when the `show` class is added:
381+
382+
```scss
383+
// layout/_sidebar.scss
384+
@media (max-width: 991.98px) {
385+
.admin-sidebar {
386+
transform: translateX(-100%);
387+
z-index: 1041; // above backdrop, below modals
388+
389+
&.show {
390+
transform: translateX(0);
391+
box-shadow: 4px 0 16px rgba(0, 0, 0, 0.15);
392+
}
393+
}
394+
}
395+
```
396+
397+
The `.sidebar-backdrop` element provides a semi-transparent overlay behind the sidebar. It is created automatically by `SidebarManager` if not present in the HTML.
398+
399+
**Mobile sidebar behaviors:**
400+
- Background scroll is locked (`overflow: hidden` on body) when sidebar is open
401+
- Backdrop click closes the sidebar
402+
- Escape key closes the sidebar
403+
- Resizing from mobile to desktop cleans up overlay state and restores collapsed preference
404+
405+
### Hamburger Button Placement
406+
407+
The hamburger button (`[data-sidebar-toggle]`) lives inside the header navbar, immediately after the `.navbar-brand`. On desktop, it is absolutely positioned at the right edge of the sidebar:
408+
409+
```scss
410+
// components/_hamburger.scss
411+
@media (min-width: 992px) {
412+
.admin-header .hamburger-menu {
413+
position: absolute;
414+
left: calc(var(--sidebar-width) - 40px - 0.5rem);
415+
top: 50%;
416+
transform: translateY(-50%);
417+
}
418+
}
419+
```
420+
421+
On mobile, the hamburger sits in normal document flow within the navbar.
422+
423+
### Z-Index Layering
424+
425+
The template uses a deliberate z-index stack to avoid overlap conflicts:
426+
427+
| Layer | Z-Index | Element |
428+
|-------|---------|---------|
429+
| Header | 1030 | `.admin-header` (Bootstrap `$zindex-fixed`) |
430+
| Sidebar (desktop) | 1035 | `.admin-sidebar` |
431+
| Backdrop | 1040 | `.sidebar-backdrop` (`$zindex-modal-backdrop`) |
432+
| Sidebar (mobile) | 1041 | `.admin-sidebar.show` |
433+
| Modals | 1050+ | Bootstrap modals |
434+
435+
### Responsive Cards & Buttons
436+
437+
Cards and buttons use compact sizing on mobile for better touch usability:
438+
439+
```scss
440+
@media (max-width: 991.98px) {
441+
.card {
442+
// Reduced padding and margins
443+
}
444+
445+
.btn {
446+
// Smaller padding for touch targets
447+
}
448+
}
449+
```
450+
451+
These responsive adjustments are defined in `components/_cards.scss` and `components/_buttons.scss`.
452+
326453
## Styling Guide
327454

328455
### SCSS Variables

dist-modern/analytics.html

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -27,9 +27,9 @@
2727
<script type="module" crossorigin src="./assets/vendor-bootstrap-C9iorZI5.js"></script>
2828
<script type="module" crossorigin src="./assets/vendor-charts-DGwYAWel.js"></script>
2929
<script type="module" crossorigin src="./assets/vendor-ui-CflGdlft.js"></script>
30-
<script type="module" crossorigin src="./assets/main-bDXl1YJh.js"></script>
30+
<script type="module" crossorigin src="./assets/main--6K6KPfL.js"></script>
3131
<script type="module" crossorigin src="./assets/analytics-Baa0JPJM.js"></script>
32-
<link rel="stylesheet" crossorigin href="./assets/main-CFKPan32.css">
32+
<link rel="stylesheet" crossorigin href="./assets/main-BzXkCVWJ.css">
3333
</head>
3434

3535
<body data-page="analytics" class="analytics-page">
@@ -166,6 +166,13 @@ <h1 class="h4 mb-0 fw-bold text-primary">Metis</h1>
166166
<span>Dashboard</span>
167167
</a>
168168
</li>
169+
<li class="nav-item">
170+
<a class="nav-link" href="https://dashboardpack.com/?utm_source=metis&amp;utm_medium=sidebar&amp;utm_campaign=go_pro" target="_blank" rel="noopener">
171+
<i class="bi bi-rocket-takeoff"></i>
172+
<span>Go Pro</span>
173+
<span class="badge bg-danger rounded-pill ms-auto">Hot</span>
174+
</a>
175+
</li>
169176
<li class="nav-item">
170177
<a class="nav-link active" href="./analytics.html">
171178
<i class="bi bi-graph-up"></i>
Lines changed: 1 addition & 1 deletion
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

dist-modern/calendar.html

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -21,9 +21,9 @@
2121
<link href="https://fonts.googleapis.com/css2?family=Inter:wght@300;400;500;600;700&display=swap" rel="stylesheet"> <script type="module" crossorigin src="./assets/vendor-bootstrap-C9iorZI5.js"></script>
2222
<script type="module" crossorigin src="./assets/vendor-charts-DGwYAWel.js"></script>
2323
<script type="module" crossorigin src="./assets/vendor-ui-CflGdlft.js"></script>
24-
<script type="module" crossorigin src="./assets/main-bDXl1YJh.js"></script>
24+
<script type="module" crossorigin src="./assets/main--6K6KPfL.js"></script>
2525
<script type="module" crossorigin src="./assets/calendar-BwMBVGZW.js"></script>
26-
<link rel="stylesheet" crossorigin href="./assets/main-CFKPan32.css">
26+
<link rel="stylesheet" crossorigin href="./assets/main-BzXkCVWJ.css">
2727
</head>
2828

2929
<body data-page="calendar" class="calendar-page">
@@ -160,6 +160,13 @@ <h1 class="h4 mb-0 fw-bold text-primary">Metis</h1>
160160
<span>Dashboard</span>
161161
</a>
162162
</li>
163+
<li class="nav-item">
164+
<a class="nav-link" href="https://dashboardpack.com/?utm_source=metis&amp;utm_medium=sidebar&amp;utm_campaign=go_pro" target="_blank" rel="noopener">
165+
<i class="bi bi-rocket-takeoff"></i>
166+
<span>Go Pro</span>
167+
<span class="badge bg-danger rounded-pill ms-auto">Hot</span>
168+
</a>
169+
</li>
163170
<li class="nav-item">
164171
<a class="nav-link" href="./analytics.html">
165172
<i class="bi bi-graph-up"></i>

dist-modern/elements-alerts.html

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -74,8 +74,8 @@
7474
<script type="module" crossorigin src="./assets/vendor-bootstrap-C9iorZI5.js"></script>
7575
<script type="module" crossorigin src="./assets/vendor-charts-DGwYAWel.js"></script>
7676
<script type="module" crossorigin src="./assets/vendor-ui-CflGdlft.js"></script>
77-
<script type="module" crossorigin src="./assets/main-bDXl1YJh.js"></script>
78-
<link rel="stylesheet" crossorigin href="./assets/main-CFKPan32.css">
77+
<script type="module" crossorigin src="./assets/main--6K6KPfL.js"></script>
78+
<link rel="stylesheet" crossorigin href="./assets/main-BzXkCVWJ.css">
7979
</head>
8080

8181
<body data-page="elements" class="elements-page">
@@ -138,6 +138,13 @@ <h1 class="h4 mb-0 fw-bold text-primary">Metis</h1>
138138
<li class="nav-item">
139139
<a class="nav-link" href="./index.html"><i class="bi bi-speedometer2"></i><span>Dashboard</span></a>
140140
</li>
141+
<li class="nav-item">
142+
<a class="nav-link" href="https://dashboardpack.com/?utm_source=metis&amp;utm_medium=sidebar&amp;utm_campaign=go_pro" target="_blank" rel="noopener">
143+
<i class="bi bi-rocket-takeoff"></i>
144+
<span>Go Pro</span>
145+
<span class="badge bg-danger rounded-pill ms-auto">Hot</span>
146+
</a>
147+
</li>
141148
<li class="nav-item">
142149
<a class="nav-link" href="./analytics.html"><i class="bi bi-graph-up"></i><span>Analytics</span></a>
143150
</li>

dist-modern/elements-badges.html

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -74,8 +74,8 @@
7474
<script type="module" crossorigin src="./assets/vendor-bootstrap-C9iorZI5.js"></script>
7575
<script type="module" crossorigin src="./assets/vendor-charts-DGwYAWel.js"></script>
7676
<script type="module" crossorigin src="./assets/vendor-ui-CflGdlft.js"></script>
77-
<script type="module" crossorigin src="./assets/main-bDXl1YJh.js"></script>
78-
<link rel="stylesheet" crossorigin href="./assets/main-CFKPan32.css">
77+
<script type="module" crossorigin src="./assets/main--6K6KPfL.js"></script>
78+
<link rel="stylesheet" crossorigin href="./assets/main-BzXkCVWJ.css">
7979
</head>
8080

8181
<body data-page="elements" class="elements-page">
@@ -141,6 +141,13 @@ <h1 class="h4 mb-0 fw-bold text-primary">Metis</h1>
141141
<span>Dashboard</span>
142142
</a>
143143
</li>
144+
<li class="nav-item">
145+
<a class="nav-link" href="https://dashboardpack.com/?utm_source=metis&amp;utm_medium=sidebar&amp;utm_campaign=go_pro" target="_blank" rel="noopener">
146+
<i class="bi bi-rocket-takeoff"></i>
147+
<span>Go Pro</span>
148+
<span class="badge bg-danger rounded-pill ms-auto">Hot</span>
149+
</a>
150+
</li>
144151
<li class="nav-item">
145152
<a class="nav-link" href="./analytics.html">
146153
<i class="bi bi-graph-up"></i>

dist-modern/elements-buttons.html

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -74,8 +74,8 @@
7474
<script type="module" crossorigin src="./assets/vendor-bootstrap-C9iorZI5.js"></script>
7575
<script type="module" crossorigin src="./assets/vendor-charts-DGwYAWel.js"></script>
7676
<script type="module" crossorigin src="./assets/vendor-ui-CflGdlft.js"></script>
77-
<script type="module" crossorigin src="./assets/main-bDXl1YJh.js"></script>
78-
<link rel="stylesheet" crossorigin href="./assets/main-CFKPan32.css">
77+
<script type="module" crossorigin src="./assets/main--6K6KPfL.js"></script>
78+
<link rel="stylesheet" crossorigin href="./assets/main-BzXkCVWJ.css">
7979
</head>
8080

8181
<body data-page="elements" class="elements-page">
@@ -138,6 +138,13 @@ <h1 class="h4 mb-0 fw-bold text-primary">Metis</h1>
138138
<li class="nav-item">
139139
<a class="nav-link" href="./index.html"><i class="bi bi-speedometer2"></i><span>Dashboard</span></a>
140140
</li>
141+
<li class="nav-item">
142+
<a class="nav-link" href="https://dashboardpack.com/?utm_source=metis&amp;utm_medium=sidebar&amp;utm_campaign=go_pro" target="_blank" rel="noopener">
143+
<i class="bi bi-rocket-takeoff"></i>
144+
<span>Go Pro</span>
145+
<span class="badge bg-danger rounded-pill ms-auto">Hot</span>
146+
</a>
147+
</li>
141148
<li class="nav-item">
142149
<a class="nav-link" href="./analytics.html"><i class="bi bi-graph-up"></i><span>Analytics</span></a>
143150
</li>

dist-modern/elements-cards.html

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -74,8 +74,8 @@
7474
<script type="module" crossorigin src="./assets/vendor-bootstrap-C9iorZI5.js"></script>
7575
<script type="module" crossorigin src="./assets/vendor-charts-DGwYAWel.js"></script>
7676
<script type="module" crossorigin src="./assets/vendor-ui-CflGdlft.js"></script>
77-
<script type="module" crossorigin src="./assets/main-bDXl1YJh.js"></script>
78-
<link rel="stylesheet" crossorigin href="./assets/main-CFKPan32.css">
77+
<script type="module" crossorigin src="./assets/main--6K6KPfL.js"></script>
78+
<link rel="stylesheet" crossorigin href="./assets/main-BzXkCVWJ.css">
7979
</head>
8080

8181
<body data-page="elements" class="elements-page">
@@ -141,6 +141,13 @@ <h1 class="h4 mb-0 fw-bold text-primary">Metis</h1>
141141
<span>Dashboard</span>
142142
</a>
143143
</li>
144+
<li class="nav-item">
145+
<a class="nav-link" href="https://dashboardpack.com/?utm_source=metis&amp;utm_medium=sidebar&amp;utm_campaign=go_pro" target="_blank" rel="noopener">
146+
<i class="bi bi-rocket-takeoff"></i>
147+
<span>Go Pro</span>
148+
<span class="badge bg-danger rounded-pill ms-auto">Hot</span>
149+
</a>
150+
</li>
144151
<li class="nav-item">
145152
<a class="nav-link" href="./analytics.html">
146153
<i class="bi bi-graph-up"></i>

dist-modern/elements-forms.html

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -74,8 +74,8 @@
7474
<script type="module" crossorigin src="./assets/vendor-bootstrap-C9iorZI5.js"></script>
7575
<script type="module" crossorigin src="./assets/vendor-charts-DGwYAWel.js"></script>
7676
<script type="module" crossorigin src="./assets/vendor-ui-CflGdlft.js"></script>
77-
<script type="module" crossorigin src="./assets/main-bDXl1YJh.js"></script>
78-
<link rel="stylesheet" crossorigin href="./assets/main-CFKPan32.css">
77+
<script type="module" crossorigin src="./assets/main--6K6KPfL.js"></script>
78+
<link rel="stylesheet" crossorigin href="./assets/main-BzXkCVWJ.css">
7979
</head>
8080

8181
<body data-page="elements" class="elements-page">
@@ -141,6 +141,13 @@ <h1 class="h4 mb-0 fw-bold text-primary">Metis</h1>
141141
<span>Dashboard</span>
142142
</a>
143143
</li>
144+
<li class="nav-item">
145+
<a class="nav-link" href="https://dashboardpack.com/?utm_source=metis&amp;utm_medium=sidebar&amp;utm_campaign=go_pro" target="_blank" rel="noopener">
146+
<i class="bi bi-rocket-takeoff"></i>
147+
<span>Go Pro</span>
148+
<span class="badge bg-danger rounded-pill ms-auto">Hot</span>
149+
</a>
150+
</li>
144151
<li class="nav-item">
145152
<a class="nav-link" href="./analytics.html">
146153
<i class="bi bi-graph-up"></i>

0 commit comments

Comments
 (0)