admin-lte 4.0.0-rc7 → 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 (102) hide show
  1. package/CHANGELOG.md +48 -0
  2. package/README.md +43 -17
  3. package/dist/UI/general.html +303 -126
  4. package/dist/UI/icons.html +303 -126
  5. package/dist/UI/timeline.html +303 -126
  6. package/dist/css/adminlte.css +2798 -1167
  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 +2798 -1167
  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 +261 -397
  15. package/dist/docs/color-mode.html +242 -382
  16. package/dist/docs/components/main-header.html +238 -374
  17. package/dist/docs/components/main-sidebar.html +253 -389
  18. package/dist/docs/customization.html +1056 -0
  19. package/dist/docs/deployment.html +1121 -0
  20. package/dist/docs/faq.html +857 -409
  21. package/dist/docs/getting-started.html +967 -0
  22. package/dist/docs/how-to-contribute.html +335 -462
  23. package/dist/docs/index.html +16 -0
  24. package/dist/docs/integrations.html +1207 -0
  25. package/dist/docs/introduction.html +453 -446
  26. package/dist/docs/javascript/accessibility.html +361 -491
  27. package/dist/docs/javascript/card-widget.html +446 -450
  28. package/dist/docs/javascript/direct-chat.html +324 -421
  29. package/dist/docs/javascript/fullscreen.html +348 -416
  30. package/dist/docs/javascript/layout.html +345 -436
  31. package/dist/docs/javascript/plugins-overview.html +1120 -0
  32. package/dist/docs/javascript/pushmenu.html +485 -492
  33. package/dist/docs/javascript/treeview.html +466 -400
  34. package/dist/docs/layout-blueprint.html +1063 -0
  35. package/dist/docs/layout.html +287 -415
  36. package/dist/docs/license.html +252 -387
  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 +65 -1
  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/{general.html → elements.html} +489 -463
  46. package/dist/forms/layout.html +1243 -0
  47. package/dist/forms/validation.html +1251 -0
  48. package/dist/forms/wizard.html +1386 -0
  49. package/dist/generate/theme.html +134 -4
  50. package/dist/index.html +303 -126
  51. package/dist/index2.html +306 -126
  52. package/dist/index3.html +303 -126
  53. package/dist/js/adminlte.js +5 -5
  54. package/dist/js/adminlte.js.map +1 -1
  55. package/dist/js/adminlte.min.js +2 -2
  56. package/dist/js/adminlte.min.js.map +1 -1
  57. package/dist/layout/collapsed-sidebar-without-hover.html +303 -126
  58. package/dist/layout/collapsed-sidebar.html +303 -126
  59. package/dist/layout/fixed-complete.html +303 -126
  60. package/dist/layout/fixed-footer.html +303 -126
  61. package/dist/layout/fixed-header.html +303 -126
  62. package/dist/layout/fixed-sidebar.html +303 -126
  63. package/dist/layout/layout-custom-area.html +303 -126
  64. package/dist/layout/layout-rtl.html +303 -126
  65. package/dist/layout/logo-switch.html +134 -4
  66. package/dist/layout/sidebar-mini.html +303 -126
  67. package/dist/layout/unfixed-sidebar.html +303 -126
  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 +303 -126
  86. package/dist/widgets/cards.html +303 -126
  87. package/dist/widgets/info-box.html +303 -126
  88. package/dist/widgets/small-box.html +303 -126
  89. package/netlify.toml +16 -0
  90. package/package.json +29 -23
  91. package/src/scss/_app-header.scss +27 -0
  92. package/src/scss/_app-sidebar.scss +24 -30
  93. package/src/scss/_bootstrap-variables.scss +11 -4
  94. package/src/scss/_docs.scss +816 -0
  95. package/src/scss/_table.scss +4 -4
  96. package/src/scss/adminlte.scss +4 -1
  97. package/src/ts/adminlte.ts +1 -1
  98. package/src/ts/fullscreen.ts +8 -4
  99. package/src/ts/push-menu.ts +66 -5
  100. package/.claude/settings.local.json +0 -37
  101. package/CLAUDE.md +0 -79
  102. package/release.md +0 -75
@@ -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">
@@ -484,6 +550,36 @@
484
550
  </li>
485
551
  </ul>
486
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
+
487
583
  <li class="nav-item">
488
584
  <a href="#" class="nav-link">
489
585
  <i class="nav-icon bi bi-pencil-square"></i>
@@ -494,9 +590,27 @@
494
590
  </a>
