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
@@ -78,11 +78,18 @@
78
78
  <i class="bi bi-list"></i>
79
79
  </a>
80
80
  </li>
81
+
81
82
  <li class="nav-item d-none d-md-block">
82
- <a href="#" class="nav-link">Home</a>
83
+ <a href="../index.html" class="nav-link">
84
+ <i class="bi bi-grid-1x2 me-1" aria-hidden="true"></i>
85
+ Live preview
86
+ </a>
83
87
  </li>
84
88
  <li class="nav-item d-none d-md-block">
85
- <a href="#" class="nav-link">Contact</a>
89
+ <a href="../docs/introduction.html" class="nav-link">
90
+ <i class="bi bi-book me-1" aria-hidden="true"></i>
91
+ Documentation
92
+ </a>
86
93
  </li>
87
94
  </ul>
88
95
  <!--end::Start Navbar Links-->
@@ -220,11 +227,70 @@
220
227
  <li class="nav-item">
221
228
  <a class="nav-link" href="#" data-lte-toggle="fullscreen">
222
229
  <i data-lte-icon="maximize" class="bi bi-arrows-fullscreen"></i>
223
- <i data-lte-icon="minimize" class="bi bi-fullscreen-exit" style="display: none"></i>
230
+ <i data-lte-icon="minimize" class="bi bi-fullscreen-exit d-none"></i>
224
231
  </a>
225
232
  </li>
226
233
  <!--end::Fullscreen Toggle-->
227
234
 
