mirror of
https://github.com/InsanusMokrassar/MicroUtils.git
synced 2026-06-27 05:35:06 +00:00
deploy: c793bea0c3
This commit is contained in:
@@ -1,35 +1,6 @@
|
||||
/*
|
||||
* Copyright 2014-2024 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license.
|
||||
*/
|
||||
/** When Dokka is viewed via iframe, local storage could be inaccessible (see https://github.com/Kotlin/dokka/issues/3323)
|
||||
* This is a wrapper around local storage to prevent errors in such cases
|
||||
* */
|
||||
const safeLocalStorage = (() => {
|
||||
let isLocalStorageAvailable = false;
|
||||
try {
|
||||
const testKey = '__testLocalStorageKey__';
|
||||
localStorage.setItem(testKey, testKey);
|
||||
localStorage.removeItem(testKey);
|
||||
isLocalStorageAvailable = true;
|
||||
} catch (e) {
|
||||
console.error('Local storage is not available', e);
|
||||
}
|
||||
|
||||
return {
|
||||
getItem: (key) => {
|
||||
if (!isLocalStorageAvailable) {
|
||||
return null;
|
||||
}
|
||||
return localStorage.getItem(key);
|
||||
},
|
||||
setItem: (key, value) => {
|
||||
if (!isLocalStorageAvailable) {
|
||||
return;
|
||||
}
|
||||
localStorage.setItem(key, value);
|
||||
}
|
||||
};
|
||||
})();
|
||||
|
||||
filteringContext = {
|
||||
dependencies: {},
|
||||
@@ -38,12 +9,8 @@ filteringContext = {
|
||||
}
|
||||
let highlightedAnchor;
|
||||
let topNavbarOffset;
|
||||
let instances = [];
|
||||
let sourcesetNotification;
|
||||
|
||||
const samplesDarkThemeName = 'darcula'
|
||||
const samplesLightThemeName = 'idea'
|
||||
|
||||
window.addEventListener('load', () => {
|
||||
document.querySelectorAll("div[data-platform-hinted]")
|
||||
.forEach(elem => elem.addEventListener('click', (event) => togglePlatformDependent(event, elem)))
|
||||
@@ -66,7 +33,11 @@ const darkModeSwitch = () => {
|
||||
const osDarkSchemePreferred = window.matchMedia && window.matchMedia('(prefers-color-scheme: dark)').matches
|
||||
const darkModeEnabled = storage ? JSON.parse(storage) : osDarkSchemePreferred
|
||||
const element = document.getElementById("theme-toggle-button")
|
||||
initPlayground(darkModeEnabled ? samplesDarkThemeName : samplesLightThemeName)
|
||||
|
||||
// Notify external scripts about changing dark mode, runnable samples plugin depends on this
|
||||
if (window.onDarkModeChanged) {
|
||||
window.onDarkModeChanged(darkModeEnabled)
|
||||
}
|
||||
|
||||
element.addEventListener('click', () => {
|
||||
const enabledClasses = document.getElementsByTagName("html")[0].classList
|
||||
@@ -74,48 +45,14 @@ const darkModeSwitch = () => {
|
||||
|
||||
//if previously we had saved dark theme then we set it to light as this is what we save in local storage
|
||||
const darkModeEnabled = enabledClasses.contains("theme-dark")
|
||||
if (darkModeEnabled) {
|
||||
initPlayground(samplesDarkThemeName)
|
||||
} else {
|
||||
initPlayground(samplesLightThemeName)
|
||||
// Notify external scripts about changing dark mode, runnable samples plugin depends on this
|
||||
if (window.onDarkModeChanged) {
|
||||
window.onDarkModeChanged(darkModeEnabled)
|
||||
}
|
||||
safeLocalStorage.setItem(localStorageKey, JSON.stringify(darkModeEnabled))
|
||||
})
|
||||
}
|
||||
|
||||
const initPlayground = (theme) => {
|
||||
if (!samplesAreEnabled()) return
|
||||
instances.forEach(instance => instance.destroy())
|
||||
instances = []
|
||||
|
||||
// Manually tag code fragments as not processed by playground since we also manually destroy all of its instances
|
||||
document.querySelectorAll('code.runnablesample').forEach(node => {
|
||||
node.removeAttribute("data-kotlin-playground-initialized");
|
||||
})
|
||||
|
||||
KotlinPlayground('code.runnablesample', {
|
||||
getInstance: playgroundInstance => {
|
||||
instances.push(playgroundInstance)
|
||||
},
|
||||
theme: theme
|
||||
});
|
||||
}
|
||||
|
||||
// We check if type is accessible from the current scope to determine if samples script is present
|
||||
// As an alternative we could extract this samples-specific script to new js file but then we would handle dark mode in 2 separate files which is not ideal
|
||||
const samplesAreEnabled = () => {
|
||||
try {
|
||||
if (typeof KotlinPlayground === 'undefined') {
|
||||
// KotlinPlayground is exported universally as a global variable or as a module
|
||||
// Due to possible interaction with other js scripts KotlinPlayground may not be accessible directly from `window`, so we need an additional check
|
||||
KotlinPlayground = exports.KotlinPlayground;
|
||||
}
|
||||
return typeof KotlinPlayground === 'function';
|
||||
} catch (e) {
|
||||
return false
|
||||
}
|
||||
}
|
||||
|
||||
// Hash change is needed in order to allow for linking inside the same page with anchors
|
||||
// If this is not present user is forced to refresh the site in order to use an anchor
|
||||
window.onhashchange = handleAnchor
|
||||
@@ -275,14 +212,18 @@ function togglePlatformDependent(e, container) {
|
||||
for (let bm of child.children) {
|
||||
if (bm === target) {
|
||||
bm.setAttribute('data-active', "")
|
||||
bm.setAttribute('aria-pressed', "true")
|
||||
} else if (bm !== target) {
|
||||
bm.removeAttribute('data-active')
|
||||
bm.removeAttribute('aria-pressed')
|
||||
}
|
||||
}
|
||||
} else if (child.getAttribute('data-togglable') === index) {
|
||||
child.setAttribute('data-active', "")
|
||||
child.setAttribute('aria-pressed', "true")
|
||||
} else {
|
||||
child.removeAttribute('data-active')
|
||||
child.removeAttribute('aria-pressed')
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -299,16 +240,6 @@ function refreshFiltering() {
|
||||
refreshFilterButtons()
|
||||
refreshPlatformTabs()
|
||||
refreshNoContentNotification()
|
||||
refreshPlaygroundSamples()
|
||||
}
|
||||
|
||||
function refreshPlaygroundSamples() {
|
||||
document.querySelectorAll('code.runnablesample').forEach(node => {
|
||||
const playground = node.KotlinPlayground;
|
||||
/* Some samples may be hidden by filter, they have 0px height for visible code area
|
||||
* after rendering. Call this method for re-calculate code area height */
|
||||
playground && playground.view.codemirror.refresh();
|
||||
});
|
||||
}
|
||||
|
||||
function refreshNoContentNotification() {
|
||||
@@ -360,12 +291,20 @@ function refreshFilterButtons() {
|
||||
.forEach(f => {
|
||||
if (filteringContext.activeFilters.indexOf(f.getAttribute("data-filter")) !== -1) {
|
||||
f.setAttribute("data-active", "")
|
||||
f.setAttribute("aria-pressed", "true")
|
||||
} else {
|
||||
f.removeAttribute("data-active")
|
||||
f.removeAttribute("aria-pressed")
|
||||
}
|
||||
})
|
||||
document.querySelectorAll("#filter-section .checkbox--input")
|
||||
.forEach(f => {
|
||||
f.checked = filteringContext.activeFilters.indexOf(f.getAttribute("data-filter")) !== -1;
|
||||
const isChecked = filteringContext.activeFilters.indexOf(f.getAttribute("data-filter")) !== -1
|
||||
f.checked = isChecked;
|
||||
if (isChecked) {
|
||||
f.setAttribute("aria-pressed", "true")
|
||||
} else {
|
||||
f.removeAttribute("aria-pressed");
|
||||
}
|
||||
})
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user