495
591
  <ul class="nav nav-treeview">
496
592
  <li class="nav-item">
497
- <a href="../forms/general.html" class="nav-link">
593
+ <a href="../forms/elements.html" class="nav-link">
498
594
  <i class="nav-icon bi bi-circle"></i>
499
- <p>General Elements</p>
595
+ <p>Elements</p>
596
+ </a>
597
+ </li>
598
+ <li class="nav-item">
599
+ <a href="../forms/layout.html" class="nav-link">
600
+ <i class="nav-icon bi bi-circle"></i>
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>
500
614
  </a>
501
615
  </li>
502
616
  </ul>
@@ -516,6 +630,114 @@
516
630
  <p>Simple Tables</p>
517
631
  </a>
518
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>
519
741
  </ul>
520
742
  </li>
521
743
 
@@ -584,126 +806,6 @@
584
806
  </ul>
585
807
  </li>
586
808
 
587
- <li class="nav-header">DOCUMENTATIONS</li>
588
- <li class="nav-item">
589
- <a href="../docs/introduction.html" class="nav-link">
590
- <i class="nav-icon bi bi-download"></i>
591
- <p>Installation</p>
592
- </a>
593
- </li>
594
- <li class="nav-item">
595
- <a href="../docs/layout.html" class="nav-link">
596
- <i class="nav-icon bi bi-grip-horizontal"></i>
597
- <p>Layout</p>
598
- </a>
599
- </li>
600
- <li class="nav-item">
601
- <a href="../docs/color-mode.html" class="nav-link">
602
- <i class="nav-icon bi bi-star-half"></i>
603
- <p>Color Mode</p>
604
- </a>
605
- </li>
606
- <li class="nav-item">
607
- <a href="#" class="nav-link">
608
- <i class="nav-icon bi bi-ui-checks-grid"></i>
609
- <p>
610
- Components
611
- <i class="nav-arrow bi bi-chevron-right"></i>
612
- </p>
613
- </a>
614
- <ul class="nav nav-treeview">
615
- <li class="nav-item">
616
- <a href="../docs/components/main-header.html" class="nav-link">
617
- <i class="nav-icon bi bi-circle"></i>
618
- <p>Main Header</p>
619
- </a>
620
- </li>
621
- <li class="nav-item">
622
- <a href="../docs/components/main-sidebar.html" class="nav-link">
623
- <i class="nav-icon bi bi-circle"></i>
624
- <p>Main Sidebar</p>
625
- </a>
626
- </li>
627
- </ul>
628
- </li>
629
- <li class="nav-item">
630
- <a href="#" class="nav-link">
631
- <i class="nav-icon bi bi-filetype-js"></i>
632
- <p>
633
- Javascript
634
- <i class="nav-arrow bi bi-chevron-right"></i>
635
- </p>
636
- </a>
637
- <ul class="nav nav-treeview">
638
- <li class="nav-item">
639
- <a href="../docs/javascript/layout.html" class="nav-link">
640
- <i class="nav-icon bi bi-circle"></i>
641
- <p>Layout</p>
642
- </a>
643
- </li>
644
- <li class="nav-item">
645
- <a href="../docs/javascript/pushmenu.html" class="nav-link">
646
- <i class="nav-icon bi bi-circle"></i>
647
- <p>PushMenu</p>
648
- </a>
649
- </li>
650
- <li class="nav-item">
651
- <a href="../docs/javascript/treeview.html" class="nav-link">
652
- <i class="nav-icon bi bi-circle"></i>
653
- <p>Treeview</p>
654
- </a>
655
- </li>
656
- <li class="nav-item">
657
- <a href="../docs/javascript/card-widget.html" class="nav-link">
658
- <i class="nav-icon bi bi-circle"></i>
659
- <p>Card Widget</p>
660
- </a>
661
- </li>
662
- <li class="nav-item">
663
- <a href="../docs/javascript/direct-chat.html" class="nav-link">
664
- <i class="nav-icon bi bi-circle"></i>
665
- <p>Direct Chat</p>
666
- </a>
667
- </li>
668
- <li class="nav-item">
669
- <a href="../docs/javascript/fullscreen.html" class="nav-link">
670
- <i class="nav-icon bi bi-circle"></i>
671
- <p>Fullscreen</p>
672
- </a>
673
- </li>
674
- <li class="nav-item">
675
- <a href="../docs/javascript/accessibility.html" class="nav-link">
676
- <i class="nav-icon bi bi-circle"></i>
677
- <p>Accessibility</p>
678
- </a>
679
- </li>
680
- </ul>
681
- </li>
682
- <li class="nav-item">
683
- <a href="../docs/browser-support.html" class="nav-link">
684
- <i class="nav-icon bi bi-browser-edge"></i>
685
- <p>Browser Support</p>
686
- </a>
687
- </li>
688
- <li class="nav-item">
689
- <a href="../docs/how-to-contribute.html" class="nav-link">
690
- <i class="nav-icon bi bi-hand-thumbs-up-fill"></i>
691
- <p>How To Contribute</p>
692
- </a>
693
- </li>
694
- <li class="nav-item">
695
- <a href="../docs/faq.html" class="nav-link">
696
- <i class="nav-icon bi bi-question-circle-fill"></i>
697
- <p>FAQ</p>
698
- </a>
699
- </li>
700
- <li class="nav-item">
701
- <a href="../docs/license.html" class="nav-link">
702
- <i class="nav-icon bi bi-patch-check-fill"></i>
703
- <p>License</p>
704
- </a>
705
- </li>
706
-
707
809
  <li class="nav-header">MULTI LEVEL EXAMPLE</li>
