admin-lte 4.0.0-beta3 → 4.0.0-rc3

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 (76) hide show
  1. package/.browserslistrc +9 -4
  2. package/ACCESSIBILITY-COMPLIANCE.md +369 -0
  3. package/CHANGELOG.md +460 -0
  4. package/README.md +50 -7
  5. package/dist/{pages/UI → UI}/general.html +79 -28
  6. package/dist/{pages/UI → UI}/icons.html +76 -25
  7. package/dist/{pages/UI → UI}/timeline.html +80 -29
  8. package/dist/css/adminlte.css +516 -332
  9. package/dist/css/adminlte.css.map +1 -1
  10. package/dist/css/adminlte.min.css +1 -1
  11. package/dist/css/adminlte.min.css.map +1 -1
  12. package/dist/css/adminlte.rtl.css +516 -332
  13. package/dist/css/adminlte.rtl.css.map +1 -1
  14. package/dist/css/adminlte.rtl.min.css +1 -1
  15. package/dist/css/adminlte.rtl.min.css.map +1 -1
  16. package/dist/{pages/docs → docs}/browser-support.html +77 -44
  17. package/dist/{pages/docs → docs}/color-mode.html +82 -50
  18. package/dist/{pages/docs → docs}/components/main-header.html +82 -49
  19. package/dist/{pages/docs → docs}/components/main-sidebar.html +78 -46
  20. package/dist/{pages/docs → docs}/faq.html +76 -42
  21. package/dist/{pages/docs → docs}/how-to-contribute.html +77 -44
  22. package/dist/{pages/docs → docs}/introduction.html +82 -54
  23. package/dist/{pages/docs → docs}/javascript/treeview.html +77 -44
  24. package/dist/{pages/docs → docs}/layout.html +76 -25
  25. package/dist/{pages/docs → docs}/license.html +76 -42
  26. package/dist/{pages/examples → examples}/lockscreen.html +49 -18
  27. package/dist/{pages/examples → examples}/login-v2.html +47 -16
  28. package/dist/{pages/examples → examples}/login.html +47 -16
  29. package/dist/{pages/examples → examples}/register-v2.html +47 -16
  30. package/dist/{pages/examples → examples}/register.html +47 -16
  31. package/dist/{pages/forms → forms}/general.html +76 -25
  32. package/dist/{pages/generate → generate}/theme.html +193 -24
  33. package/dist/{pages/index.html → index.html} +90 -57
  34. package/dist/{pages/index2.html → index2.html} +99 -48
  35. package/dist/{pages/index3.html → index3.html} +80 -29
  36. package/dist/js/adminlte.js +795 -345
  37. package/dist/js/adminlte.js.map +1 -1
  38. package/dist/js/adminlte.min.js +3 -3
  39. package/dist/js/adminlte.min.js.map +1 -1
  40. package/dist/{pages/layout → layout}/collapsed-sidebar.html +75 -24
  41. package/dist/layout/fixed-complete.html +883 -0
  42. package/dist/layout/fixed-footer.html +880 -0
  43. package/dist/layout/fixed-header.html +880 -0
  44. package/dist/{pages/layout → layout}/fixed-sidebar.html +76 -25
  45. package/dist/{pages/layout → layout}/layout-custom-area.html +76 -25
  46. package/dist/{pages/layout → layout}/layout-rtl.html +76 -25
  47. package/dist/{pages/layout → layout}/logo-switch.html +55 -24
  48. package/dist/{pages/layout → layout}/sidebar-mini.html +75 -24
  49. package/dist/{pages/layout → layout}/unfixed-sidebar.html +76 -25
  50. package/dist/{pages/tables → tables}/simple.html +76 -25
  51. package/dist/{pages/widgets → widgets}/cards.html +76 -25
  52. package/dist/{pages/widgets → widgets}/info-box.html +76 -25
  53. package/dist/{pages/widgets → widgets}/small-box.html +76 -25
  54. package/eslint.config.js +82 -0
  55. package/package.json +42 -37
  56. package/src/scss/_accessibility.scss +292 -0
  57. package/src/scss/_app-footer.scss +8 -0
  58. package/src/scss/_app-header.scss +8 -0
  59. package/src/scss/_app-sidebar.scss +12 -0
  60. package/src/scss/_table.scss +1 -9
  61. package/src/scss/_variables.scss +2 -1
  62. package/src/scss/adminlte.scss +3 -0
  63. package/src/ts/accessibility.ts +533 -0
  64. package/src/ts/adminlte.ts +48 -9
  65. package/src/ts/card-widget.ts +1 -2
  66. package/src/ts/push-menu.ts +1 -2
  67. package/src/ts/treeview.ts +13 -2
  68. package/src/ts/util/index.ts +39 -7
  69. package/.astro/content-assets.mjs +0 -1
  70. package/.astro/content-modules.mjs +0 -1
  71. package/.astro/content.d.ts +0 -166
  72. package/.astro/data-store.json +0 -1
  73. package/.astro/settings.json +0 -5
  74. package/.astro/types.d.ts +0 -2
  75. package/adminlte-v4.0.0-beta1-with-dist.zip +0 -0
  76. package/adminlte-v4.0.0-beta3.zip +0 -0
