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.
Files changed (107) hide show
  1. package/CHANGELOG.md +96 -0
  2. package/README.md +44 -18
  3. package/dist/UI/general.html +311 -92
  4. package/dist/UI/icons.html +311 -92
  5. package/dist/UI/timeline.html +311 -92
  6. package/dist/css/adminlte.css +2814 -1138
  7. package/dist/css/adminlte.css.map +1 -1
  8. package/dist/css/adminlte.min.css +2 -2
  9. package/dist/css/adminlte.min.css.map +1 -1
  10. package/dist/css/adminlte.rtl.css +2814 -1138
  11. package/dist/css/adminlte.rtl.css.map +1 -1
  12. package/dist/css/adminlte.rtl.min.css +2 -2
  13. package/dist/css/adminlte.rtl.min.css.map +1 -1
  14. package/dist/docs/browser-support.html +291 -385
  15. package/dist/docs/color-mode.html +283 -381
  16. package/dist/docs/components/main-header.html +269 -363
  17. package/dist/docs/components/main-sidebar.html +284 -378
  18. package/dist/docs/customization.html +1056 -0
  19. package/dist/docs/deployment.html +1121 -0
  20. package/dist/docs/faq.html +887 -397
  21. package/dist/docs/getting-started.html +967 -0
  22. package/dist/docs/how-to-contribute.html +365 -450
  23. package/dist/docs/index.html +16 -0
  24. package/dist/docs/integrations.html +1207 -0
  25. package/dist/docs/introduction.html +483 -434
  26. package/dist/docs/javascript/accessibility.html +925 -0
  27. package/dist/docs/javascript/card-widget.html +995 -0
  28. package/dist/docs/javascript/direct-chat.html +872 -0
  29. package/dist/docs/javascript/fullscreen.html +881 -0
  30. package/dist/docs/javascript/layout.html +884 -0
  31. package/dist/docs/javascript/plugins-overview.html +1120 -0
  32. package/dist/docs/javascript/pushmenu.html +522 -377
  33. package/dist/docs/javascript/treeview.html +498 -390
  34. package/dist/docs/layout-blueprint.html +1063 -0
  35. package/dist/docs/layout.html +316 -402
  36. package/dist/docs/license.html +282 -375
  37. package/dist/docs/migration.html +1125 -0
  38. package/dist/docs/recipes.html +1161 -0
  39. package/dist/docs/rtl.html +933 -0
  40. package/dist/examples/lockscreen.html +66 -2
  41. package/dist/examples/login-v2.html +65 -1
  42. package/dist/examples/login.html +65 -1
  43. package/dist/examples/register-v2.html +65 -1
  44. package/dist/examples/register.html +65 -1
  45. package/dist/forms/elements.html +1381 -0
  46. package/dist/forms/{general.html → layout.html} +382 -452
  47. package/dist/forms/validation.html +1251 -0
  48. package/dist/forms/wizard.html +1386 -0
  49. package/dist/generate/theme.html +135 -5
  50. package/dist/index.html +311 -92
  51. package/dist/index2.html +314 -92
  52. package/dist/index3.html +311 -92
  53. package/dist/js/adminlte.js +135 -314
  54. package/dist/js/adminlte.js.map +1 -1
  55. package/dist/js/adminlte.min.js +3 -3
  56. package/dist/js/adminlte.min.js.map +1 -1
  57. package/dist/layout/collapsed-sidebar-without-hover.html +1120 -0
  58. package/dist/layout/collapsed-sidebar.html +311 -92
  59. package/dist/layout/fixed-complete.html +311 -92
  60. package/dist/layout/fixed-footer.html +311 -92
  61. package/dist/layout/fixed-header.html +311 -92
  62. package/dist/layout/fixed-sidebar.html +311 -92
  63. package/dist/layout/layout-custom-area.html +311 -92
  64. package/dist/layout/layout-rtl.html +311 -92
  65. package/dist/layout/logo-switch.html +135 -5
  66. package/dist/layout/sidebar-mini.html +311 -92
  67. package/dist/layout/unfixed-sidebar.html +311 -92
  68. package/dist/mailbox/compose.html +1127 -0
  69. package/dist/mailbox/inbox.html +1477 -0
  70. package/dist/mailbox/read.html +1178 -0
  71. package/dist/pages/404.html +213 -0
  72. package/dist/pages/500.html +201 -0
  73. package/dist/pages/calendar.html +1242 -0
  74. package/dist/pages/chat.html +1403 -0
  75. package/dist/pages/faq.html +1359 -0
  76. package/dist/pages/file-manager.html +1811 -0
  77. package/dist/pages/invoice.html +1175 -0
  78. package/dist/pages/kanban.html +1415 -0
  79. package/dist/pages/maintenance.html +204 -0
  80. package/dist/pages/pricing.html +1255 -0
  81. package/dist/pages/profile.html +1358 -0
  82. package/dist/pages/projects.html +1620 -0
  83. package/dist/pages/settings.html +1363 -0
  84. package/dist/tables/data.html +1295 -0
  85. package/dist/tables/simple.html +311 -92
  86. package/dist/widgets/cards.html +311 -92
  87. package/dist/widgets/info-box.html +311 -92
  88. package/dist/widgets/small-box.html +311 -92
  89. package/netlify.toml +16 -0
  90. package/package.json +32 -26
  91. package/src/scss/_accessibility.scss +44 -0
  92. package/src/scss/_app-footer.scss +9 -0
  93. package/src/scss/_app-header.scss +27 -0
  94. package/src/scss/_app-sidebar.scss +73 -74
  95. package/src/scss/_bootstrap-variables.scss +12 -5
  96. package/src/scss/_docs.scss +816 -0
  97. package/src/scss/_table.scss +4 -4
  98. package/src/scss/adminlte.scss +4 -1
  99. package/src/scss/pages/_login_and_register.scss +1 -1
  100. package/src/ts/accessibility.ts +9 -7
  101. package/src/ts/adminlte.ts +2 -14
  102. package/src/ts/fullscreen.ts +8 -4
  103. package/src/ts/layout.ts +34 -16
  104. package/src/ts/push-menu.ts +257 -104
  105. package/src/ts/util/index.ts +10 -0
  106. package/.claude/settings.local.json +0 -33
  107. 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>