This commit is contained in:
InsanusMokrassar
2026-05-23 11:30:30 +00:00
parent 55907d39f9
commit 80a0145cb4
6686 changed files with 469404 additions and 412054 deletions

View File

@@ -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");
}
})
}