708
810
  <li class="nav-item">
709
811
  <a href="#" class="nav-link">
@@ -791,6 +893,17 @@
791
893
  </li>
792
894
  </ul>
793
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>
794
907
  </nav>
795
908
  </div>
796
909
  <!--end::Sidebar Wrapper-->
@@ -1017,7 +1130,71 @@
1017
1130
  }
1018
1131
  });
1019
1132
  </script>
1020
- <!--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-->
1021
1198
  <!--end::Script-->
1022
1199
  </body>
1023
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-rc7",
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.7",
67
- "@astrojs/mdx": "^5.0.0",
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.57.0",
70
- "@typescript-eslint/parser": "^8.57.0",
71
- "astro": "^6.0.0",
72
- "autoprefixer": "^10.4.27",
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.4",
79
- "eslint-config-xo": "^0.49.0",
80
- "eslint-config-xo-typescript": "^9.0.0",
81
- "eslint-plugin-astro": "^1.6.0",
82
- "eslint-plugin-import": "^2.32.0",
83
- "eslint-plugin-unicorn": "^62.0.0",
84
- "fs-extra": "^11.3.4",
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",
85
90
  "lockfile-lint": "^5.0.0",
86
91
  "nodemon": "^3.1.14",
87
92
  "npm-run-all": "^4.1.5",
88
- "postcss": "^8.5.8",
93
+ "postcss": "^8.5.14",
89
94
  "postcss-cli": "^11.0.1",
90
- "prettier": "^3.8.1",
95
+ "prettier": "^3.8.3",
91
96
  "prettier-plugin-astro": "^0.14.1",
92
97
  "rimraf": "^6.1.3",
93
- "rollup": "^4.59.0",
98
+ "rollup": "^4.60.4",
94
99
  "rtlcss": "^4.3.0",
95
- "sass": "^1.97.3",
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.46.0",
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
  }
@@ -31,4 +31,31 @@
31
31
  top: 0;
32
32
  z-index: $lte-zindex-fixed-header;
33
33
  }
34
+
35
+ // Fixes #6020: when only `fixed-header` is used (without `layout-fixed`),
36
+ // the sidebar — including its branding — used to scroll with the page
37
+ // because nothing made it sticky. Pin the sidebar so the brand and menu
38
+ // stay visible while the page content scrolls beneath the fixed header.
39
+ // Only applied on `sidebar-expand-*` breakpoints, since the mobile sidebar
40
+ // is an off-canvas overlay that handles its own positioning.
41
+ @each $breakpoint in map-keys($grid-breakpoints) {
42
+ $next: breakpoint-next($breakpoint, $grid-breakpoints);
43
+ $infix: breakpoint-infix($next, $grid-breakpoints);
44
+
45
+ &.sidebar-expand#{$infix} {
46
+ @include media-breakpoint-up($next) {
47
+ .app-sidebar {
48
+ position: sticky;
49
+ top: 0;
50
+ max-height: 100vh;
51
+
52
+ .sidebar-wrapper {
53
+ height: subtract(100vh, add($lte-app-header-height, 1px));
54
+ overflow-x: hidden;
55
+ overflow-y: auto;
56
+ }
57
+ }
58
+ }
59
+ }
60
+ }
34
61
  }