235
+ <!--begin::Color Mode Toggle (#6010)-->
236
+ <li class="nav-item dropdown">
237
+ <a
238
+ class="nav-link"
239
+ href="#"
240
+ id="bd-theme"
241
+ aria-label="Toggle color scheme"
242
+ data-bs-toggle="dropdown"
243
+ aria-expanded="false"
244
+ >
245
+ <i class="bi bi-sun-fill" data-lte-theme-icon="light"></i>
246
+ <i class="bi bi-moon-fill d-none" data-lte-theme-icon="dark"></i>
247
+ <i class="bi bi-circle-half d-none" data-lte-theme-icon="auto"></i>
248
+ </a>
249
+ <ul
250
+ class="dropdown-menu dropdown-menu-end"
251
+ aria-labelledby="bd-theme"
252
+ style="--bs-dropdown-min-width: 8rem"
253
+ >
254
+ <li>
255
+ <button
256
+ type="button"
257
+ class="dropdown-item d-flex align-items-center"
258
+ data-bs-theme-value="light"
259
+ aria-pressed="false"
260
+ >
261
+ <i class="bi bi-sun-fill me-2"></i>
262
+ Light
263
+ <i class="bi bi-check-lg ms-auto d-none"></i>
264
+ </button>
265
+ </li>
266
+ <li>
267
+ <button
268
+ type="button"
269
+ class="dropdown-item d-flex align-items-center"
270
+ data-bs-theme-value="dark"
271
+ aria-pressed="false"
272
+ >
273
+ <i class="bi bi-moon-fill me-2"></i>
274
+ Dark
275
+ <i class="bi bi-check-lg ms-auto d-none"></i>
276
+ </button>
277
+ </li>
278
+ <li>
279
+ <button
280
+ type="button"
281
+ class="dropdown-item d-flex align-items-center active"
282
+ data-bs-theme-value="auto"
283
+ aria-pressed="true"
284
+ >
285
+ <i class="bi bi-circle-half me-2"></i>
286
+ Auto
287
+ <i class="bi bi-check-lg ms-auto d-none"></i>
288
+ </button>
289
+ </li>
290
+ </ul>
291
+ </li>
292
+ <!--end::Color Mode Toggle-->
293
+
228
294
  <!--begin::User Menu Dropdown-->
229
295
  <li class="nav-item dropdown user-menu">
230
296
  <a href="#" class="nav-link dropdown-toggle" data-bs-toggle="dropdown">
@@ -382,7 +448,7 @@
382
448
  <i class="nav-icon bi bi-clipboard-fill"></i>
383
449
  <p>
384
450
  Layout Options
385
- <span class="nav-badge badge text-bg-secondary me-3">6</span>
451
+ <span class="nav-badge badge text-bg-secondary me-3">7</span>
386
452
  <i class="nav-arrow bi bi-chevron-right"></i>
387
453
  </p>
388
454
  </a>
@@ -435,6 +501,12 @@
435
501
  <p>Sidebar Mini <small>+ Collapsed</small></p>
436
502
  </a>
437
503
  </li>
504
+ <li class="nav-item">
505
+ <a href="../layout/collapsed-sidebar-without-hover.html" class="nav-link">
506
+ <i class="nav-icon bi bi-circle"></i>
507
+ <p>Sidebar Mini <small>+ Collapsed + No Hover</small></p>
508
+ </a>
509
+ </li>
438
510
  <li class="nav-item">
439
511
  <a href="../layout/logo-switch.html" class="nav-link">
440
512
  <i class="nav-icon bi bi-circle"></i>
@@ -478,6 +550,36 @@
478
550
  </li>
479
551
  </ul>
480
552
  </li>
553
+ <li class="nav-item">
554
+ <a href="#" class="nav-link">
555
+ <i class="nav-icon bi bi-envelope"></i>
556
+ <p>
557
+ Mailbox
558
+ <i class="nav-arrow bi bi-chevron-right"></i>
559
+ </p>
560
+ </a>
561
+ <ul class="nav nav-treeview">
562
+ <li class="nav-item">
563
+ <a href="../mailbox/inbox.html" class="nav-link">
564
+ <i class="nav-icon bi bi-circle"></i>
565
+ <p>Inbox</p>
566
+ </a>
567
+ </li>
568
+ <li class="nav-item">
569
+ <a href="../mailbox/read.html" class="nav-link">
570
+ <i class="nav-icon bi bi-circle"></i>
571
+ <p>Read Message</p>
572
+ </a>
573
+ </li>
574
+ <li class="nav-item">
575
+ <a href="../mailbox/compose.html" class="nav-link">
576
+ <i class="nav-icon bi bi-circle"></i>
577
+ <p>Compose</p>
578
+ </a>
579
+ </li>
580
+ </ul>
581
+ </li>
582
+
481
583
  <li class="nav-item">
482
584
  <a href="#" class="nav-link">
483
585
  <i class="nav-icon bi bi-pencil-square"></i>
@@ -488,9 +590,27 @@
488
590
  </a>
489
591
  <ul class="nav nav-treeview">
490
592
  <li class="nav-item">
491
- <a href="../forms/general.html" class="nav-link">
593
+ <a href="../forms/elements.html" class="nav-link">
594
+ <i class="nav-icon bi bi-circle"></i>
595
+ <p>Elements</p>
596
+ </a>
597
+ </li>
598
+ <li class="nav-item">
599
+ <a href="../forms/layout.html" class="nav-link">
492
600
  <i class="nav-icon bi bi-circle"></i>
493
- <p>General Elements</p>
601
+ <p>Layout</p>
602
+ </a>
603
+ </li>
604
+ <li class="nav-item">
605
+ <a href="../forms/validation.html" class="nav-link">
606
+ <i class="nav-icon bi bi-circle"></i>
607
+ <p>Validation</p>
608
+ </a>
609
+ </li>
610
+ <li class="nav-item">
611
+ <a href="../forms/wizard.html" class="nav-link">
612
+ <i class="nav-icon bi bi-circle"></i>
613
+ <p>Wizard</p>
494
614
  </a>
495
615
  </li>
496
616
  </ul>
@@ -510,6 +630,114 @@
510
630
  <p>Simple Tables</p>
511
631
  </a>
512
632
  </li>
633
+ <li class="nav-item">
634
+ <a href="../tables/data.html" class="nav-link">
635
+ <i class="nav-icon bi bi-circle"></i>
636
+ <p>Data Tables</p>
637
+ </a>
638
+ </li>
639
+ </ul>
640
+ </li>
641
+
642
+ <li class="nav-header">PAGES</li>
643
+ <li class="nav-item">
644
+ <a href="#" class="nav-link">
645
+ <i class="nav-icon bi bi-file-earmark-text"></i>
646
+ <p>
647
+ Pages
648
+ <i class="nav-arrow bi bi-chevron-right"></i>
649
+ </p>
650
+ </a>
651
+ <ul class="nav nav-treeview">
652
+ <li class="nav-item">
653
+ <a href="../pages/profile.html" class="nav-link">
654
+ <i class="nav-icon bi bi-circle"></i>
655
+ <p>Profile</p>
656
+ </a>
657
+ </li>
658
+ <li class="nav-item">
659
+ <a href="../pages/settings.html" class="nav-link">
660
+ <i class="nav-icon bi bi-circle"></i>
661
+ <p>Settings</p>
662
+ </a>
663
+ </li>
664
+ <li class="nav-item">
665
+ <a href="../pages/invoice.html" class="nav-link">
666
+ <i class="nav-icon bi bi-circle"></i>
667
+ <p>Invoice</p>
668
+ </a>
669
+ </li>
670
+ <li class="nav-item">
671
+ <a href="../pages/calendar.html" class="nav-link">
672
+ <i class="nav-icon bi bi-circle"></i>
673
+ <p>Calendar</p>
674
+ </a>
675
+ </li>
676
+ <li class="nav-item">
677
+ <a href="../pages/kanban.html" class="nav-link">
678
+ <i class="nav-icon bi bi-circle"></i>
679
+ <p>Kanban</p>
680
+ </a>
681
+ </li>
682
+ <li class="nav-item">
683
+ <a href="../pages/chat.html" class="nav-link">
684
+ <i class="nav-icon bi bi-circle"></i>
685
+ <p>Chat</p>
686
+ </a>
687
+ </li>
688
+ <li class="nav-item">
689
+ <a href="../pages/file-manager.html" class="nav-link">
690
+ <i class="nav-icon bi bi-circle"></i>
691
+ <p>File Manager</p>
692
+ </a>
693
+ </li>
694
+ <li class="nav-item">
695
+ <a href="../pages/projects.html" class="nav-link">
696
+ <i class="nav-icon bi bi-circle"></i>
697
+ <p>Projects</p>
698
+ </a>
699
+ </li>
700
+ <li class="nav-item">
701
+ <a href="../pages/pricing.html" class="nav-link">
702
+ <i class="nav-icon bi bi-circle"></i>
703
+ <p>Pricing</p>
704
+ </a>
705
+ </li>
706
+ <li class="nav-item">
707
+ <a href="../pages/faq.html" class="nav-link">
708
+ <i class="nav-icon bi bi-circle"></i>
709
+ <p>FAQ</p>
710
+ </a>
711
+ </li>
712
+ <li class="nav-item">
713
+ <a href="#" class="nav-link">
714
+ <i class="nav-icon bi bi-circle"></i>
715
+ <p>
716
+ Error
717
+ <i class="nav-arrow bi bi-chevron-right"></i>
718
+ </p>
719
+ </a>
720
+ <ul class="nav nav-treeview">
721
+ <li class="nav-item">
722
+ <a href="../pages/404.html" class="nav-link">
723
+ <i class="nav-icon bi bi-circle"></i>
724
+ <p>404</p>
725
+ </a>
726
+ </li>
727
+ <li class="nav-item">
728
+ <a href="../pages/500.html" class="nav-link">
729
+ <i class="nav-icon bi bi-circle"></i>
730
+ <p>500</p>
731
+ </a>
732
+ </li>
733
+ <li class="nav-item">
734
+ <a href="../pages/maintenance.html" class="nav-link">
735
+ <i class="nav-icon bi bi-circle"></i>
736
+ <p>Maintenance</p>
737
+ </a>
738
+ </li>
739
+ </ul>
740
+ </li>
513
741
  </ul>
514
742
  </li>
515
743
 
@@ -578,90 +806,6 @@
578
806
  </ul>
579
807
  </li>
580
808
 
581
- <li class="nav-header">DOCUMENTATIONS</li>
582
- <li class="nav-item">
583
- <a href="../docs/introduction.html" class="nav-link">
584
- <i class="nav-icon bi bi-download"></i>
585
- <p>Installation</p>
586
- </a>
587
- </li>
588
- <li class="nav-item">
589
- <a href="../docs/layout.html" class="nav-link">
590
- <i class="nav-icon bi bi-grip-horizontal"></i>
591
- <p>Layout</p>
592
- </a>
593
- </li>
594
- <li class="nav-item">
595
- <a href="../docs/color-mode.html" class="nav-link">
596
- <i class="nav-icon bi bi-star-half"></i>
597
- <p>Color Mode</p>
598
- </a>
599
- </li>
600
- <li class="nav-item">
601
- <a href="#" class="nav-link">
602
- <i class="nav-icon bi bi-ui-checks-grid"></i>
603
- <p>
604
- Components
605
- <i class="nav-arrow bi bi-chevron-right"></i>
606
- </p>
607
- </a>
608
- <ul class="nav nav-treeview">
609
- <li class="nav-item">
610
- <a href="../docs/components/main-header.html" class="nav-link">
611
- <i class="nav-icon bi bi-circle"></i>
612
- <p>Main Header</p>
613
- </a>
614
- </li>
615
- <li class="nav-item">
616
- <a href="../docs/components/main-sidebar.html" class="nav-link">
617
- <i class="nav-icon bi bi-circle"></i>
618
- <p>Main Sidebar</p>
619
- </a>
620
- </li>
621
- </ul>
622
- </li>
623
- <li class="nav-item">
624
- <a href="#" class="nav-link">
625
- <i class="nav-icon bi bi-filetype-js"></i>
626
- <p>
627
- Javascript
628
- <i class="nav-arrow bi bi-chevron-right"></i>
629
- </p>
630
- </a>
631
- <ul class="nav nav-treeview">
632
- <li class="nav-item">
633
- <a href="../docs/javascript/treeview.html" class="nav-link">
634
- <i class="nav-icon bi bi-circle"></i>
635
- <p>Treeview</p>
636
- </a>
637
- </li>
638
- </ul>
639
- </li>
640
- <li class="nav-item">
641
- <a href="../docs/browser-support.html" class="nav-link">
642
- <i class="nav-icon bi bi-browser-edge"></i>
643
- <p>Browser Support</p>
644
- </a>
645
- </li>
646
- <li class="nav-item">
647
- <a href="../docs/how-to-contribute.html" class="nav-link">
648
- <i class="nav-icon bi bi-hand-thumbs-up-fill"></i>
649
- <p>How To Contribute</p>
650
- </a>
651
- </li>
652
- <li class="nav-item">
653
- <a href="../docs/faq.html" class="nav-link">
654
- <i class="nav-icon bi bi-question-circle-fill"></i>
655
- <p>FAQ</p>
656
- </a>
657
- </li>
658
- <li class="nav-item">
659
- <a href="../docs/license.html" class="nav-link">
660
- <i class="nav-icon bi bi-patch-check-fill"></i>
661
- <p>License</p>
662
- </a>
663
- </li>
664
-
665
809
  <li class="nav-header">MULTI LEVEL EXAMPLE</li>
666
810
  <li class="nav-item">
667
811
  <a href="#" class="nav-link">
@@ -749,6 +893,17 @@
749
893
  </li>
750
894
  </ul>
751
895
  <!--end::Sidebar Menu-->
896
+
897
+ <!-- Docs CTA (bottom of sidebar) -->
898
+ <div class="p-3 mt-3 border-top border-secondary border-opacity-25">
899
+ <a
900
+ href="../docs/introduction.html"
901
+ class="btn btn-sm btn-outline-light w-100 d-flex align-items-center justify-content-center gap-2"
902
+ >
903
+ <i class="bi bi-book" aria-hidden="true"></i>
904
+ View documentation
905
+ </a>
906
+ </div>
752
907
  </nav>
753
908
  </div>
754
909
  <!--end::Sidebar Wrapper-->
@@ -919,7 +1074,7 @@
919
1074
  <!--end::To the end-->
920
1075
  <!--begin::Copyright-->
921
1076
  <strong>
922
- Copyright &copy; 2014-2025&nbsp;
1077
+ Copyright &copy; 2014-2026&nbsp;
923
1078
  <a href="https://adminlte.io" class="text-decoration-none">AdminLTE.io</a>.
924
1079
  </strong>
925
1080
  All rights reserved.
@@ -975,7 +1130,71 @@
975
1130
  }