@@ -4,50 +4,60 @@
4
4
  <head>
5
5
  <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
6
6
  <title>Layout | AdminLTE 4</title>
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-->
7
13
  <!--begin::Primary Meta Tags-->
8
- <meta name="viewport" content="width=device-width, initial-scale=1.0" />
9
14
  <meta name="title" content="Layout | AdminLTE 4" />
10
15
  <meta name="author" content="ColorlibHQ" />
11
16
  <meta
12
17
  name="description"
13
- content="AdminLTE is a Free Bootstrap 5 Admin Dashboard, 30 example pages using Vanilla JS."
18
+ content="AdminLTE is a Free Bootstrap 5 Admin Dashboard, 30 example pages using Vanilla JS. Fully accessible with WCAG 2.1 AA compliance."
14
19
  />
15
20
  <meta
16
21
  name="keywords"
17
- 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"
22
+ 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"
18
23
  />
19
24
  <!--end::Primary Meta Tags-->
25
+ <!--begin::Accessibility Features-->
26
+ <!-- Skip links will be dynamically added by accessibility.js -->
27
+ <meta name="supported-color-schemes" content="light dark" />
28
+ <link rel="preload" href="../css/adminlte.css" as="style" />
29
+ <!--end::Accessibility Features-->
20
30
  <!--begin::Fonts-->
21
31
  <link
22
32
  rel="stylesheet"
23
33
  href="https://cdn.jsdelivr.net/npm/@fontsource/source-sans-3@5.0.12/index.css"
24
34
  integrity="sha256-tXJfXfp6Ewt1ilPzLDtQnJV4hclT9XuaZUKyUvmyr+Q="
25
35
  crossorigin="anonymous"
36
+ media="print"
37
+ onload="this.media='all'"
26
38
  />
27
39
  <!--end::Fonts-->
28
40
  <!--begin::Third Party Plugin(OverlayScrollbars)-->
29
41
  <link
30
42
  rel="stylesheet"
31
- href="https://cdn.jsdelivr.net/npm/overlayscrollbars@2.10.1/styles/overlayscrollbars.min.css"
32
- integrity="sha256-tZHrRjVqNSRyWg2wbppGnT833E/Ys0DHWGwT04GiqQg="
43
+ href="https://cdn.jsdelivr.net/npm/overlayscrollbars@2.11.0/styles/overlayscrollbars.min.css"
33
44
  crossorigin="anonymous"
34
45
  />
35
46
  <!--end::Third Party Plugin(OverlayScrollbars)-->
36
47
  <!--begin::Third Party Plugin(Bootstrap Icons)-->
37
48
  <link
38
49
  rel="stylesheet"
39
- href="https://cdn.jsdelivr.net/npm/bootstrap-icons@1.11.3/font/bootstrap-icons.min.css"
40
- integrity="sha256-9kPW/n5nn53j4WMRYAxe9c1rCY96Oogo/MKSVdKzPmI="
50
+ href="https://cdn.jsdelivr.net/npm/bootstrap-icons@1.13.1/font/bootstrap-icons.min.css"
41
51
  crossorigin="anonymous"
42
52
  />
43
53
  <!--end::Third Party Plugin(Bootstrap Icons)-->
44
54
  <!--begin::Required Plugin(AdminLTE)-->
45
- <link rel="stylesheet" href="../../../dist/css/adminlte.css" />
55
+ <link rel="stylesheet" href="../css/adminlte.css" />
46
56
  <!--end::Required Plugin(AdminLTE)-->
47
57
  </head>
48
58
  <!--end::Head-->
49
59
  <!--begin::Body-->
50
- <body class="layout-fixed sidebar-expand-lg bg-body-tertiary">
60
+ <body class="layout-fixed sidebar-expand-lg sidebar-open bg-body-tertiary">
51
61
  <!--begin::App Wrapper-->
52
62
  <div class="app-wrapper">
53
63
  <!--begin::Header-->
@@ -86,7 +96,7 @@
86
96
  <div class="d-flex">
87
97
  <div class="flex-shrink-0">
88
98
  <img
89
- src="../../../dist/assets/img/user1-128x128.jpg"
99
+ src="/assets/img/user1-128x128.jpg"
90
100
  alt="User Avatar"
91
101
  class="img-size-50 rounded-circle me-3"
92
102
  />
@@ -112,7 +122,7 @@
112
122
  <div class="d-flex">
113
123
  <div class="flex-shrink-0">
114
124
  <img
115
- src="../../../dist/assets/img/user8-128x128.jpg"
125
+ src="/assets/img/user8-128x128.jpg"
116
126
  alt="User Avatar"
117
127
  class="img-size-50 rounded-circle me-3"
118
128
  />
@@ -138,7 +148,7 @@
138
148
  <div class="d-flex">
139
149
  <div class="flex-shrink-0">
140
150
  <img
