color-mode.astro 7.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222
  1. ---
  2. import Head from "@components/_head.astro";
  3. import Footer from "@components/dashboard/_footer.astro";
  4. import Topbar from "@components/dashboard/_topbar.astro";
  5. import Sidenav from "@components/dashboard/_sidenav.astro";
  6. import Scripts from "@components/_scripts.astro";
  7. import ColorMode from "@components/docs/color-mode.mdx";
  8. const title = "Color Mode | AdminLTE 4";
  9. const path = '../../../dist'
  10. const mainPage = "docs";
  11. const page = "color-mode";
  12. ---
  13. <!DOCTYPE html>
  14. <html lang="en">
  15. <head>
  16. <Head title={title} path={path} />
  17. </head>
  18. <body class="layout-fixed sidebar-expand-lg bg-body-tertiary">
  19. <div class="app-wrapper">
  20. <Topbar path={path} />
  21. <Sidenav path={path} mainPage={mainPage} page={page} />
  22. <!-- Main content -->
  23. <main class="app-main">
  24. <div class="app-content-header">
  25. <div class="container-fluid">
  26. <div class="row">
  27. <div class="col-sm-6">
  28. <h3 class="mb-0">Color Mode Toggle</h3>
  29. </div>
  30. <div class="col-sm-6">
  31. <ol class="breadcrumb float-sm-end">
  32. <li class="breadcrumb-item"><a href="#">Docs</a></li>
  33. <li class="breadcrumb-item active" aria-current="page">
  34. Color Mode
  35. </li>
  36. </ol>
  37. </div>
  38. </div>
  39. </div>
  40. </div>
  41. <!-- Main content -->
  42. <div class="app-content">
  43. <div class="container-fluid">
  44. <div class="row g-4">
  45. <!-- Start column -->
  46. <div class="col-12">
  47. <!-- Navbar -->
  48. <nav class="navbar navbar-expand bg-body">
  49. <div class="container-fluid">
  50. <!-- Start navbar links -->
  51. <ul class="navbar-nav">
  52. <li class="nav-item">
  53. <a
  54. class="nav-link"
  55. data-lte-toggle="sidebar"
  56. href="#"
  57. role="button"><i class="fa-solid fa-bars"></i></a
  58. >
  59. </li>
  60. <li class="nav-item d-none d-md-block">
  61. <a href="#" class="nav-link">Home</a>
  62. </li>
  63. <li class="nav-item d-none d-md-block">
  64. <a href="#" class="nav-link">Contact</a>
  65. </li>
  66. </ul>
  67. <ul class="navbar-nav ms-auto">
  68. <li class="nav-item dropdown">
  69. <button
  70. class="btn btn-link nav-link py-2 px-0 px-lg-2 dropdown-toggle d-flex align-items-center"
  71. id="bd-theme"
  72. type="button"
  73. aria-expanded="false"
  74. data-bs-toggle="dropdown"
  75. data-bs-display="static"
  76. >
  77. <span class="theme-icon-active">
  78. <i class="my-1"></i>
  79. </span>
  80. </button>
  81. <ul
  82. class="dropdown-menu dropdown-menu-end"
  83. aria-labelledby="bd-theme"
  84. style="--bs-dropdown-min-width: 8rem;"
  85. >
  86. <li>
  87. <button
  88. type="button"
  89. class="dropdown-item d-flex align-items-center active"
  90. data-bs-theme-value="light"
  91. >
  92. <i class="fa-regular fa-sun me-2"></i>
  93. Light
  94. <i class="fa-solid fa-check ms-auto d-none"></i>
  95. </button>
  96. </li>
  97. <li>
  98. <button
  99. type="button"
  100. class="dropdown-item d-flex align-items-center"
  101. data-bs-theme-value="dark"
  102. >
  103. <i class="fa-solid fa-moon me-2"></i>
  104. Dark
  105. <i class="fa-solid fa-check ms-auto d-none"></i>
  106. </button>
  107. </li>
  108. <li>
  109. <button
  110. type="button"
  111. class="dropdown-item d-flex align-items-center"
  112. data-bs-theme-value="auto"
  113. >
  114. <i class="fa-solid fa-circle-half-stroke me-2"
  115. ></i>
  116. Auto
  117. <i class="fa-solid fa-check ms-auto d-none"></i>
  118. </button>
  119. </li>
  120. </ul>
  121. </li>
  122. </ul>
  123. </div>
  124. </nav>
  125. </div>
  126. <!-- Start column -->
  127. <div class="col-12">
  128. <ColorMode />
  129. </div>
  130. </div>
  131. <!-- /.row -->
  132. </div><!-- /.container-fluid -->
  133. </div>
  134. <!-- /.content -->
  135. </main>
  136. <!-- /.app-content -->
  137. <Footer />
  138. </div>
  139. <!-- ./app-wrapper -->
  140. <Scripts path={path} />
  141. <script is:inline>
  142. // Color Mode Toggler
  143. (() => {
  144. "use strict";
  145. const storedTheme = localStorage.getItem("theme");
  146. const getPreferredTheme = () => {
  147. if (storedTheme) {
  148. return storedTheme;
  149. }
  150. return window.matchMedia("(prefers-color-scheme: dark)").matches
  151. ? "dark"
  152. : "light";
  153. };
  154. const setTheme = function (theme) {
  155. if (
  156. theme === "auto" &&
  157. window.matchMedia("(prefers-color-scheme: dark)").matches
  158. ) {
  159. document.documentElement.setAttribute("data-bs-theme", "dark");
  160. } else {
  161. document.documentElement.setAttribute("data-bs-theme", theme);
  162. }
  163. };
  164. setTheme(getPreferredTheme());
  165. const showActiveTheme = (theme) => {
  166. const activeThemeIcon = document.querySelector(
  167. ".theme-icon-active i"
  168. );
  169. const btnToActive = document.querySelector(
  170. '[data-bs-theme-value="' + theme + '"]'
  171. );
  172. const svgOfActiveBtn = btnToActive
  173. .querySelector("i")
  174. .getAttribute("class");
  175. document
  176. .querySelectorAll("[data-bs-theme-value]")
  177. .forEach((element) => {
  178. element.classList.remove("active");
  179. });
  180. btnToActive.classList.add("active");
  181. activeThemeIcon.setAttribute("class", svgOfActiveBtn);
  182. };
  183. window
  184. .matchMedia("(prefers-color-scheme: dark)")
  185. .addEventListener("change", () => {
  186. if (storedTheme !== "light" || storedTheme !== "dark") {
  187. setTheme(getPreferredTheme());
  188. }
  189. });
  190. window.addEventListener("DOMContentLoaded", () => {
  191. showActiveTheme(getPreferredTheme());
  192. document
  193. .querySelectorAll("[data-bs-theme-value]")
  194. .forEach((toggle) => {
  195. toggle.addEventListener("click", () => {
  196. const theme = toggle.getAttribute("data-bs-theme-value");
  197. localStorage.setItem("theme", theme);
  198. setTheme(theme);
  199. showActiveTheme(theme);
  200. });
  201. });
  202. });
  203. })();
  204. </script>
  205. </body>
  206. </html>