976
1131
  });
977
1132
  </script>
978
- <!--end::OverlayScrollbars Configure-->
1133
+ <!--end::OverlayScrollbars Configure--><!--begin::Color Mode Toggle (#6010)-->
1134
+ <script>
1135
+ (() => {
1136
+ 'use strict';
1137
+
1138
+ const STORAGE_KEY = 'lte-theme';
1139
+
1140
+ const getStoredTheme = () => localStorage.getItem(STORAGE_KEY);
1141
+ const setStoredTheme = (theme) => localStorage.setItem(STORAGE_KEY, theme);
1142
+
1143
+ const prefersDark = () => globalThis.matchMedia('(prefers-color-scheme: dark)').matches;
1144
+
1145
+ const getPreferredTheme = () => {
1146
+ const stored = getStoredTheme();
1147
+ if (stored) return stored;
1148
+ return prefersDark() ? 'dark' : 'light';
1149
+ };
1150
+
1151
+ const setTheme = (theme) => {
1152
+ const resolved = theme === 'auto' ? (prefersDark() ? 'dark' : 'light') : theme;
1153
+ document.documentElement.setAttribute('data-bs-theme', resolved);
1154
+ };
1155
+
1156
+ setTheme(getPreferredTheme());
1157
+
1158
+ const showActiveTheme = (theme) => {
1159
+ // Highlight the active dropdown option
1160
+ document.querySelectorAll('[data-bs-theme-value]').forEach((el) => {
1161
+ el.classList.remove('active');
1162
+ el.setAttribute('aria-pressed', 'false');
1163
+ const check = el.querySelector('.bi-check-lg');
1164
+ if (check) check.classList.add('d-none');
1165
+ });
1166
+ const active = document.querySelector(`[data-bs-theme-value="${theme}"]`);
1167
+ if (active) {
1168
+ active.classList.add('active');
1169
+ active.setAttribute('aria-pressed', 'true');
1170
+ const check = active.querySelector('.bi-check-lg');
1171
+ if (check) check.classList.remove('d-none');
1172
+ }
1173
+ // Sync the topbar trigger icon
1174
+ document.querySelectorAll('[data-lte-theme-icon]').forEach((icon) => {
1175
+ icon.classList.toggle('d-none', icon.dataset.lteThemeIcon !== theme);
1176
+ });
1177
+ };
1178
+
1179
+ globalThis.matchMedia('(prefers-color-scheme: dark)').addEventListener('change', () => {
1180
+ const stored = getStoredTheme();
1181
+ if (!stored || stored === 'auto') setTheme(getPreferredTheme());
1182
+ });
1183
+
1184
+ document.addEventListener('DOMContentLoaded', () => {
1185
+ showActiveTheme(getPreferredTheme());
1186
+ document.querySelectorAll('[data-bs-theme-value]').forEach((toggle) => {
1187
+ toggle.addEventListener('click', () => {
1188
+ const theme = toggle.getAttribute('data-bs-theme-value');
1189
+ setStoredTheme(theme);
1190
+ setTheme(theme);
1191
+ showActiveTheme(theme);
1192
+ });
1193
+ });
1194
+ });
1195
+ })();
1196
+ </script>
1197
+ <!--end::Color Mode Toggle-->
979
1198
  <!--end::Script-->
980
1199
  </body>
981
1200
  <!--end::Body-->
package/netlify.toml ADDED
@@ -0,0 +1,16 @@
1
+ # Netlify deploy configuration for adminlte-v4.netlify.app
2
+ #
3
+ # The dist/ folder is committed to the repo (see "rebuild dist" commits),
4
+ # so the production deploy just publishes those static files. This avoids
5
+ # running npm install on Netlify, which has been failing since rc7 due to
6
+ # a Node version drift between Netlify's default and the Node 22 used in
7
+ # CI (see .github/workflows/*).
8
+
9
+ [build]
10
+ publish = "dist"
11
+ command = "echo 'Static deploy of committed dist/'"
12
+
13
+ [build.environment]
14
+ # Match the Node version used in GitHub Actions so any future build
15
+ # command (eg. `npm run docs-compile`) resolves dependencies correctly.
16
+ NODE_VERSION = "22"
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "admin-lte",
3
3
  "description": "Responsive open source admin dashboard and control panel.",
4
- "version": "4.0.0-rc6",
4
+ "version": "4.0.0",
5
5
  "type": "module",
6
6
  "license": "MIT",
7
7
  "author": "Colorlib <https://colorlib.com>",
@@ -29,7 +29,7 @@
29
29
  "docs-format": "prettier --write \"dist/**/*.html\"",
30
30
  "docs-serve": "npm run copy-assets && astro --config src/config/astro.config.mjs dev --open --port 3000",
31
31
  "copy-assets": "rimraf src/html/public && shx mkdir -p src/html/public && shx cp -r dist/css dist/js dist/assets src/html/public/",
32
- "flatten-build": "shx cp -r dist/html/* dist/ && shx rm -rf dist/html && shx rm -rf dist/.astro",
32
+ "flatten-build": "shx cp -r dist/html/* dist/ && shx rm -rf dist/html && shx rm -rf dist/.astro && shx mkdir -p dist/docs && shx mv dist/docs.html dist/docs/index.html",
33
33
  "assets": "node src/config/assets.config.mjs",
34
34
  "lint": "npm-run-all --aggregate-output --continue-on-error --parallel js-lint css-lint docs-lint lockfile-lint",
35
35
  "clean": "rimraf dist",
@@ -62,42 +62,48 @@
62
62
  "bugs": {
63
63
  "url": "https://github.com/ColorlibHQ/AdminLTE/issues"
64
64
  },
65
+ "overrides": {
66
+ "stylelint-config-twbs-bootstrap": {
67
+ "stylelint": "$stylelint"
68
+ },
69
+ "yaml": "^2.9.0"
70
+ },
65
71
  "devDependencies": {
66
- "@astrojs/check": "^0.9.6",
67
- "@astrojs/mdx": "^4.3.12",
72
+ "@astrojs/check": "^0.9.9",
73
+ "@astrojs/mdx": "^5.0.6",
74
+ "@eslint/js": "^10.0.1",
68
75
  "@rollup/plugin-typescript": "^12.3.0",
69
- "@typescript-eslint/eslint-plugin": "^8.48.1",
70
- "@typescript-eslint/parser": "^8.48.1",
71
- "astro": "^5.16.4",
72
- "autoprefixer": "^10.4.22",
76
+ "@typescript-eslint/eslint-plugin": "^8.59.3",
77
+ "@typescript-eslint/parser": "^8.59.3",
78
+ "astro": "^6.3.3",
79
+ "autoprefixer": "^10.5.0",
73
80
  "bootstrap": "^5.3.8",
74
- "bundlewatch": "^0.4.1",
81
+ "bundlewatch": "^0.4.2",
75
82
  "clean-css-cli": "^5.6.3",
76
83
  "concurrently": "^9.2.1",
77
84
  "cross-env": "^10.1.0",
78
- "eslint": "^9.39.1",
79
- "eslint-config-xo": "^0.49.0",
80
- "eslint-config-xo-typescript": "^9.0.0",
81
- "eslint-plugin-astro": "^1.5.0",
82
- "eslint-plugin-import": "^2.32.0",
83
- "eslint-plugin-unicorn": "^62.0.0",
84
- "fs-extra": "^11.3.2",
85
- "lockfile-lint": "^4.14.1",
86
- "nodemon": "^3.1.11",
85
+ "eslint": "^10.4.0",
86
+ "eslint-plugin-astro": "^1.7.0",
87
+ "eslint-plugin-unicorn": "^64.0.0",
88
+ "fs-extra": "^11.3.5",
89
+ "globals": "^17.6.0",
90
+ "lockfile-lint": "^5.0.0",
91
+ "nodemon": "^3.1.14",
87
92
  "npm-run-all": "^4.1.5",
88
- "postcss": "^8.5.6",
93
+ "postcss": "^8.5.14",
89
94
  "postcss-cli": "^11.0.1",
90
- "prettier": "^3.7.4",
95
+ "prettier": "^3.8.3",
91
96
  "prettier-plugin-astro": "^0.14.1",
92
- "rimraf": "^6.1.2",
93
- "rollup": "^4.53.3",
97
+ "rimraf": "^6.1.3",
98
+ "rollup": "^4.60.4",
94
99
  "rtlcss": "^4.3.0",
95
- "sass": "^1.94.2",
100
+ "sass": "^1.99.0",
96
101
  "shx": "^0.4.0",
97
- "stylelint": "^16.26.1",
102
+ "stylelint": "^17.11.1",
98
103
  "stylelint-config-twbs-bootstrap": "^16.1.0",
99
- "terser": "^5.44.1",
104
+ "terser": "^5.47.1",
100
105
  "tslib": "^2.8.1",
101
- "typescript": "^5.9.3"
106
+ "typescript": "^6.0.3",
107
+ "typescript-eslint": "^8.59.3"
102
108
  }
103
109
  }
