150 lines
4.1 KiB
JavaScript
150 lines
4.1 KiB
JavaScript
|
|
||
|
function initThemeChooser(settings) {
|
||
|
var isInitialized = false
|
||
|
var currentThemeSystem // don't set this directly. use setThemeSystem
|
||
|
var currentStylesheetEl
|
||
|
var loadingEl = document.getElementById('loading')
|
||
|
var systemSelectEl = document.querySelector('#theme-system-selector select')
|
||
|
var themeSelectWrapEls = Array.prototype.slice.call( // convert to real array
|
||
|
document.querySelectorAll('.selector[data-theme-system]'),
|
||
|
)
|
||
|
|
||
|
systemSelectEl.addEventListener('change', function() {
|
||
|
setThemeSystem(this.value)
|
||
|
})
|
||
|
|
||
|
setThemeSystem(systemSelectEl.value)
|
||
|
|
||
|
themeSelectWrapEls.forEach(function(themeSelectWrapEl) {
|
||
|
var themeSelectEl = themeSelectWrapEl.querySelector('select')
|
||
|
|
||
|
themeSelectWrapEl.addEventListener('change', function() {
|
||
|
setTheme(
|
||
|
currentThemeSystem,
|
||
|
themeSelectEl.options[themeSelectEl.selectedIndex].value,
|
||
|
)
|
||
|
})
|
||
|
})
|
||
|
|
||
|
|
||
|
function setThemeSystem(themeSystem) {
|
||
|
var selectedTheme
|
||
|
|
||
|
currentThemeSystem = themeSystem
|
||
|
|
||
|
themeSelectWrapEls.forEach(function(themeSelectWrapEl) {
|
||
|
var themeSelectEl = themeSelectWrapEl.querySelector('select')
|
||
|
var themeSystems = (themeSelectWrapEl.getAttribute('data-theme-system') || '').split(',')
|
||
|
|
||
|
if (themeSystems.includes(themeSystem)) {
|
||
|
selectedTheme = themeSelectEl.options[themeSelectEl.selectedIndex].value
|
||
|
themeSelectWrapEl.style.display = 'inline-block'
|
||
|
} else {
|
||
|
themeSelectWrapEl.style.display = 'none'
|
||
|
}
|
||
|
})
|
||
|
|
||
|
setTheme(themeSystem, selectedTheme)
|
||
|
}
|
||
|
|
||
|
|
||
|
function setTheme(themeSystem, themeName) {
|
||
|
var stylesheetUrl = generateStylesheetUrl(themeSystem, themeName)
|
||
|
var stylesheetEl
|
||
|
|
||
|
function done() {
|
||
|
if (!isInitialized) {
|
||
|
isInitialized = true
|
||
|
settings.init(themeSystem)
|
||
|
}
|
||
|
else {
|
||
|
settings.change(themeSystem)
|
||
|
}
|
||
|
|
||
|
showCredits(themeSystem, themeName)
|
||
|
}
|
||
|
|
||
|
if (stylesheetUrl) {
|
||
|
stylesheetEl = document.createElement('link')
|
||
|
stylesheetEl.setAttribute('rel', 'stylesheet')
|
||
|
stylesheetEl.setAttribute('href', stylesheetUrl)
|
||
|
document.querySelector('head').appendChild(stylesheetEl)
|
||
|
|
||
|
loadingEl.style.display = 'inline'
|
||
|
|
||
|
whenStylesheetLoaded(stylesheetEl, function() {
|
||
|
if (currentStylesheetEl) {
|
||
|
currentStylesheetEl.parentNode.removeChild(currentStylesheetEl)
|
||
|
}
|
||
|
currentStylesheetEl = stylesheetEl
|
||
|
loadingEl.style.display = 'none'
|
||
|
done()
|
||
|
})
|
||
|
} else {
|
||
|
if (currentStylesheetEl) {
|
||
|
currentStylesheetEl.parentNode.removeChild(currentStylesheetEl)
|
||
|
currentStylesheetEl = null
|
||
|
}
|
||
|
done()
|
||
|
}
|
||
|
}
|
||
|
|
||
|
|
||
|
function generateStylesheetUrl(themeSystem, themeName) {
|
||
|
if (themeSystem === 'bootstrap') {
|
||
|
if (themeName) {
|
||
|
return 'https://bootswatch.com/4/' + themeName + '/bootstrap.min.css'
|
||
|
}
|
||
|
else { // the default bootstrap theme
|
||
|
return 'https://maxcdn.bootstrapcdn.com/bootstrap/4.0.0/css/bootstrap.min.css'
|
||
|
}
|
||
|
} else if (themeSystem === 'bootstrap5') {
|
||
|
if (themeName) {
|
||
|
return 'https://bootswatch.com/5/' + themeName + '/bootstrap.min.css'
|
||
|
}
|
||
|
else { // the default bootstrap theme
|
||
|
return 'https://cdn.jsdelivr.net/npm/bootstrap@5.1.3/dist/css/bootstrap.min.css'
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
|
||
|
|
||
|
function showCredits(themeSystem, themeName) {
|
||
|
var creditId
|
||
|
|
||
|
if (themeSystem.match('bootstrap')) {
|
||
|
if (themeName) {
|
||
|
creditId = 'bootstrap-custom'
|
||
|
}
|
||
|
else {
|
||
|
creditId = 'bootstrap-standard'
|
||
|
}
|
||
|
}
|
||
|
|
||
|
Array.prototype.slice.call( // convert to real array
|
||
|
document.querySelectorAll('.credits'),
|
||
|
).forEach(function(creditEl) {
|
||
|
if (creditEl.getAttribute('data-credit-id') === creditId) {
|
||
|
creditEl.style.display = 'block'
|
||
|
} else {
|
||
|
creditEl.style.display = 'none'
|
||
|
}
|
||
|
})
|
||
|
}
|
||
|
|
||
|
|
||
|
function whenStylesheetLoaded(linkNode, callback) {
|
||
|
var isReady = false
|
||
|
|
||
|
function ready() {
|
||
|
if (!isReady) { // avoid double-call
|
||
|
isReady = true
|
||
|
callback()
|
||
|
}
|
||
|
}
|
||
|
|
||
|
linkNode.onload = ready // does not work cross-browser
|
||
|
setTimeout(ready, 2000) // max wait. also handles browsers that don't support onload
|
||
|
}
|
||
|
}
|