141
- src="../../../dist/assets/img/user3-128x128.jpg"
151
+ src="/assets/img/user3-128x128.jpg"
142
152
  alt="User Avatar"
143
153
  class="img-size-50 rounded-circle me-3"
144
154
  />
@@ -203,7 +213,7 @@
203
213
  <li class="nav-item dropdown user-menu">
204
214
  <a href="#" class="nav-link dropdown-toggle" data-bs-toggle="dropdown">
205
215
  <img
206
- src="../../../dist/assets/img/user2-160x160.jpg"
216
+ src="/assets/img/user2-160x160.jpg"
207
217
  class="user-image rounded-circle shadow"
208
218
  alt="User Image"
209
219
  />
@@ -213,7 +223,7 @@
213
223
  <!--begin::User Image-->
214
224
  <li class="user-header text-bg-primary">
215
225
  <img
216
- src="../../../dist/assets/img/user2-160x160.jpg"
226
+ src="/assets/img/user2-160x160.jpg"
217
227
  class="rounded-circle shadow"
218
228
  alt="User Image"
219
229
  />
@@ -257,7 +267,7 @@
257
267
  <a href="../index.html" class="brand-link">
258
268
  <!--begin::Brand Image-->
259
269
  <img
260
- src="../../../dist/assets/img/AdminLTELogo.png"
270
+ src="/assets/img/AdminLTELogo.png"
261
271
  alt="AdminLTE Logo"
262
272
  class="brand-image opacity-75 shadow"
263
273
  />
@@ -276,8 +286,10 @@
276
286
  <ul
277
287
  class="nav sidebar-menu flex-column"
278
288
  data-lte-toggle="treeview"
279
- role="menu"
289
+ role="navigation"
290
+ aria-label="Main navigation"
280
291
  data-accordion="false"
292
+ id="navigation"
281
293
  >
282
294
  <li class="nav-item">
283
295
  <a href="#" class="nav-link">
@@ -365,6 +377,24 @@
365
377
  <p>Fixed Sidebar</p>
366
378
  </a>
367
379
  </li>
380
+ <li class="nav-item">
381
+ <a href="../layout/fixed-header.html" class="nav-link">
382
+ <i class="nav-icon bi bi-circle"></i>
383
+ <p>Fixed Header</p>
384
+ </a>
385
+ </li>
386
+ <li class="nav-item">
387
+ <a href="../layout/fixed-footer.html" class="nav-link">
388
+ <i class="nav-icon bi bi-circle"></i>
389
+ <p>Fixed Footer</p>
390
+ </a>
391
+ </li>
392
+ <li class="nav-item">
393
+ <a href="../layout/fixed-complete.html" class="nav-link">
394
+ <i class="nav-icon bi bi-circle"></i>
395
+ <p>Fixed Complete</p>
396
+ </a>
397
+ </li>
368
398
  <li class="nav-item">
369
399
  <a href="../layout/layout-custom-area.html" class="nav-link">
370
400
  <i class="nav-icon bi bi-circle"></i>
@@ -781,7 +811,7 @@
781
811
  <!--end::To the end-->
782
812
  <!--begin::Copyright-->
783
813
  <strong>
784
- Copyright &copy; 2014-2024&nbsp;
814
+ Copyright &copy; 2014-2025&nbsp;
785
815
  <a href="https://adminlte.io" class="text-decoration-none">AdminLTE.io</a>.
786
816
  </strong>
787
817
  All rights reserved.
@@ -793,24 +823,21 @@
793
823
  <!--begin::Script-->
794
824
  <!--begin::Third Party Plugin(OverlayScrollbars)-->
795
825
  <script
796
- src="https://cdn.jsdelivr.net/npm/overlayscrollbars@2.10.1/browser/overlayscrollbars.browser.es6.min.js"
797
- integrity="sha256-dghWARbRe2eLlIJ56wNB+b760ywulqK3DzZYEpsg2fQ="
826
+ src="https://cdn.jsdelivr.net/npm/overlayscrollbars@2.11.0/browser/overlayscrollbars.browser.es6.min.js"
798
827
  crossorigin="anonymous"
799
828
  ></script>
800
829
  <!--end::Third Party Plugin(OverlayScrollbars)--><!--begin::Required Plugin(popperjs for Bootstrap 5)-->
801
830
  <script
802
831
  src="https://cdn.jsdelivr.net/npm/@popperjs/core@2.11.8/dist/umd/popper.min.js"
803
- integrity="sha384-I7E8VVD/ismYTF4hNIPjVp/Zjvgyol6VFvRkX/vR+Vc4jQkC+hVqc2pM8ODewa9r"
804
832
  crossorigin="anonymous"
805
833
  ></script>
806
834
  <!--end::Required Plugin(popperjs for Bootstrap 5)--><!--begin::Required Plugin(Bootstrap 5)-->
807
835
  <script
808
- src="https://cdn.jsdelivr.net/npm/bootstrap@5.3.3/dist/js/bootstrap.min.js"
809
- integrity="sha384-0pUGZvbkm6XF6gxjEnlmuGrJXVbNuzT9qBBavbLwCsOGabYfZo0T0to5eqruptLy"
836
+ src="https://cdn.jsdelivr.net/npm/bootstrap@5.3.7/dist/js/bootstrap.min.js"
810
837
  crossorigin="anonymous"
