1
0
mirror of https://github.com/tabler/tabler.git synced 2025-12-22 01:44:25 +04:00
Files
tabler/shared/includes/settings.html

178 lines
5.7 KiB
HTML

<div class="settings">
<a href="#" class="btn btn-floating btn-icon btn-primary" data-bs-toggle="offcanvas" data-bs-target="#offcanvas-settings" aria-controls="offcanvas-settings" aria-label="Theme Settings">
{% include "ui/icon.html" icon="brush" %}
</a>
<form class="offcanvas offcanvas-start offcanvas-narrow" tabindex="-1" id="offcanvas-settings" role="dialog" aria-modal="true" aria-labelledby="offcanvas-settings-title">
<div class="offcanvas-header">
<h2 class="offcanvas-title" id="offcanvas-settings-title">Theme Settings</h2>
<button type="button" class="btn-close" data-bs-dismiss="offcanvas" aria-label="Close"></button>
</div>
<div class="offcanvas-body d-flex flex-column">
<div>
<div class="mb-4">
<label class="form-label">Color mode</label>
<p class="form-hint">Choose the color mode for your app.</p>
{% assign modes = 'light,dark' | split: ',' %} {% for mode in modes %}
<label class="form-check">
<div class="form-selectgroup-item">
<input type="radio" name="theme" value="{{ mode }}" class="form-check-input"{% if mode == 'light' %} checked{% endif %} />
<div class="form-check-label">{{ mode | capitalize }}</div>
</div>
</label>
{% endfor %}
</div>
<div class="mb-4">
<label class="form-label">Color scheme</label>
<p class="form-hint">The perfect color mode for your app.</p>
<div class="row g-2">
{% for color in site.colors %}
<div class="col-auto">
<label class="form-colorinput">
<input name="theme-primary" type="radio" value="{{ color[0] }}" class="form-colorinput-input" />
<span class="form-colorinput-color bg-{{ color[0] }}"></span>
</label>
</div>
{% endfor %}
</div>
</div>
<div class="mb-4">
<label class="form-label">Font family</label>
<p class="form-hint">Choose the font family that fits your app.</p>
<div>
{% assign fonts = 'sans-serif,serif,monospace,comic' | split: ',' %} {% for font in fonts %}
<label class="form-check">
<div class="form-selectgroup-item">
<input type="radio" name="theme-font" value="{{ font }}" class="form-check-input"{% if font == 'sans-serif' %} checked{% endif %} />
<div class="form-check-label">{{ font | capitalize }}</div>
</div>
</label>
{% endfor %}
</div>
</div>
<div class="mb-4">
<label class="form-label">Theme base</label>
<p class="form-hint">Choose the gray shade for your app.</p>
<div>
{% assign bases = 'slate,gray,zinc,neutral,stone' | split: ',' %} {% for base in bases %}
<label class="form-check">
<div class="form-selectgroup-item">
<input type="radio" name="theme-base" value="{{ base }}" class="form-check-input"{% if base == 'gray' %} checked{% endif %} />
<div class="form-check-label">{{ base | capitalize }}</div>
</div>
</label>
{% endfor %}
</div>
</div>
<div class="mb-4">
<label class="form-label">Corner Radius</label>
<p class="form-hint">
Choose the border radius factor for your app.
</p>
<div>
{% assign radiuses = '0,0.5,1,1.5,2' | split: ',' %} {% for radius in radiuses %}
<label class="form-check">
<div class="form-selectgroup-item">
<input type="radio" name="theme-radius" value="{{ radius }}" class="form-check-input"{% if radius == "1" %} checked{% endif %} />
<div class="form-check-label">{{ radius }}</div>
</div>
</label>
{% endfor %}
</div>
</div>
</div>
<div class="mt-auto space-y">
<button type="button" class="btn w-100" id="reset-changes">
{% include "ui/icon.html" icon="rotate" %}
Reset changes
</button>
<a href="#" class="btn btn-primary w-100" data-bs-dismiss="offcanvas">
Save
</a>
</div>
</div>
</form>
</div>
{% capture_script %}
<script>
/*
This script handles the theme settings offcanvas functionality
It saves the selected settings to localStorage and applies them to the document
It also updates the URL with the selected settings as query parameters
It also has a reset button to clear all settings and revert to default
This is just a demo script to show how to implement theme settings. You can modify it as needed.
*/
document.addEventListener("DOMContentLoaded", function () {
var themeConfig = {
theme: "light",
"theme-base": "gray",
"theme-font": "sans-serif",
"theme-primary": "blue",
"theme-radius": "1",
}
var url = new URL(window.location)
var form = document.getElementById("offcanvas-settings")
var resetButton = document.getElementById("reset-changes")
var checkItems = function () {
for (var key in themeConfig) {
var value = window.localStorage["tabler-" + key] || themeConfig[key]
if (!!value) {
var radios = form.querySelectorAll(`[name="${key}"]`)
if (!!radios) {
radios.forEach((radio) => {
radio.checked = radio.value === value
})
}
}
}
}
form.addEventListener("change", function (event) {
var target = event.target,
name = target.name,
value = target.value
for (var key in themeConfig) {
if (name === key) {
document.documentElement.setAttribute("data-bs-" + key, value)
window.localStorage.setItem("tabler-" + key, value)
url.searchParams.set(key, value)
}
}
window.history.pushState({}, "", url)
})
resetButton.addEventListener("click", function () {
for (var key in themeConfig) {
var value = themeConfig[key]
document.documentElement.removeAttribute("data-bs-" + key)
window.localStorage.removeItem("tabler-" + key)
url.searchParams.delete(key)
}
checkItems()
window.history.pushState({}, "", url)
})
checkItems()
})
</script>
{% endcapture_script %}