admin-lte 4.0.0-rc6 → 4.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +96 -0
- package/README.md +44 -18
- package/dist/UI/general.html +311 -92
- package/dist/UI/icons.html +311 -92
- package/dist/UI/timeline.html +311 -92
- package/dist/css/adminlte.css +2814 -1138
- package/dist/css/adminlte.css.map +1 -1
- package/dist/css/adminlte.min.css +2 -2
- package/dist/css/adminlte.min.css.map +1 -1
- package/dist/css/adminlte.rtl.css +2814 -1138
- package/dist/css/adminlte.rtl.css.map +1 -1
- package/dist/css/adminlte.rtl.min.css +2 -2
- package/dist/css/adminlte.rtl.min.css.map +1 -1
- package/dist/docs/browser-support.html +291 -385
- package/dist/docs/color-mode.html +283 -381
- package/dist/docs/components/main-header.html +269 -363
- package/dist/docs/components/main-sidebar.html +284 -378
- package/dist/docs/customization.html +1056 -0
- package/dist/docs/deployment.html +1121 -0
- package/dist/docs/faq.html +887 -397
- package/dist/docs/getting-started.html +967 -0
- package/dist/docs/how-to-contribute.html +365 -450
- package/dist/docs/index.html +16 -0
- package/dist/docs/integrations.html +1207 -0
- package/dist/docs/introduction.html +483 -434
- package/dist/docs/javascript/accessibility.html +925 -0
- package/dist/docs/javascript/card-widget.html +995 -0
- package/dist/docs/javascript/direct-chat.html +872 -0
- package/dist/docs/javascript/fullscreen.html +881 -0
- package/dist/docs/javascript/layout.html +884 -0
- package/dist/docs/javascript/plugins-overview.html +1120 -0
- package/dist/docs/javascript/pushmenu.html +522 -377
- package/dist/docs/javascript/treeview.html +498 -390
- package/dist/docs/layout-blueprint.html +1063 -0
- package/dist/docs/layout.html +316 -402
- package/dist/docs/license.html +282 -375
- package/dist/docs/migration.html +1125 -0
- package/dist/docs/recipes.html +1161 -0
- package/dist/docs/rtl.html +933 -0
- package/dist/examples/lockscreen.html +66 -2
- package/dist/examples/login-v2.html +65 -1
- package/dist/examples/login.html +65 -1
- package/dist/examples/register-v2.html +65 -1
- package/dist/examples/register.html +65 -1
- package/dist/forms/elements.html +1381 -0
- package/dist/forms/{general.html → layout.html} +382 -452
- package/dist/forms/validation.html +1251 -0
- package/dist/forms/wizard.html +1386 -0
- package/dist/generate/theme.html +135 -5
- package/dist/index.html +311 -92
- package/dist/index2.html +314 -92
- package/dist/index3.html +311 -92
- package/dist/js/adminlte.js +135 -314
- package/dist/js/adminlte.js.map +1 -1
- package/dist/js/adminlte.min.js +3 -3
- package/dist/js/adminlte.min.js.map +1 -1
- package/dist/layout/collapsed-sidebar-without-hover.html +1120 -0
- package/dist/layout/collapsed-sidebar.html +311 -92
- package/dist/layout/fixed-complete.html +311 -92
- package/dist/layout/fixed-footer.html +311 -92
- package/dist/layout/fixed-header.html +311 -92
- package/dist/layout/fixed-sidebar.html +311 -92
- package/dist/layout/layout-custom-area.html +311 -92
- package/dist/layout/layout-rtl.html +311 -92
- package/dist/layout/logo-switch.html +135 -5
- package/dist/layout/sidebar-mini.html +311 -92
- package/dist/layout/unfixed-sidebar.html +311 -92
- package/dist/mailbox/compose.html +1127 -0
- package/dist/mailbox/inbox.html +1477 -0
- package/dist/mailbox/read.html +1178 -0
- package/dist/pages/404.html +213 -0
- package/dist/pages/500.html +201 -0
- package/dist/pages/calendar.html +1242 -0
- package/dist/pages/chat.html +1403 -0
- package/dist/pages/faq.html +1359 -0
- package/dist/pages/file-manager.html +1811 -0
- package/dist/pages/invoice.html +1175 -0
- package/dist/pages/kanban.html +1415 -0
- package/dist/pages/maintenance.html +204 -0
- package/dist/pages/pricing.html +1255 -0
- package/dist/pages/profile.html +1358 -0
- package/dist/pages/projects.html +1620 -0
- package/dist/pages/settings.html +1363 -0
- package/dist/tables/data.html +1295 -0
- package/dist/tables/simple.html +311 -92
- package/dist/widgets/cards.html +311 -92
- package/dist/widgets/info-box.html +311 -92
- package/dist/widgets/small-box.html +311 -92
- package/netlify.toml +16 -0
- package/package.json +32 -26
- package/src/scss/_accessibility.scss +44 -0
- package/src/scss/_app-footer.scss +9 -0
- package/src/scss/_app-header.scss +27 -0
- package/src/scss/_app-sidebar.scss +73 -74
- package/src/scss/_bootstrap-variables.scss +12 -5
- package/src/scss/_docs.scss +816 -0
- package/src/scss/_table.scss +4 -4
- package/src/scss/adminlte.scss +4 -1
- package/src/scss/pages/_login_and_register.scss +1 -1
- package/src/ts/accessibility.ts +9 -7
- package/src/ts/adminlte.ts +2 -14
- package/src/ts/fullscreen.ts +8 -4
- package/src/ts/layout.ts +34 -16
- package/src/ts/push-menu.ts +257 -104
- package/src/ts/util/index.ts +10 -0
- package/.claude/settings.local.json +0 -33
- package/CLAUDE.md +0 -79
|
@@ -0,0 +1,213 @@
|
|
|
1
|
+
<!doctype html>
|
|
2
|
+
<html lang="en">
|
|
3
|
+
<head>
|
|
4
|
+
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
|
|
5
|
+
<title>AdminLTE 4 | 404 Error Page</title>
|
|
6
|
+
|
|
7
|
+
<!--begin::Accessibility Meta Tags-->
|
|
8
|
+
<meta name="viewport" content="width=device-width, initial-scale=1.0, user-scalable=yes" />
|
|
9
|
+
<meta name="color-scheme" content="light dark" />
|
|
10
|
+
<meta name="theme-color" content="#007bff" media="(prefers-color-scheme: light)" />
|
|
11
|
+
<meta name="theme-color" content="#1a1a1a" media="(prefers-color-scheme: dark)" />
|
|
12
|
+
<!--end::Accessibility Meta Tags-->
|
|
13
|
+
|
|
14
|
+
<!--begin::Primary Meta Tags-->
|
|
15
|
+
<meta name="title" content="AdminLTE 4 | 404 Error Page" />
|
|
16
|
+
<meta name="author" content="ColorlibHQ" />
|
|
17
|
+
<meta
|
|
18
|
+
name="description"
|
|
19
|
+
content="AdminLTE is a Free Bootstrap 5 Admin Dashboard, 30 example pages using Vanilla JS. Fully accessible with WCAG 2.1 AA compliance."
|
|
20
|
+
/>
|
|
21
|
+
<meta
|
|
22
|
+
name="keywords"
|
|
23
|
+
content="bootstrap 5, bootstrap, bootstrap 5 admin dashboard, bootstrap 5 dashboard, bootstrap 5 charts, bootstrap 5 calendar, bootstrap 5 datepicker, bootstrap 5 tables, bootstrap 5 datatable, vanilla js datatable, colorlibhq, colorlibhq dashboard, colorlibhq admin dashboard, accessible admin panel, WCAG compliant"
|
|
24
|
+
/>
|
|
25
|
+
<!--end::Primary Meta Tags-->
|
|
26
|
+
|
|
27
|
+
<!--begin::Accessibility Features-->
|
|
28
|
+
<!-- Skip links will be dynamically added by accessibility.js -->
|
|
29
|
+
<meta name="supported-color-schemes" content="light dark" />
|
|
30
|
+
<link rel="preload" href="../css/adminlte.css" as="style" />
|
|
31
|
+
<!--end::Accessibility Features-->
|
|
32
|
+
|
|
33
|
+
<!--begin::Fonts-->
|
|
34
|
+
<link
|
|
35
|
+
rel="stylesheet"
|
|
36
|
+
href="https://cdn.jsdelivr.net/npm/@fontsource/source-sans-3@5.0.12/index.css"
|
|
37
|
+
integrity="sha256-tXJfXfp6Ewt1ilPzLDtQnJV4hclT9XuaZUKyUvmyr+Q="
|
|
38
|
+
crossorigin="anonymous"
|
|
39
|
+
media="print"
|
|
40
|
+
onload="this.media = 'all'"
|
|
41
|
+
/>
|
|
42
|
+
<!--end::Fonts-->
|
|
43
|
+
|
|
44
|
+
<!--begin::Third Party Plugin(OverlayScrollbars)-->
|
|
45
|
+
<link
|
|
46
|
+
rel="stylesheet"
|
|
47
|
+
href="https://cdn.jsdelivr.net/npm/overlayscrollbars@2.11.0/styles/overlayscrollbars.min.css"
|
|
48
|
+
crossorigin="anonymous"
|
|
49
|
+
/>
|
|
50
|
+
<!--end::Third Party Plugin(OverlayScrollbars)-->
|
|
51
|
+
|
|
52
|
+
<!--begin::Third Party Plugin(Bootstrap Icons)-->
|
|
53
|
+
<link
|
|
54
|
+
rel="stylesheet"
|
|
55
|
+
href="https://cdn.jsdelivr.net/npm/bootstrap-icons@1.13.1/font/bootstrap-icons.min.css"
|
|
56
|
+
crossorigin="anonymous"
|
|
57
|
+
/>
|
|
58
|
+
<!--end::Third Party Plugin(Bootstrap Icons)-->
|
|
59
|
+
|
|
60
|
+
<!--begin::Required Plugin(AdminLTE)-->
|
|
61
|
+
<link rel="stylesheet" href="../css/adminlte.css" />
|
|
62
|
+
<!--end::Required Plugin(AdminLTE)-->
|
|
63
|
+
</head>
|
|
64
|
+
<body class="bg-body-tertiary">
|
|
65
|
+
<main class="d-flex align-items-center min-vh-100 py-5">
|
|
66
|
+
<div class="container">
|
|
67
|
+
<div class="row justify-content-center">
|
|
68
|
+
<div class="col-md-8 col-lg-6 text-center">
|
|
69
|
+
<div class="display-1 fw-bold text-primary lh-1 mb-3">404</div>
|
|
70
|
+
<h1 class="h3 mb-3">Oops! Page not found.</h1>
|
|
71
|
+
<p class="text-secondary mb-4">
|
|
72
|
+
We could not find the page you were looking for. Meanwhile, you may return to the
|
|
73
|
+
dashboard or try searching for what you need.
|
|
74
|
+
</p>
|
|
75
|
+
<form class="row g-2 justify-content-center mb-4" role="search">
|
|
76
|
+
<div class="col-sm-8">
|
|
77
|
+
<div class="input-group">
|
|
78
|
+
<span class="input-group-text bg-body">
|
|
79
|
+
<i class="bi bi-search" aria-hidden="true"></i>
|
|
80
|
+
</span>
|
|
81
|
+
<input
|
|
82
|
+
type="search"
|
|
83
|
+
class="form-control"
|
|
84
|
+
placeholder="Search…"
|
|
85
|
+
aria-label="Search"
|
|
86
|
+
/>
|
|
87
|
+
</div>
|
|
88
|
+
</div>
|
|
89
|
+
<div class="col-sm-auto">
|
|
90
|
+
<button class="btn btn-primary w-100" type="submit">Search</button>
|
|
91
|
+
</div>
|
|
92
|
+
</form>
|
|
93
|
+
<a href="../index.html" class="btn btn-outline-secondary">
|
|
94
|
+
<i class="bi bi-arrow-left me-1" aria-hidden="true"></i>
|
|
95
|
+
Back to dashboard
|
|
96
|
+
</a>
|
|
97
|
+
</div>
|
|
98
|
+
</div>
|
|
99
|
+
</div>
|
|
100
|
+
</main>
|
|
101
|
+
<!--begin::Third Party Plugin(OverlayScrollbars)-->
|
|
102
|
+
<script
|
|
103
|
+
src="https://cdn.jsdelivr.net/npm/overlayscrollbars@2.11.0/browser/overlayscrollbars.browser.es6.min.js"
|
|
104
|
+
crossorigin="anonymous"
|
|
105
|
+
></script>
|
|
106
|
+
<!--end::Third Party Plugin(OverlayScrollbars)--><!--begin::Required Plugin(popperjs for Bootstrap 5)-->
|
|
107
|
+
<script
|
|
108
|
+
src="https://cdn.jsdelivr.net/npm/@popperjs/core@2.11.8/dist/umd/popper.min.js"
|
|
109
|
+
crossorigin="anonymous"
|
|
110
|
+
></script>
|
|
111
|
+
<!--end::Required Plugin(popperjs for Bootstrap 5)--><!--begin::Required Plugin(Bootstrap 5)-->
|
|
112
|
+
<script
|
|
113
|
+
src="https://cdn.jsdelivr.net/npm/bootstrap@5.3.7/dist/js/bootstrap.min.js"
|
|
114
|
+
crossorigin="anonymous"
|
|
115
|
+
></script>
|
|
116
|
+
<!--end::Required Plugin(Bootstrap 5)--><!--begin::Required Plugin(AdminLTE)-->
|
|
117
|
+
<script src="../js/adminlte.js"></script>
|
|
118
|
+
<!--end::Required Plugin(AdminLTE)--><!--begin::OverlayScrollbars Configure-->
|
|
119
|
+
<script>
|
|
120
|
+
const SELECTOR_SIDEBAR_WRAPPER = '.sidebar-wrapper';
|
|
121
|
+
const Default = {
|
|
122
|
+
scrollbarTheme: 'os-theme-light',
|
|
123
|
+
scrollbarAutoHide: 'leave',
|
|
124
|
+
scrollbarClickScroll: true,
|
|
125
|
+
};
|
|
126
|
+
document.addEventListener('DOMContentLoaded', function () {
|
|
127
|
+
const sidebarWrapper = document.querySelector(SELECTOR_SIDEBAR_WRAPPER);
|
|
128
|
+
|
|
129
|
+
// Disable OverlayScrollbars on mobile devices to prevent touch interference
|
|
130
|
+
const isMobile = window.innerWidth <= 992;
|
|
131
|
+
|
|
132
|
+
if (
|
|
133
|
+
sidebarWrapper &&
|
|
134
|
+
OverlayScrollbarsGlobal?.OverlayScrollbars !== undefined &&
|
|
135
|
+
!isMobile
|
|
136
|
+
) {
|
|
137
|
+
OverlayScrollbarsGlobal.OverlayScrollbars(sidebarWrapper, {
|
|
138
|
+
scrollbars: {
|
|
139
|
+
theme: Default.scrollbarTheme,
|
|
140
|
+
autoHide: Default.scrollbarAutoHide,
|
|
141
|
+
clickScroll: Default.scrollbarClickScroll,
|
|
142
|
+
},
|
|
143
|
+
});
|
|
144
|
+
}
|
|
145
|
+
});
|
|
146
|
+
</script>
|
|
147
|
+
<!--end::OverlayScrollbars Configure--><!--begin::Color Mode Toggle (#6010)-->
|
|
148
|
+
<script>
|
|
149
|
+
(() => {
|
|
150
|
+
'use strict';
|
|
151
|
+
|
|
152
|
+
const STORAGE_KEY = 'lte-theme';
|
|
153
|
+
|
|
154
|
+
const getStoredTheme = () => localStorage.getItem(STORAGE_KEY);
|
|
155
|
+
const setStoredTheme = (theme) => localStorage.setItem(STORAGE_KEY, theme);
|
|
156
|
+
|
|
157
|
+
const prefersDark = () => globalThis.matchMedia('(prefers-color-scheme: dark)').matches;
|
|
158
|
+
|
|
159
|
+
const getPreferredTheme = () => {
|
|
160
|
+
const stored = getStoredTheme();
|
|
161
|
+
if (stored) return stored;
|
|
162
|
+
return prefersDark() ? 'dark' : 'light';
|
|
163
|
+
};
|
|
164
|
+
|
|
165
|
+
const setTheme = (theme) => {
|
|
166
|
+
const resolved = theme === 'auto' ? (prefersDark() ? 'dark' : 'light') : theme;
|
|
167
|
+
document.documentElement.setAttribute('data-bs-theme', resolved);
|
|
168
|
+
};
|
|
169
|
+
|
|
170
|
+
setTheme(getPreferredTheme());
|
|
171
|
+
|
|
172
|
+
const showActiveTheme = (theme) => {
|
|
173
|
+
// Highlight the active dropdown option
|
|
174
|
+
document.querySelectorAll('[data-bs-theme-value]').forEach((el) => {
|
|
175
|
+
el.classList.remove('active');
|
|
176
|
+
el.setAttribute('aria-pressed', 'false');
|
|
177
|
+
const check = el.querySelector('.bi-check-lg');
|
|
178
|
+
if (check) check.classList.add('d-none');
|
|
179
|
+
});
|
|
180
|
+
const active = document.querySelector(`[data-bs-theme-value="${theme}"]`);
|
|
181
|
+
if (active) {
|
|
182
|
+
active.classList.add('active');
|
|
183
|
+
active.setAttribute('aria-pressed', 'true');
|
|
184
|
+
const check = active.querySelector('.bi-check-lg');
|
|
185
|
+
if (check) check.classList.remove('d-none');
|
|
186
|
+
}
|
|
187
|
+
// Sync the topbar trigger icon
|
|
188
|
+
document.querySelectorAll('[data-lte-theme-icon]').forEach((icon) => {
|
|
189
|
+
icon.classList.toggle('d-none', icon.dataset.lteThemeIcon !== theme);
|
|
190
|
+
});
|
|
191
|
+
};
|
|
192
|
+
|
|
193
|
+
globalThis.matchMedia('(prefers-color-scheme: dark)').addEventListener('change', () => {
|
|
194
|
+
const stored = getStoredTheme();
|
|
195
|
+
if (!stored || stored === 'auto') setTheme(getPreferredTheme());
|
|
196
|
+
});
|
|
197
|
+
|
|
198
|
+
document.addEventListener('DOMContentLoaded', () => {
|
|
199
|
+
showActiveTheme(getPreferredTheme());
|
|
200
|
+
document.querySelectorAll('[data-bs-theme-value]').forEach((toggle) => {
|
|
201
|
+
toggle.addEventListener('click', () => {
|
|
202
|
+
const theme = toggle.getAttribute('data-bs-theme-value');
|
|
203
|
+
setStoredTheme(theme);
|
|
204
|
+
setTheme(theme);
|
|
205
|
+
showActiveTheme(theme);
|
|
206
|
+
});
|
|
207
|
+
});
|
|
208
|
+
});
|
|
209
|
+
})();
|
|
210
|
+
</script>
|
|
211
|
+
<!--end::Color Mode Toggle-->
|
|
212
|
+
</body>
|
|
213
|
+
</html>
|
|
@@ -0,0 +1,201 @@
|
|
|
1
|
+
<!doctype html>
|
|
2
|
+
<html lang="en">
|
|
3
|
+
<head>
|
|
4
|
+
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
|
|
5
|
+
<title>AdminLTE 4 | 500 Error Page</title>
|
|
6
|
+
|
|
7
|
+
<!--begin::Accessibility Meta Tags-->
|
|
8
|
+
<meta name="viewport" content="width=device-width, initial-scale=1.0, user-scalable=yes" />
|
|
9
|
+
<meta name="color-scheme" content="light dark" />
|
|
10
|
+
<meta name="theme-color" content="#007bff" media="(prefers-color-scheme: light)" />
|
|
11
|
+
<meta name="theme-color" content="#1a1a1a" media="(prefers-color-scheme: dark)" />
|
|
12
|
+
<!--end::Accessibility Meta Tags-->
|
|
13
|
+
|
|
14
|
+
<!--begin::Primary Meta Tags-->
|
|
15
|
+
<meta name="title" content="AdminLTE 4 | 500 Error Page" />
|
|
16
|
+
<meta name="author" content="ColorlibHQ" />
|
|
17
|
+
<meta
|
|
18
|
+
name="description"
|
|
19
|
+
content="AdminLTE is a Free Bootstrap 5 Admin Dashboard, 30 example pages using Vanilla JS. Fully accessible with WCAG 2.1 AA compliance."
|
|
20
|
+
/>
|
|
21
|
+
<meta
|
|
22
|
+
name="keywords"
|
|
23
|
+
content="bootstrap 5, bootstrap, bootstrap 5 admin dashboard, bootstrap 5 dashboard, bootstrap 5 charts, bootstrap 5 calendar, bootstrap 5 datepicker, bootstrap 5 tables, bootstrap 5 datatable, vanilla js datatable, colorlibhq, colorlibhq dashboard, colorlibhq admin dashboard, accessible admin panel, WCAG compliant"
|
|
24
|
+
/>
|
|
25
|
+
<!--end::Primary Meta Tags-->
|
|
26
|
+
|
|
27
|
+
<!--begin::Accessibility Features-->
|
|
28
|
+
<!-- Skip links will be dynamically added by accessibility.js -->
|
|
29
|
+
<meta name="supported-color-schemes" content="light dark" />
|
|
30
|
+
<link rel="preload" href="../css/adminlte.css" as="style" />
|
|
31
|
+
<!--end::Accessibility Features-->
|
|
32
|
+
|
|
33
|
+
<!--begin::Fonts-->
|
|
34
|
+
<link
|
|
35
|
+
rel="stylesheet"
|
|
36
|
+
href="https://cdn.jsdelivr.net/npm/@fontsource/source-sans-3@5.0.12/index.css"
|
|
37
|
+
integrity="sha256-tXJfXfp6Ewt1ilPzLDtQnJV4hclT9XuaZUKyUvmyr+Q="
|
|
38
|
+
crossorigin="anonymous"
|
|
39
|
+
media="print"
|
|
40
|
+
onload="this.media = 'all'"
|
|
41
|
+
/>
|
|
42
|
+
<!--end::Fonts-->
|
|
43
|
+
|
|
44
|
+
<!--begin::Third Party Plugin(OverlayScrollbars)-->
|
|
45
|
+
<link
|
|
46
|
+
rel="stylesheet"
|
|
47
|
+
href="https://cdn.jsdelivr.net/npm/overlayscrollbars@2.11.0/styles/overlayscrollbars.min.css"
|
|
48
|
+
crossorigin="anonymous"
|
|
49
|
+
/>
|
|
50
|
+
<!--end::Third Party Plugin(OverlayScrollbars)-->
|
|
51
|
+
|
|
52
|
+
<!--begin::Third Party Plugin(Bootstrap Icons)-->
|
|
53
|
+
<link
|
|
54
|
+
rel="stylesheet"
|
|
55
|
+
href="https://cdn.jsdelivr.net/npm/bootstrap-icons@1.13.1/font/bootstrap-icons.min.css"
|
|
56
|
+
crossorigin="anonymous"
|
|
57
|
+
/>
|
|
58
|
+
<!--end::Third Party Plugin(Bootstrap Icons)-->
|
|
59
|
+
|
|
60
|
+
<!--begin::Required Plugin(AdminLTE)-->
|
|
61
|
+
<link rel="stylesheet" href="../css/adminlte.css" />
|
|
62
|
+
<!--end::Required Plugin(AdminLTE)-->
|
|
63
|
+
</head>
|
|
64
|
+
<body class="bg-body-tertiary">
|
|
65
|
+
<main class="d-flex align-items-center min-vh-100 py-5">
|
|
66
|
+
<div class="container">
|
|
67
|
+
<div class="row justify-content-center">
|
|
68
|
+
<div class="col-md-8 col-lg-6 text-center">
|
|
69
|
+
<div class="display-1 fw-bold text-danger lh-1 mb-3">500</div>
|
|
70
|
+
<h1 class="h3 mb-3">Something went wrong on our end.</h1>
|
|
71
|
+
<p class="text-secondary mb-4">
|
|
72
|
+
The server encountered an unexpected condition. Our team has been notified. Please try
|
|
73
|
+
again in a moment, or contact support if the issue persists.
|
|
74
|
+
</p>
|
|
75
|
+
<div class="d-flex gap-2 justify-content-center">
|
|
76
|
+
<a href="../index.html" class="btn btn-primary">
|
|
77
|
+
<i class="bi bi-arrow-left me-1" aria-hidden="true"></i>
|
|
78
|
+
Back to dashboard
|
|
79
|
+
</a>
|
|
80
|
+
<a href="mailto:support@example.com" class="btn btn-outline-secondary">
|
|
81
|
+
<i class="bi bi-life-preserver me-1" aria-hidden="true"></i>
|
|
82
|
+
Contact support
|
|
83
|
+
</a>
|
|
84
|
+
</div>
|
|
85
|
+
</div>
|
|
86
|
+
</div>
|
|
87
|
+
</div>
|
|
88
|
+
</main>
|
|
89
|
+
<!--begin::Third Party Plugin(OverlayScrollbars)-->
|
|
90
|
+
<script
|
|
91
|
+
src="https://cdn.jsdelivr.net/npm/overlayscrollbars@2.11.0/browser/overlayscrollbars.browser.es6.min.js"
|
|
92
|
+
crossorigin="anonymous"
|
|
93
|
+
></script>
|
|
94
|
+
<!--end::Third Party Plugin(OverlayScrollbars)--><!--begin::Required Plugin(popperjs for Bootstrap 5)-->
|
|
95
|
+
<script
|
|
96
|
+
src="https://cdn.jsdelivr.net/npm/@popperjs/core@2.11.8/dist/umd/popper.min.js"
|
|
97
|
+
crossorigin="anonymous"
|
|
98
|
+
></script>
|
|
99
|
+
<!--end::Required Plugin(popperjs for Bootstrap 5)--><!--begin::Required Plugin(Bootstrap 5)-->
|
|
100
|
+
<script
|
|
101
|
+
src="https://cdn.jsdelivr.net/npm/bootstrap@5.3.7/dist/js/bootstrap.min.js"
|
|
102
|
+
crossorigin="anonymous"
|
|
103
|
+
></script>
|
|
104
|
+
<!--end::Required Plugin(Bootstrap 5)--><!--begin::Required Plugin(AdminLTE)-->
|
|
105
|
+
<script src="../js/adminlte.js"></script>
|
|
106
|
+
<!--end::Required Plugin(AdminLTE)--><!--begin::OverlayScrollbars Configure-->
|
|
107
|
+
<script>
|
|
108
|
+
const SELECTOR_SIDEBAR_WRAPPER = '.sidebar-wrapper';
|
|
109
|
+
const Default = {
|
|
110
|
+
scrollbarTheme: 'os-theme-light',
|
|
111
|
+
scrollbarAutoHide: 'leave',
|
|
112
|
+
scrollbarClickScroll: true,
|
|
113
|
+
};
|
|
114
|
+
document.addEventListener('DOMContentLoaded', function () {
|
|
115
|
+
const sidebarWrapper = document.querySelector(SELECTOR_SIDEBAR_WRAPPER);
|
|
116
|
+
|
|
117
|
+
// Disable OverlayScrollbars on mobile devices to prevent touch interference
|
|
118
|
+
const isMobile = window.innerWidth <= 992;
|
|
119
|
+
|
|
120
|
+
if (
|
|
121
|
+
sidebarWrapper &&
|
|
122
|
+
OverlayScrollbarsGlobal?.OverlayScrollbars !== undefined &&
|
|
123
|
+
!isMobile
|
|
124
|
+
) {
|
|
125
|
+
OverlayScrollbarsGlobal.OverlayScrollbars(sidebarWrapper, {
|
|
126
|
+
scrollbars: {
|
|
127
|
+
theme: Default.scrollbarTheme,
|
|
128
|
+
autoHide: Default.scrollbarAutoHide,
|
|
129
|
+
clickScroll: Default.scrollbarClickScroll,
|
|
130
|
+
},
|
|
131
|
+
});
|
|
132
|
+
}
|
|
133
|
+
});
|
|
134
|
+
</script>
|
|
135
|
+
<!--end::OverlayScrollbars Configure--><!--begin::Color Mode Toggle (#6010)-->
|
|
136
|
+
<script>
|
|
137
|
+
(() => {
|
|
138
|
+
'use strict';
|
|
139
|
+
|
|
140
|
+
const STORAGE_KEY = 'lte-theme';
|
|
141
|
+
|
|
142
|
+
const getStoredTheme = () => localStorage.getItem(STORAGE_KEY);
|
|
143
|
+
const setStoredTheme = (theme) => localStorage.setItem(STORAGE_KEY, theme);
|
|
144
|
+
|
|
145
|
+
const prefersDark = () => globalThis.matchMedia('(prefers-color-scheme: dark)').matches;
|
|
146
|
+
|
|
147
|
+
const getPreferredTheme = () => {
|
|
148
|
+
const stored = getStoredTheme();
|
|
149
|
+
if (stored) return stored;
|
|
150
|
+
return prefersDark() ? 'dark' : 'light';
|
|
151
|
+
};
|
|
152
|
+
|
|
153
|
+
const setTheme = (theme) => {
|
|
154
|
+
const resolved = theme === 'auto' ? (prefersDark() ? 'dark' : 'light') : theme;
|
|
155
|
+
document.documentElement.setAttribute('data-bs-theme', resolved);
|
|
156
|
+
};
|
|
157
|
+
|
|
158
|
+
setTheme(getPreferredTheme());
|
|
159
|
+
|
|
160
|
+
const showActiveTheme = (theme) => {
|
|
161
|
+
// Highlight the active dropdown option
|
|
162
|
+
document.querySelectorAll('[data-bs-theme-value]').forEach((el) => {
|
|
163
|
+
el.classList.remove('active');
|
|
164
|
+
el.setAttribute('aria-pressed', 'false');
|
|
165
|
+
const check = el.querySelector('.bi-check-lg');
|
|
166
|
+
if (check) check.classList.add('d-none');
|
|
167
|
+
});
|
|
168
|
+
const active = document.querySelector(`[data-bs-theme-value="${theme}"]`);
|
|
169
|
+
if (active) {
|
|
170
|
+
active.classList.add('active');
|
|
171
|
+
active.setAttribute('aria-pressed', 'true');
|
|
172
|
+
const check = active.querySelector('.bi-check-lg');
|
|
173
|
+
if (check) check.classList.remove('d-none');
|
|
174
|
+
}
|
|
175
|
+
// Sync the topbar trigger icon
|
|
176
|
+
document.querySelectorAll('[data-lte-theme-icon]').forEach((icon) => {
|
|
177
|
+
icon.classList.toggle('d-none', icon.dataset.lteThemeIcon !== theme);
|
|
178
|
+
});
|
|
179
|
+
};
|
|
180
|
+
|
|
181
|
+
globalThis.matchMedia('(prefers-color-scheme: dark)').addEventListener('change', () => {
|
|
182
|
+
const stored = getStoredTheme();
|
|
183
|
+
if (!stored || stored === 'auto') setTheme(getPreferredTheme());
|
|
184
|
+
});
|
|
185
|
+
|
|
186
|
+
document.addEventListener('DOMContentLoaded', () => {
|
|
187
|
+
showActiveTheme(getPreferredTheme());
|
|
188
|
+
document.querySelectorAll('[data-bs-theme-value]').forEach((toggle) => {
|
|
189
|
+
toggle.addEventListener('click', () => {
|
|
190
|
+
const theme = toggle.getAttribute('data-bs-theme-value');
|
|
191
|
+
setStoredTheme(theme);
|
|
192
|
+
setTheme(theme);
|
|
193
|
+
showActiveTheme(theme);
|
|
194
|
+
});
|
|
195
|
+
});
|
|
196
|
+
});
|
|
197
|
+
})();
|
|
198
|
+
</script>
|
|
199
|
+
<!--end::Color Mode Toggle-->
|
|
200
|
+
</body>
|
|
201
|
+
</html>
|