color-mode.astro 7.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228
  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 NavbarHtml from "@components/docs/color-mode/navbar-html.md";
  8. import ToggleScript from "@components/docs/color-mode/toggle-script.md";
  9. const title = "AdminLTE 4 | General Form Elements";
  10. const mainPage = "forms";
  11. const page = "general";
  12. ---
  13. <!DOCTYPE html>
  14. <html lang="en">
  15. <head>
  16. <Head title={title} />
  17. </head>
  18. <body class="layout-fixed sidebar-expand-lg bg-body-tertiary">
  19. <div class="app-wrapper">
  20. <Topbar />
  21. <Sidenav 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="#">Home</a></li>
  33. <li class="breadcrumb-item active" aria-current="page">
  34. General Form
  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. <div class="lte-code-snippet">
  129. <NavbarHtml />
  130. </div>
  131. <div class="lte-code-snippet">
  132. <ToggleScript />
  133. </div>
  134. </div>
  135. </div>
  136. <!-- /.row -->
  137. </div><!-- /.container-fluid -->
  138. </div>
  139. <!-- /.content -->
  140. </main>
  141. <!-- /.app-content -->
  142. <Footer />
  143. </div>
  144. <!-- ./app-wrapper -->
  145. <Scripts />
  146. <script is:inline>
  147. // Color Mode Toggler
  148. (() => {
  149. "use strict";
  150. const storedTheme = localStorage.getItem("theme");
  151. const getPreferredTheme = () => {
  152. if (storedTheme) {
  153. return storedTheme;
  154. }
  155. return window.matchMedia("(prefers-color-scheme: dark)").matches
  156. ? "dark"
  157. : "light";
  158. };
  159. const setTheme = function (theme) {
  160. if (
  161. theme === "auto" &&
  162. window.matchMedia("(prefers-color-scheme: dark)").matches
  163. ) {
  164. document.documentElement.setAttribute("data-bs-theme", "dark");
  165. } else {
  166. document.documentElement.setAttribute("data-bs-theme", theme);
  167. }
  168. };
  169. setTheme(getPreferredTheme());
  170. const showActiveTheme = (theme) => {
  171. const activeThemeIcon = document.querySelector(
  172. ".theme-icon-active i"
  173. );
  174. const btnToActive = document.querySelector(
  175. '[data-bs-theme-value="' + theme + '"]'
  176. );
  177. const svgOfActiveBtn = btnToActive
  178. .querySelector("i")
  179. .getAttribute("class");
  180. document
  181. .querySelectorAll("[data-bs-theme-value]")
  182. .forEach((element) => {
  183. element.classList.remove("active");
  184. });
  185. btnToActive.classList.add("active");
  186. activeThemeIcon.setAttribute("class", svgOfActiveBtn);
  187. };
  188. window
  189. .matchMedia("(prefers-color-scheme: dark)")
  190. .addEventListener("change", () => {
  191. if (storedTheme !== "light" || storedTheme !== "dark") {
  192. setTheme(getPreferredTheme());
  193. }
  194. });
  195. window.addEventListener("DOMContentLoaded", () => {
  196. showActiveTheme(getPreferredTheme());
  197. document
  198. .querySelectorAll("[data-bs-theme-value]")
  199. .forEach((toggle) => {
  200. toggle.addEventListener("click", () => {
  201. const theme = toggle.getAttribute("data-bs-theme-value");
  202. localStorage.setItem("theme", theme);
  203. setTheme(theme);
  204. showActiveTheme(theme);
  205. });
  206. });
  207. });
  208. })();
  209. </script>
  210. </body>
  211. </html>