settings.html 5.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170
  1. <div class="settings">
  2. <a href="#" class="btn btn-floating btn-icon btn-primary" data-bs-toggle="offcanvas" data-bs-target="#offcanvasSettings" aria-controls="offcanvasSettings" aria-label="Theme Settings">
  3. {% include "ui/icon.html" icon="brush" %}
  4. </a>
  5. <form class="offcanvas offcanvas-start offcanvas-narrow" tabindex="-1" id="offcanvasSettings">
  6. <div class="offcanvas-header">
  7. <h2 class="offcanvas-title">Theme Settings</h2>
  8. <button type="button" class="btn-close" data-bs-dismiss="offcanvas" aria-label="Close"></button>
  9. </div>
  10. <div class="offcanvas-body d-flex flex-column">
  11. <div>
  12. <div class="mb-4">
  13. <label class="form-label">Color mode</label>
  14. <p class="form-hint">Choose the color mode for your app.</p>
  15. {% assign modes = 'light,dark' | split: ',' %} {% for mode in modes %}
  16. <label class="form-check">
  17. <div class="form-selectgroup-item">
  18. <input type="radio" name="theme" value="{{ mode }}" class="form-check-input"{% if mode == 'light' %} checked{% endif %} />
  19. <div class="form-check-label">{{ mode | capitalize }}</div>
  20. </div>
  21. </label>
  22. {% endfor %}
  23. </div>
  24. <div class="mb-4">
  25. <label class="form-label">Color scheme</label>
  26. <p class="form-hint">The perfect color mode for your app.</p>
  27. <div class="row g-2">
  28. {% for color in site.colors %}
  29. <div class="col-auto">
  30. <label class="form-colorinput">
  31. <input name="theme-primary" type="radio" value="{{ color[0] }}" class="form-colorinput-input" />
  32. <span class="form-colorinput-color bg-{{ color[0] }}"></span>
  33. </label>
  34. </div>
  35. {% endfor %}
  36. </div>
  37. </div>
  38. <div class="mb-4">
  39. <label class="form-label">Font family</label>
  40. <p class="form-hint">Choose the font family that fits your app.</p>
  41. <div>
  42. {% assign fonts = 'sans-serif,serif,monospace,comic' | split: ',' %} {% for font in fonts %}
  43. <label class="form-check">
  44. <div class="form-selectgroup-item">
  45. <input type="radio" name="theme-font" value="{{ font }}" class="form-check-input"{% if font == 'sans-serif' %} checked{% endif %} />
  46. <div class="form-check-label">{{ font | capitalize }}</div>
  47. </div>
  48. </label>
  49. {% endfor %}
  50. </div>
  51. </div>
  52. <div class="mb-4">
  53. <label class="form-label">Theme base</label>
  54. <p class="form-hint">Choose the gray shade for your app.</p>
  55. <div>
  56. {% assign bases = 'slate,gray,zinc,neutral,stone' | split: ',' %} {% for base in bases %}
  57. <label class="form-check">
  58. <div class="form-selectgroup-item">
  59. <input type="radio" name="theme-base" value="{{ base }}" class="form-check-input"{% if base == 'gray' %} checked{% endif %} />
  60. <div class="form-check-label">{{ base | capitalize }}</div>
  61. </div>
  62. </label>
  63. {% endfor %}
  64. </div>
  65. </div>
  66. <div class="mb-4">
  67. <label class="form-label">Corner Radius</label>
  68. <p class="form-hint">
  69. Choose the border radius factor for your app.
  70. </p>
  71. <div>
  72. {% assign radiuses = '0,0.5,1,1.5,2' | split: ',' %} {% for radius in radiuses %}
  73. <label class="form-check">
  74. <div class="form-selectgroup-item">
  75. <input type="radio" name="theme-radius" value="{{ radius }}" class="form-check-input"{% if radius == "1" %} checked{% endif %} />
  76. <div class="form-check-label">{{ radius }}</div>
  77. </div>
  78. </label>
  79. {% endfor %}
  80. </div>
  81. </div>
  82. </div>
  83. <div class="mt-auto space-y">
  84. <button type="button" class="btn w-100" id="reset-changes">
  85. {% include "ui/icon.html" icon="rotate" %}
  86. Reset changes
  87. </button>
  88. <a href="#" class="btn btn-primary w-100" data-bs-dismiss="offcanvas">
  89. Save
  90. </a>
  91. </div>
  92. </div>
  93. </form>
  94. </div>
  95. {% capture_script %}
  96. <script>
  97. document.addEventListener("DOMContentLoaded", function () {
  98. var themeConfig = {
  99. theme: "light",
  100. "theme-base": "gray",
  101. "theme-font": "sans-serif",
  102. "theme-primary": "blue",
  103. "theme-radius": "1",
  104. }
  105. var url = new URL(window.location)
  106. var form = document.getElementById("offcanvasSettings")
  107. var resetButton = document.getElementById("reset-changes")
  108. var checkItems = function () {
  109. for (var key in themeConfig) {
  110. var value = window.localStorage["tabler-" + key] || themeConfig[key]
  111. if (!!value) {
  112. var radios = form.querySelectorAll(`[name="${key}"]`)
  113. if (!!radios) {
  114. radios.forEach((radio) => {
  115. radio.checked = radio.value === value
  116. })
  117. }
  118. }
  119. }
  120. }
  121. form.addEventListener("change", function (event) {
  122. var target = event.target,
  123. name = target.name,
  124. value = target.value
  125. for (var key in themeConfig) {
  126. if (name === key) {
  127. document.documentElement.setAttribute("data-bs-" + key, value)
  128. window.localStorage.setItem("tabler-" + key, value)
  129. url.searchParams.set(key, value)
  130. }
  131. }
  132. window.history.pushState({}, "", url)
  133. })
  134. resetButton.addEventListener("click", function () {
  135. for (var key in themeConfig) {
  136. var value = themeConfig[key]
  137. document.documentElement.removeAttribute("data-bs-" + key)
  138. window.localStorage.removeItem("tabler-" + key)
  139. url.searchParams.delete(key)
  140. }
  141. checkItems()
  142. window.history.pushState({}, "", url)
  143. })
  144. checkItems()
  145. })
  146. </script>
  147. {% endcapture_script %}