811
838
  ></script>
812
839
  <!--end::Required Plugin(Bootstrap 5)--><!--begin::Required Plugin(AdminLTE)-->
813
- <script src="../../../dist/js/adminlte.js"></script>
840
+ <script src="../js/adminlte.js"></script>
814
841
  <!--end::Required Plugin(AdminLTE)--><!--begin::OverlayScrollbars Configure-->
815
842
  <script>
816
843
  const SELECTOR_SIDEBAR_WRAPPER = '.sidebar-wrapper';
@@ -821,7 +848,7 @@
821
848
  };
822
849
  document.addEventListener('DOMContentLoaded', function () {
823
850
  const sidebarWrapper = document.querySelector(SELECTOR_SIDEBAR_WRAPPER);
824
- if (sidebarWrapper && typeof OverlayScrollbarsGlobal?.OverlayScrollbars !== 'undefined') {
851
+ if (sidebarWrapper && OverlayScrollbarsGlobal?.OverlayScrollbars !== undefined) {
825
852
  OverlayScrollbarsGlobal.OverlayScrollbars(sidebarWrapper, {
826
853
  scrollbars: {
827
854
  theme: Default.scrollbarTheme,
@@ -832,7 +859,31 @@
832
859
  }
833
860
  });
834
861
  </script>
835
- <!--end::OverlayScrollbars Configure-->
862
+ <!--end::OverlayScrollbars Configure--><!-- Image path runtime fix -->
863
+ <script>
864
+ document.addEventListener('DOMContentLoaded', () => {
865
+ // Find the link tag for the main AdminLTE CSS file.
866
+ const cssLink = document.querySelector('link[href*="css/adminlte.css"]');
867
+ if (!cssLink) {
868
+ return; // Exit if the link isn't found
869
+ }
870
+
871
+ // Extract the base path from the CSS href.
872
+ // e.g., from "../css/adminlte.css", we get "../"
873
+ // e.g., from "./css/adminlte.css", we get "./"
874
+ const cssHref = cssLink.getAttribute('href');
875
+ const deploymentPath = cssHref.slice(0, cssHref.indexOf('css/adminlte.css'));
876
+
877
+ // Find all images with absolute paths and fix them.
878
+ document.querySelectorAll('img[src^="/assets/"]').forEach((img) => {
879
+ const originalSrc = img.getAttribute('src');
880
+ if (originalSrc) {
881
+ const relativeSrc = originalSrc.slice(1); // Remove leading '/'
882
+ img.src = deploymentPath + relativeSrc;
883
+ }
884
+ });
885
+ });
886
+ </script>
836
887
  <!--end::Script-->
837
888
  </body>
838
889
  <!--end::Body-->
@@ -4,67 +4,60 @@
4
4
  <head>
5
5
  <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
6
6
  <title>License | AdminLTE 4</title>
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-->
7
13
  <!--begin::Primary Meta Tags-->
8
- <meta name="viewport" content="width=device-width, initial-scale=1.0" />
9
14
  <meta name="title" content="License | AdminLTE 4" />
10
15
  <meta name="author" content="ColorlibHQ" />
11
16
  <meta
12
17
  name="description"
13
- content="AdminLTE is a Free Bootstrap 5 Admin Dashboard, 30 example pages using Vanilla JS."
18
+ content="AdminLTE is a Free Bootstrap 5 Admin Dashboard, 30 example pages using Vanilla JS. Fully accessible with WCAG 2.1 AA compliance."
14
19
  />
15
20
  <meta
16
21
  name="keywords"
17
- 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"
22
+ 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"
18
23
  />
19
24
  <!--end::Primary Meta Tags-->
25
+ <!--begin::Accessibility Features-->
26
+ <!-- Skip links will be dynamically added by accessibility.js -->
27
+ <meta name="supported-color-schemes" content="light dark" />
28
+ <link rel="preload" href="../css/adminlte.css" as="style" />
29
+ <!--end::Accessibility Features-->
20
30
  <!--begin::Fonts-->
21
31
  <link
22
32
  rel="stylesheet"
23
33
  href="https://cdn.jsdelivr.net/npm/@fontsource/source-sans-3@5.0.12/index.css"
24
34
  integrity="sha256-tXJfXfp6Ewt1ilPzLDtQnJV4hclT9XuaZUKyUvmyr+Q="
25
35
  crossorigin="anonymous"
36
+ media="print"
37
+ onload="this.media='all'"
26
38
  />
27
39
  <!--end::Fonts-->
28
40
  <!--begin::Third Party Plugin(OverlayScrollbars)-->
29
41
  <link
30
42
  rel="stylesheet"
31
- href="https://cdn.jsdelivr.net/npm/overlayscrollbars@2.10.1/styles/overlayscrollbars.min.css"
32
- integrity="sha256-tZHrRjVqNSRyWg2wbppGnT833E/Ys0DHWGwT04GiqQg="
43
+ href="https://cdn.jsdelivr.net/npm/overlayscrollbars@2.11.0/styles/overlayscrollbars.min.css"
33
44
  crossorigin="anonymous"
34
45
  />
35
46
  <!--end::Third Party Plugin(OverlayScrollbars)-->
36
47
  <!--begin::Third Party Plugin(Bootstrap Icons)-->
37
48
  <link
38
49
  rel="stylesheet"
39
- href="https://cdn.jsdelivr.net/npm/bootstrap-icons@1.11.3/font/bootstrap-icons.min.css"
40
- integrity="sha256-9kPW/n5nn53j4WMRYAxe9c1rCY96Oogo/MKSVdKzPmI="
50
+ href="https://cdn.jsdelivr.net/npm/bootstrap-icons@1.13.1/font/bootstrap-icons.min.css"
41
51
  crossorigin="anonymous"
42
52
  />
43
53
  <!--end::Third Party Plugin(Bootstrap Icons)-->
44
54
  <!--begin::Required Plugin(AdminLTE)-->
45
- <link rel="stylesheet" href="../../../dist/css/adminlte.css" />
55
+ <link rel="stylesheet" href="../css/adminlte.css" />
46
56
  <!--end::Required Plugin(AdminLTE)-->
47
- <style>
48
- [data-astro-image] {
49
- width: 100%;
50
- height: auto;
51
- object-fit: var(--fit);
52
- object-position: var(--pos);
53
- aspect-ratio: var(--w) / var(--h);
54
- }
55
- [data-astro-image='responsive'] {
56
- max-width: calc(var(--w) * 1px);
57
- max-height: calc(var(--h) * 1px);
58
- }
59
- [data-astro-image='fixed'] {
60
- width: calc(var(--w) * 1px);
61
- height: calc(var(--h) * 1px);
62
- }
63
- </style>
64
57
  </head>
65
58
  <!--end::Head-->
66
59
  <!--begin::Body-->
67
- <body class="layout-fixed sidebar-expand-lg bg-body-tertiary">
60
+ <body class="layout-fixed sidebar-expand-lg sidebar-open bg-body-tertiary">
68
61
  <!--begin::App Wrapper-->
69
62
  <div class="app-wrapper">
70
63
  <!--begin::Header-->
@@ -103,7 +96,7 @@
103
96
  <div class="d-flex">
104
97
  <div class="flex-shrink-0">
105
98
  <img
106
- src="../../../dist/assets/img/user1-128x128.jpg"
99
+ src="/assets/img/user1-128x128.jpg"
107
100
  alt="User Avatar"
108
101
  class="img-size-50 rounded-circle me-3"
109
102
  />
@@ -129,7 +122,7 @@
129
122
  <div class="d-flex">
130
123
  <div class="flex-shrink-0">
131
124
  <img
132
- src="../../../dist/assets/img/user8-128x128.jpg"
125
+ src="/assets/img/user8-128x128.jpg"
133
126
  alt="User Avatar"
134
127
  class="img-size-50 rounded-circle me-3"
135
128
  />
@@ -155,7 +148,7 @@
155
148
  <div class="d-flex">
156
149
  <div class="flex-shrink-0">
157
150
  <img
158
- src="../../../dist/assets/img/user3-128x128.jpg"
151
+ src="/assets/img/user3-128x128.jpg"
159
152
  alt="User Avatar"
160
153
  class="img-size-50 rounded-circle me-3"
161
154
  />
@@ -220,7 +213,7 @@
220
213
  <li class="nav-item dropdown user-menu">
221
214
  <a href="#" class="nav-link dropdown-toggle" data-bs-toggle="dropdown">
222
215
  <img
223
- src="../../../dist/assets/img/user2-160x160.jpg"
216
+ src="/assets/img/user2-160x160.jpg"
224
217
  class="user-image rounded-circle shadow"
225
218
  alt="User Image"
226
219
  />
@@ -230,7 +223,7 @@
230
223
  <!--begin::User Image-->
231
224
  <li class="user-header text-bg-primary">
232
225
  <img
233
- src="../../../dist/assets/img/user2-160x160.jpg"
226
+ src="/assets/img/user2-160x160.jpg"
234
227
  class="rounded-circle shadow"
235
228
  alt="User Image"
236
229
  />
@@ -274,7 +267,7 @@
274
267
  <a href="../index.html" class="brand-link">
275
268
  <!--begin::Brand Image-->
276
269
  <img
277
- src="../../../dist/assets/img/AdminLTELogo.png"
270
+ src="/assets/img/AdminLTELogo.png"
278
271
  alt="AdminLTE Logo"
279
272
  class="brand-image opacity-75 shadow"
280
273
  />
@@ -293,8 +286,10 @@
293
286
  <ul
294
287
  class="nav sidebar-menu flex-column"
295
288
  data-lte-toggle="treeview"
296
- role="menu"
289
+ role="navigation"
290
+ aria-label="Main navigation"
297
291
  data-accordion="false"
292
+ id="navigation"
298
293
  >
299
294
  <li class="nav-item">
300
295
  <a href="#" class="nav-link">
@@ -382,6 +377,24 @@
382
377
  <p>Fixed Sidebar</p>
383
378
  </a>
384
379
  </li>
380
+ <li class="nav-item">
381
+ <a href="../layout/fixed-header.html" class="nav-link">
382
+ <i class="nav-icon bi bi-circle"></i>
383
+ <p>Fixed Header</p>
384
+ </a>
385
+ </li>
386
+ <li class="nav-item">
387
+ <a href="../layout/fixed-footer.html" class="nav-link">
388
+ <i class="nav-icon bi bi-circle"></i>
389
+ <p>Fixed Footer</p>
390
+ </a>
391
+ </li>
392
+ <li class="nav-item">
393
+ <a href="../layout/fixed-complete.html" class="nav-link">
394
+ <i class="nav-icon bi bi-circle"></i>
395
+ <p>Fixed Complete</p>
396
+ </a>
397
+ </li>
385
398
  <li class="nav-item">
386
399
  <a href="../layout/layout-custom-area.html" class="nav-link">
387
400
  <i class="nav-icon bi bi-circle"></i>
@@ -772,7 +785,7 @@
772
785
  <!--end::To the end-->
773
786
  <!--begin::Copyright-->
774
787
  <strong>
775
- Copyright &copy; 2014-2024&nbsp;
788
+ Copyright &copy; 2014-2025&nbsp;
776
789
  <a href="https://adminlte.io" class="text-decoration-none">AdminLTE.io</a>.
777
790
  </strong>
778
791
  All rights reserved.
@@ -784,24 +797,21 @@
784
797
  <!--begin::Script-->
785
798
  <!--begin::Third Party Plugin(OverlayScrollbars)-->
786
799
  <script
787
- src="https://cdn.jsdelivr.net/npm/overlayscrollbars@2.10.1/browser/overlayscrollbars.browser.es6.min.js"
788
- integrity="sha256-dghWARbRe2eLlIJ56wNB+b760ywulqK3DzZYEpsg2fQ="
800
+ src="https://cdn.jsdelivr.net/npm/overlayscrollbars@2.11.0/browser/overlayscrollbars.browser.es6.min.js"
789
801
  crossorigin="anonymous"
790
802
  ></script>
791
803
  <!--end::Third Party Plugin(OverlayScrollbars)--><!--begin::Required Plugin(popperjs for Bootstrap 5)-->
792
804
  <script
793
805
  src="https://cdn.jsdelivr.net/npm/@popperjs/core@2.11.8/dist/umd/popper.min.js"
794
- integrity="sha384-I7E8VVD/ismYTF4hNIPjVp/Zjvgyol6VFvRkX/vR+Vc4jQkC+hVqc2pM8ODewa9r"
795
806
  crossorigin="anonymous"
796
807
  ></script>
797
808
  <!--end::Required Plugin(popperjs for Bootstrap 5)--><!--begin::Required Plugin(Bootstrap 5)-->
798
809
  <script
799
- src="https://cdn.jsdelivr.net/npm/bootstrap@5.3.3/dist/js/bootstrap.min.js"
800
- integrity="sha384-0pUGZvbkm6XF6gxjEnlmuGrJXVbNuzT9qBBavbLwCsOGabYfZo0T0to5eqruptLy"
810
+ src="https://cdn.jsdelivr.net/npm/bootstrap@5.3.7/dist/js/bootstrap.min.js"
801
811
  crossorigin="anonymous"
802
812
  ></script>
803
813
  <!--end::Required Plugin(Bootstrap 5)--><!--begin::Required Plugin(AdminLTE)-->
804
- <script src="../../../dist/js/adminlte.js"></script>
814
+ <script src="../js/adminlte.js"></script>
805
815
  <!--end::Required Plugin(AdminLTE)--><!--begin::OverlayScrollbars Configure-->
806
816
  <script>
807
817
  const SELECTOR_SIDEBAR_WRAPPER = '.sidebar-wrapper';
@@ -812,7 +822,7 @@
812
822
  };
813
823
  document.addEventListener('DOMContentLoaded', function () {
814
824
  const sidebarWrapper = document.querySelector(SELECTOR_SIDEBAR_WRAPPER);
815
- if (sidebarWrapper && typeof OverlayScrollbarsGlobal?.OverlayScrollbars !== 'undefined') {
825
+ if (sidebarWrapper && OverlayScrollbarsGlobal?.OverlayScrollbars !== undefined) {
816
826
  OverlayScrollbarsGlobal.OverlayScrollbars(sidebarWrapper, {
817
827
  scrollbars: {
818
828
  theme: Default.scrollbarTheme,
@@ -823,7 +833,31 @@
823
833
  }
824
834
  });
825
835
  </script>
826
- <!--end::OverlayScrollbars Configure-->
836
+ <!--end::OverlayScrollbars Configure--><!-- Image path runtime fix -->
837
+ <script>
838
+ document.addEventListener('DOMContentLoaded', () => {
839
+ // Find the link tag for the main AdminLTE CSS file.
840
+ const cssLink = document.querySelector('link[href*="css/adminlte.css"]');
841
+ if (!cssLink) {
842
+ return; // Exit if the link isn't found
843
+ }
844
+
845
+ // Extract the base path from the CSS href.
846
+ // e.g., from "../css/adminlte.css", we get "../"
847
+ // e.g., from "./css/adminlte.css", we get "./"
848
+ const cssHref = cssLink.getAttribute('href');
849
+ const deploymentPath = cssHref.slice(0, cssHref.indexOf('css/adminlte.css'));
850
+
851
+ // Find all images with absolute paths and fix them.
852
+ document.querySelectorAll('img[src^="/assets/"]').forEach((img) => {
853
+ const originalSrc = img.getAttribute('src');
854
+ if (originalSrc) {
855
+ const relativeSrc = originalSrc.slice(1); // Remove leading '/'
856
+ img.src = deploymentPath + relativeSrc;
857
+ }
858
+ });
859
+ });
860
+ </script>
827
861
  <!--end::Script-->
828
862
  </body>
829
863
  <!--end::Body-->
@@ -4,45 +4,55 @@
4
4
  <head>
5
5
  <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
6
6
  <title>AdminLTE 4 | Lockscreen</title>
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-->
7
13
  <!--begin::Primary Meta Tags-->
8
- <meta name="viewport" content="width=device-width, initial-scale=1.0" />
9
14
  <meta name="title" content="AdminLTE 4 | Lockscreen" />
10
15
  <meta name="author" content="ColorlibHQ" />
11
16
  <meta
12
17
  name="description"
13
- content="AdminLTE is a Free Bootstrap 5 Admin Dashboard, 30 example pages using Vanilla JS."
18
+ content="AdminLTE is a Free Bootstrap 5 Admin Dashboard, 30 example pages using Vanilla JS. Fully accessible with WCAG 2.1 AA compliance."
14
19
  />
15
20
  <meta
16
21
  name="keywords"
17
- 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"
22
+ 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"
18
23
  />
19
24
  <!--end::Primary Meta Tags-->
25
+ <!--begin::Accessibility Features-->
26
+ <!-- Skip links will be dynamically added by accessibility.js -->
27
+ <meta name="supported-color-schemes" content="light dark" />
28
+ <link rel="preload" href="../css/adminlte.css" as="style" />
29
+ <!--end::Accessibility Features-->
20
30
  <!--begin::Fonts-->
21
31
  <link
22
32
  rel="stylesheet"
23
33
  href="https://cdn.jsdelivr.net/npm/@fontsource/source-sans-3@5.0.12/index.css"
24
34
  integrity="sha256-tXJfXfp6Ewt1ilPzLDtQnJV4hclT9XuaZUKyUvmyr+Q="
25
35
  crossorigin="anonymous"
36
+ media="print"
37
+ onload="this.media='all'"
26
38
  />
27
39
  <!--end::Fonts-->
28
40
  <!--begin::Third Party Plugin(OverlayScrollbars)-->
29
41
  <link
30
42
  rel="stylesheet"
31
- href="https://cdn.jsdelivr.net/npm/overlayscrollbars@2.10.1/styles/overlayscrollbars.min.css"
32
- integrity="sha256-tZHrRjVqNSRyWg2wbppGnT833E/Ys0DHWGwT04GiqQg="
43
+ href="https://cdn.jsdelivr.net/npm/overlayscrollbars@2.11.0/styles/overlayscrollbars.min.css"
33
44
  crossorigin="anonymous"
34
45
  />
35
46
  <!--end::Third Party Plugin(OverlayScrollbars)-->
36
47
  <!--begin::Third Party Plugin(Bootstrap Icons)-->
37
48
  <link
38
49
  rel="stylesheet"
39
- href="https://cdn.jsdelivr.net/npm/bootstrap-icons@1.11.3/font/bootstrap-icons.min.css"
40
- integrity="sha256-9kPW/n5nn53j4WMRYAxe9c1rCY96Oogo/MKSVdKzPmI="
50
+ href="https://cdn.jsdelivr.net/npm/bootstrap-icons@1.13.1/font/bootstrap-icons.min.css"
41
51
  crossorigin="anonymous"
42
52
  />
43
53
  <!--end::Third Party Plugin(Bootstrap Icons)-->
44
54
  <!--begin::Required Plugin(AdminLTE)-->
45
- <link rel="stylesheet" href="../../../dist/css/adminlte.css" />
55
+ <link rel="stylesheet" href="../css/adminlte.css" />
46
56
  <!--end::Required Plugin(AdminLTE)-->
47
57
  </head>
48
58
  <!--end::Head-->
@@ -55,7 +65,7 @@
55
65
  <div class="lockscreen-name">John Doe</div>
56
66
  <div class="lockscreen-item">
57
67
  <div class="lockscreen-image">
58
- <img src="../../../dist/assets/img/user1-128x128.jpg" alt="User Image" />
68
+ <img src="/assets/img/user1-128x128.jpg" alt="User Image" />
59
69
  </div>
60
70
  <form class="lockscreen-credentials">
61
71
  <div class="input-group">
@@ -73,7 +83,7 @@
73
83
  <a href="login.html" class="text-decoration-none">Or sign in as a different user</a>
74
84
  </div>
75
85
  <div class="lockscreen-footer text-center">
76
- Copyright © 2014-2024 &nbsp;
86
+ Copyright © 2014-2025 &nbsp;
77
87
  <b
78
88
  ><a
79
89
  href="https://adminlte.io"
@@ -87,24 +97,21 @@
87
97
  </div>
88
98
  <!--begin::Third Party Plugin(OverlayScrollbars)-->
89
99
  <script
90
- src="https://cdn.jsdelivr.net/npm/overlayscrollbars@2.10.1/browser/overlayscrollbars.browser.es6.min.js"
91
- integrity="sha256-dghWARbRe2eLlIJ56wNB+b760ywulqK3DzZYEpsg2fQ="
100
+ src="https://cdn.jsdelivr.net/npm/overlayscrollbars@2.11.0/browser/overlayscrollbars.browser.es6.min.js"
92
101
  crossorigin="anonymous"
93
102
  ></script>
94
103
  <!--end::Third Party Plugin(OverlayScrollbars)--><!--begin::Required Plugin(popperjs for Bootstrap 5)-->
95
104
  <script
96
105
  src="https://cdn.jsdelivr.net/npm/@popperjs/core@2.11.8/dist/umd/popper.min.js"
97
- integrity="sha384-I7E8VVD/ismYTF4hNIPjVp/Zjvgyol6VFvRkX/vR+Vc4jQkC+hVqc2pM8ODewa9r"
98
106
  crossorigin="anonymous"
99
107
  ></script>
100
108
  <!--end::Required Plugin(popperjs for Bootstrap 5)--><!--begin::Required Plugin(Bootstrap 5)-->
101
109
  <script
102
- src="https://cdn.jsdelivr.net/npm/bootstrap@5.3.3/dist/js/bootstrap.min.js"
103
- integrity="sha384-0pUGZvbkm6XF6gxjEnlmuGrJXVbNuzT9qBBavbLwCsOGabYfZo0T0to5eqruptLy"
110
+ src="https://cdn.jsdelivr.net/npm/bootstrap@5.3.7/dist/js/bootstrap.min.js"
104
111
  crossorigin="anonymous"
105
112
  ></script>
106
113
  <!--end::Required Plugin(Bootstrap 5)--><!--begin::Required Plugin(AdminLTE)-->
107
- <script src="undefined/js/adminlte.js"></script>
114
+ <script src="../js/adminlte.js"></script>
108
115
  <!--end::Required Plugin(AdminLTE)--><!--begin::OverlayScrollbars Configure-->
109
116
  <script>
110
117
  const SELECTOR_SIDEBAR_WRAPPER = '.sidebar-wrapper';
@@ -115,7 +122,7 @@
115
122
  };
116
123
  document.addEventListener('DOMContentLoaded', function () {
117
124
  const sidebarWrapper = document.querySelector(SELECTOR_SIDEBAR_WRAPPER);
118
- if (sidebarWrapper && typeof OverlayScrollbarsGlobal?.OverlayScrollbars !== 'undefined') {
125
+ if (sidebarWrapper && OverlayScrollbarsGlobal?.OverlayScrollbars !== undefined) {
119
126
  OverlayScrollbarsGlobal.OverlayScrollbars(sidebarWrapper, {
120
127
  scrollbars: {
121
128
  theme: Default.scrollbarTheme,
@@ -126,7 +133,31 @@
126
133
  }
127
134
  });
128
135
  </script>
129
- <!--end::OverlayScrollbars Configure-->
136
+ <!--end::OverlayScrollbars Configure--><!-- Image path runtime fix -->
137
+ <script>
138
+ document.addEventListener('DOMContentLoaded', () => {
139
+ // Find the link tag for the main AdminLTE CSS file.
140
+ const cssLink = document.querySelector('link[href*="css/adminlte.css"]');
141
+ if (!cssLink) {
142
+ return; // Exit if the link isn't found
143
+ }
144
+
145
+ // Extract the base path from the CSS href.
146
+ // e.g., from "../css/adminlte.css", we get "../"
147
+ // e.g., from "./css/adminlte.css", we get "./"
148
+ const cssHref = cssLink.getAttribute('href');
149
+ const deploymentPath = cssHref.slice(0, cssHref.indexOf('css/adminlte.css'));
150
+
151
+ // Find all images with absolute paths and fix them.
152
+ document.querySelectorAll('img[src^="/assets/"]').forEach((img) => {
153
+ const originalSrc = img.getAttribute('src');
154
+ if (originalSrc) {
155
+ const relativeSrc = originalSrc.slice(1); // Remove leading '/'
156
+ img.src = deploymentPath + relativeSrc;
157
+ }
158
+ });
159
+ });
160
+ </script>
130
161
  </body>
131
162
  <!--end::Body-->
132
163
  </html>