@@ -290,4 +290,48 @@ fieldset {
290
290
  font-size: .8em;
291
291
  content: " (" attr(href) ")";
292
292
  }
293
+
294
+ /* Print Layout Fix - Ensure sidebar and main content are both visible */
295
+ .app-wrapper {
296
+ display: grid !important;
297
+ grid-template-rows: auto 1fr auto !important;
298
+ grid-template-columns: auto 1fr !important;
299
+ }
300
+
301
+ .sidebar-overlay {
302
+ display: none !important;
303
+ }
304
+
305
+ .app-sidebar {
306
+ position: static !important;
307
+ display: block !important;
308
+ min-width: 200px !important;
309
+ max-width: 200px !important;
310
+ max-height: none !important;
311
+ margin-left: 0 !important;
312
+ overflow: visible !important;
313
+ }
314
+
315
+ .sidebar-wrapper {
316
+ height: auto !important;
317
+ overflow: visible !important;
318
+ }
319
+
320
+ .app-header {
321
+ position: static !important;
322
+ }
323
+
324
+ .app-main {
325
+ width: auto !important;
326
+ max-width: 100% !important;
327
+ overflow: visible !important;
328
+ }
329
+
330
+ .app-content {
331
+ overflow: visible !important;
332
+ }
333
+
334
+ .app-footer {
335
+ position: static !important;
336
+ }
293
337
  }
@@ -20,4 +20,13 @@
20
20
  bottom: 0;
21
21
  z-index: $lte-zindex-fixed-footer;
22
22
  }
23
+
24
+ // When layout-fixed is used, app-main has overflow: auto which prevents
25
+ // position: sticky from working on the footer. Ensure the grid keeps the
26
+ // footer pinned at the bottom while app-main scrolls independently.
27
+ &.layout-fixed {
28
+ .app-main {
29
+ min-height: 0;
30
+ }
31
+ }
23
32
  }