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
package/CHANGELOG.md CHANGED
@@ -7,6 +7,54 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
7
7
 
8
8
  ## [Unreleased]
9
9
 
10
+ ## [4.0.0] - 2026-05-19
11
+
12
+ ### Added
13
+
14
+ - **18 new demo pages** dramatically expanding the page catalog:
15
+ - **Apps:** Calendar (FullCalendar 6, drag-and-drop scheduling), Kanban (SortableJS, lane-to-lane drag), Chat (full-page conversation app), File Manager (grid + list views, folder tree), Projects (list with status, progress, team avatars)
16
+ - **Mailbox:** Inbox, Read Message, Compose — three-pane workflow with folders + labels
17
+ - **Forms:** Wizard (4-step with per-step validation + review summary)
18
+ - **Tables:** Data Tables — jQuery-free implementation using Tabulator 6
19
+ - **Pages:** Profile (tabbed activity/timeline/settings), Settings (account / notifications / security / billing / danger zone), Invoice (print-ready with totals math), Pricing (3-tier + comparison table + billing toggle), FAQ (data-driven accordions)
20
+ - **Error pages:** 404, 500, Maintenance
21
+ - **Recommended Integrations docs page** (`docs/integrations.html`) — copy-paste install snippets for Flatpickr, Tom Select, noUiSlider, Pickr, IMask, Dropzone, FilePond, Quill, EasyMDE, Toast UI Editor, ApexCharts, Chart.js, Tabulator, FullCalendar, SortableJS, GLightbox, and a comparison of icon libraries. AdminLTE doesn't bundle these — the page shows how to drop them in.
22
+ - **Visible color-mode toggle in the default topbar** (#6010) — Light / Dark / Auto dropdown with localStorage persistence and `prefers-color-scheme` integration. Wiring JS shipped globally in `_scripts.astro` so the toggle works on every demo page automatically.
23
+
24
+ ### Changed
25
+
26
+ - **Forms section restructured:** Split the 623-line `forms/general.html` into three focused pages — `forms/elements.html` (inputs, selects, checks/radios/switches, ranges, floating labels), `forms/layout.html` (horizontal, inline, sizing, width), and `forms/validation.html` (Bootstrap native validation + tooltip variant).
27
+
28
+ ### Fixed
29
+
30
+ - **#6028:** Color-mode "Auto" icon now renders. The dropdown used `bi-circle-fill-half-stroke` (a FontAwesome class name); replaced with the correct Bootstrap Icons class `bi-circle-half`.
31
+ - **#6026:** `.table-head-fixed` now respects dark mode. Hardcoded `background-color: $white` swapped for `var(--bs-body-bg)` so the sticky header tracks the active colour scheme.
32
+ - **#6021:** Fullscreen button no longer shifts after click. The plugin used to set `iconMaximize.style.display = 'block'` directly, overriding the icon library's natural display value (visible on FontAwesome). Now toggles Bootstrap's `.d-none` utility class. Markup updated accordingly.
33
+ - **#6020:** Sidebar (including brand) now stays put when using `.fixed-header`. New companion rule pins the sidebar sticky on `sidebar-expand-*` breakpoints, giving the menu its own scrollbar instead of scrolling with the page.
34
+ - **#6019:** Pie chart on `index2.html` no longer flickers on browser zoom. Pinned an explicit `height: 350` to break the ApexCharts ResizeObserver feedback loop most visible on Edge.
35
+
36
+ ### Updated
37
+
38
+ - **Bootstrap variable sync with 5.3.4:**
39
+ - Added missing null variables: `$btn-close-filter`, `$carousel-control-icon-filter`
40
+ - Marked deprecated-in-5.3.4 variables with inline comments: `$btn-close-white-filter`, `$carousel-dark-indicator-active-bg`, `$carousel-dark-caption-color`, `$carousel-dark-control-icon-filter`
41
+ - Documented the intentional override of `$modal-content-color` (null vs Bootstrap's `var(--bs-body-color)`)
42
+ - **All dependencies bumped to latest, including majors:**
43
+ - eslint: 9.39.4 → 10.4.0
44
+ - typescript: 5.9.3 → 6.0.3 (`baseUrl` removed, `moduleResolution: "bundler"` set to clear deprecation warnings)
45
+ - stylelint: 16.26.1 → 17.11.1
46
+ - eslint-plugin-unicorn: 62 → 64
47
+ - astro: 6.0.0 → 6.3.3
48
+ - autoprefixer: 10.4.27 → 10.5.0
49
+ - postcss: 8.5.8 → 8.5.14
50
+ - rollup: 4.59.0 → 4.60.4
51
+ - sass: 1.97.3 → 1.99.0
52
+ - terser: 5.46.0 → 5.47.1
53
+ - bundlewatch: 0.4.1 → 0.4.2, fs-extra: 11.3.4 → 11.3.5, prettier: 3.8.1 → 3.8.3
54
+ - **ESLint config flattened:** Removed the legacy `.eslintrc.json` (ignored since ESLint 9), along with three deps that only it referenced: `eslint-plugin-import`, `eslint-config-xo`, `eslint-config-xo-typescript`. Added explicit deps for `@eslint/js`, `globals`, and `typescript-eslint` (now required to be declared since ESLint 10 stopped resolving them transitively).
55
+ - **`stylelint-config-twbs-bootstrap` peer pinned via npm overrides** so it accepts stylelint 17 ahead of an upstream release. This removes the need for `--legacy-peer-deps` on `npm install`.
56
+ - **Security:** `yaml` pinned to `^2.9.0` via overrides to clear the dev-only stack-overflow advisory chain through `@astrojs/check`. `npm audit` now reports **0 vulnerabilities**.
57
+
10
58
  ## [4.0.0-rc7] - 2026-03-10
11
59
 
12
60
  ### Added
package/README.md CHANGED
@@ -9,31 +9,57 @@
9
9
  **AdminLTE** is a fully responsive administration template. Based on **[Bootstrap 5](https://getbootstrap.com/)** framework and also the JavaScript plugins.
10
10
  Highly customizable and easy to use. Fits many screen resolutions from small mobile devices to large desktops.
11
11
 
12
- ## What's New in v4.0.0-rc7
12
+ ## What's New in v4.0.0
13
13
 
14
- **Bug Fixes, Refactors & Documentation** - Major plugin refactors, complete JS documentation, and new features:
14
+ The first stable release of the v4 line — a ground-up rewrite on Bootstrap 5.3 with no jQuery. Highlights:
15
15
 
16
- - **Layout & PushMenu Refactors** - Single-instance architecture, proper responsive logic, configurable via data attributes
17
- - **Sidebar Without Hover** - New `sidebar-without-hover` class to keep collapsed sidebar from expanding on hover
18
- - **Complete JS Documentation** - All 7 JavaScript components now fully documented
19
- - **Astro 6.0.0** - Upgraded to latest Astro with Vite 7 and Shiki 4
20
- - **Bug Fixes** - Fixed footer with layout-fixed, mobile scroll chaining, print layout, modal escape key, pagination borders
16
+ **18 new demo pages**
21
17
 
22
- **Key Improvements:**
18
+ - Apps: Calendar (FullCalendar), Kanban (SortableJS), Chat, File Manager, Projects, Mailbox (Inbox / Read / Compose)
19
+ - Forms: Wizard (4-step with validation)
20
+ - Tables: Data Tables (Tabulator — jQuery-free)
21
+ - Pages: Profile, Settings, Invoice, Pricing, FAQ
22
+ - Errors: 404, 500, Maintenance
23
23
 
24
- - Fixed footer now works correctly with `layout-fixed` (#5805)
25
- - Sidebar no longer causes page scroll chaining on mobile (#5864)
26
- - Print layout shows both sidebar and content (#5996)
27
- - Sidebar persistence is now opt-in via `data-enable-persistence="true"` (**breaking change**)
28
- - All dependencies updated to latest versions
24
+ **Documentation overhaul**
29
25
 
30
- **Install the latest:**
26
+ - New pages: Getting Started, Customization & Theming, RTL Support, Migration from v3, Layout Blueprint, Recipes, Deployment & Performance, Recommended Integrations, JavaScript Plugins Overview
27
+ - Rewritten Introduction with four labelled install paths (CDN / npm / source / Composer)
28
+ - FAQ rebuilt as a custom page with hero, live search, section chips, and an accordion of 19 questions across six topics
29
+ - Split sidebar navigation: dashboard demo and docs each have their own nav, no more docs entries cluttering the live preview
30
+ - Reading-friendly typography across all docs pages, with constrained line length, prose-tuned heading rhythm, styled reference tables, info callouts, and pill inline code
31
+
32
+ **Six issue fixes**
33
+
34
+ - `bi-circle-half` for the Auto color-mode icon (#6028)
35
+ - `table-head-fixed` respects dark mode (#6026)
36
+ - Fullscreen icon toggles `.d-none` instead of inline `display` so it works with any icon library (#6021)
37
+ - Sidebar (including brand) stays pinned when using `fixed-header` (#6020)
38
+ - Pie chart on `index2.html` no longer flickers on browser zoom (#6019)
39
+ - Color-mode toggle now visible by default in the topbar with localStorage persistence (#6010)
40
+
41
+ **Major dependency upgrades**
42
+
43
+ - ESLint 9 → 10, TypeScript 5.9 → 6, Stylelint 16 → 17
44
+ - Astro 6.0 → 6.3, autoprefixer / postcss / rollup / sass / terser refreshed
45
+ - Bootstrap 5.3.8, Node 22 LTS in CI
46
+ - Dropped dead `eslint-plugin-import`, `eslint-config-xo*`, and the legacy `.eslintrc.json`
47
+ - npm `overrides` for `yaml` + `stylelint-config-twbs-bootstrap` so `npm install` runs without `--legacy-peer-deps` and reports **0 vulnerabilities**
48
+
49
+ **Breaking changes from v3**
50
+
51
+ - Class renames: `.wrapper` → `.app-wrapper`, `.main-header` → `.app-header`, `.main-sidebar` → `.app-sidebar`, `.content-wrapper` → `.app-main`
52
+ - Data attributes: `data-toggle` → `data-bs-toggle`, `data-widget="pushmenu"` → `data-lte-toggle="sidebar"`, `data-widget="treeview"` → `data-lte-toggle="treeview"`
53
+ - Dark mode: `.dark-mode` body class → `data-bs-theme="dark"` attribute (Bootstrap 5.3 native)
54
+ - jQuery no longer required; plugins are vanilla TypeScript
55
+
56
+ See the dedicated [Migration from v3](https://adminlte.io/themes/v4/docs/migration.html) guide and the [CHANGELOG.md](CHANGELOG.md) for the full list.
57
+
58
+ **Install:**
31
59
  ```bash
32
- npm install admin-lte@4.0.0-rc7
60
+ npm install admin-lte@4.0.0
33
61
  ```
34
62
 
35
- See the [CHANGELOG.md](CHANGELOG.md) for complete details.
36
-
37
63
  ## Looking for Premium Templates?
38
64
 
39
65
  AdminLTE.io just opened a new premium templates page. Hand picked to ensure the best quality and the most affordable
@@ -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 active">
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">
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">
498
612
  <i class="nav-icon bi bi-circle"></i>
499
- <p>General Elements</p>
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-->
@@ -2088,7 +2201,71 @@
2088
2201
  }
2089
2202
  });
2090
2203
  </script>
2091
- <!--end::OverlayScrollbars Configure-->
2204
+ <!--end::OverlayScrollbars Configure--><!--begin::Color Mode Toggle (#6010)-->
2205
+ <script>
2206
+ (() => {
2207
+ 'use strict';
2208
+
2209
+ const STORAGE_KEY = 'lte-theme';
2210
+
2211
+ const getStoredTheme = () => localStorage.getItem(STORAGE_KEY);
2212
+ const setStoredTheme = (theme) => localStorage.setItem(STORAGE_KEY, theme);
2213
+
2214
+ const prefersDark = () => globalThis.matchMedia('(prefers-color-scheme: dark)').matches;
2215
+
2216
+ const getPreferredTheme = () => {
2217
+ const stored = getStoredTheme();
2218
+ if (stored) return stored;
2219
+ return prefersDark() ? 'dark' : 'light';
2220
+ };
2221
+
2222
+ const setTheme = (theme) => {
2223
+ const resolved = theme === 'auto' ? (prefersDark() ? 'dark' : 'light') : theme;
2224
+ document.documentElement.setAttribute('data-bs-theme', resolved);
2225
+ };
2226
+
2227
+ setTheme(getPreferredTheme());
2228
+
2229
+ const showActiveTheme = (theme) => {
2230
+ // Highlight the active dropdown option
2231
+ document.querySelectorAll('[data-bs-theme-value]').forEach((el) => {
2232
+ el.classList.remove('active');
2233
+ el.setAttribute('aria-pressed', 'false');
2234
+ const check = el.querySelector('.bi-check-lg');
2235
+ if (check) check.classList.add('d-none');
2236
+ });
2237
+ const active = document.querySelector(`[data-bs-theme-value="${theme}"]`);
2238
+ if (active) {
2239
+ active.classList.add('active');
2240
+ active.setAttribute('aria-pressed', 'true');
2241
+ const check = active.querySelector('.bi-check-lg');
2242
+ if (check) check.classList.remove('d-none');
2243
+ }
2244
+ // Sync the topbar trigger icon
2245
+ document.querySelectorAll('[data-lte-theme-icon]').forEach((icon) => {
2246
+ icon.classList.toggle('d-none', icon.dataset.lteThemeIcon !== theme);
2247
+ });
2248
+ };
2249
+
2250
+ globalThis.matchMedia('(prefers-color-scheme: dark)').addEventListener('change', () => {
2251
+ const stored = getStoredTheme();
2252
+ if (!stored || stored === 'auto') setTheme(getPreferredTheme());
2253
+ });
2254
+
2255
+ document.addEventListener('DOMContentLoaded', () => {
2256
+ showActiveTheme(getPreferredTheme());
2257
+ document.querySelectorAll('[data-bs-theme-value]').forEach((toggle) => {
2258
+ toggle.addEventListener('click', () => {
2259
+ const theme = toggle.getAttribute('data-bs-theme-value');
2260
+ setStoredTheme(theme);
2261
+ setTheme(theme);
2262
+ showActiveTheme(theme);
2263
+ });
2264
+ });
2265
+ });
2266
+ })();
2267
+ </script>
2268
+ <!--end::Color Mode Toggle-->
2092
2269
  <!--begin::Bootstrap Tooltips-->
2093
2270
  <script>
2094
2271
  const tooltipTriggerList = document.querySelectorAll('[data-bs-toggle="tooltip"]');