"use strict";
window.Gleam = function() {
/* Global Object */
const self = {};
/* Public Properties */
self.hashOffset = undefined;
/* Public Methods */
self.getProperty = function(property) {
let value;
try {
value = localStorage.getItem(`Gleam.${property}`);
}
catch (_error) {}
if (-1 < [null, undefined].indexOf(value)) {
return gleamConfig[property].values[0].value;
}
return value;
};
self.icons = function() {
return Array.from(arguments).reduce(
(acc, name) =>
`${acc}
`,
""
);
}
self.scrollToHash = function() {
const locationHash = arguments[0] || window.location.hash;
const query = locationHash ? locationHash : "body";
const hashTop = document.querySelector(query).offsetTop;
window.scrollTo(0, hashTop - self.hashOffset);
return locationHash;
};
self.toggleSidebar = function() {
const previousState =
bodyClasses.contains("drawer-open") ? "open" : "closed";
let state;
if (0 < arguments.length) {
state = false === arguments[0] ? "closed" : "open";
}
else {
state = "open" === previousState ? "closed" : "open";
}
bodyClasses.remove(`drawer-${previousState}`);
bodyClasses.add(`drawer-${state}`);
if ("open" === state) {
document.addEventListener("click", closeSidebar, false);
}
};
/* Private Properties */
const html = document.documentElement;
const body = document.body;
const bodyClasses = body.classList;
const sidebar = document.querySelector(".sidebar");
const sidebarToggles = document.querySelectorAll(".sidebar-toggle");
const displayControls = document.createElement("div");
displayControls.classList.add("display-controls");
sidebar.appendChild(displayControls);
/* Private Methods */
const initProperty = function(property) {
const config = gleamConfig[property];
displayControls.insertAdjacentHTML(
"beforeend",
config.values.reduce(
(acc, item, index) => {
const tooltip =
item.label
? `alt="${item.label}" title="${item.label}"`
: "";
let inner;
if (item.icons) {
inner = self.icons(...item.icons);
}
else if (item.label) {
inner = item.label;
}
else {
inner = "";
}
return `
${acc}
${inner}
`;
},
`
`
);
setProperty(null, property, function() {
return self.getProperty(property);
});
};
const setProperty = function(_event, property) {
const previousValue = self.getProperty(property);
const update =
2 < arguments.length ? arguments[2] : gleamConfig[property].update;
const value = update();
try {
localStorage.setItem("Gleam." + property, value);
}
catch (_error) {}
bodyClasses.remove(`${property}-${previousValue}`);
bodyClasses.add(`${property}-${value}`);
const isDefault = value === gleamConfig[property].values[0].value;
const toggleClasses =
document.querySelector(`#${property}-toggle`).classList;
toggleClasses.remove(`toggle-${isDefault ? 1 : 0}`);
toggleClasses.add(`toggle-${isDefault ? 0 : 1}`);
try {
gleamConfig[property].callback(value);
}
catch(_error) {}
return value;
}
const setHashOffset = function() {
const el = document.createElement("div");
el.style.cssText =
`
height: var(--hash-offset);
pointer-events: none;
position: absolute;
visibility: hidden;
width: 0;
`;
body.appendChild(el);
self.hashOffset = parseInt(
getComputedStyle(el).getPropertyValue("height") || "0"
);
body.removeChild(el);
};
const closeSidebar = function(event) {
if (! event.target.closest(".sidebar-toggle")) {
document.removeEventListener("click", closeSidebar, false);
self.toggleSidebar(false);
}
};
const init = function() {
for (const property in gleamConfig) {
initProperty(property);
const toggle = document.querySelector(`#${property}-toggle`);
toggle.addEventListener("click", function(event) {
setProperty(event, property);
});
}
sidebarToggles.forEach(function(sidebarToggle) {
sidebarToggle.addEventListener("click", function(event) {
event.preventDefault();
self.toggleSidebar();
});
});
setHashOffset();
window.addEventListener("load", function(_event) {
self.scrollToHash();
});
window.addEventListener("hashchange", function(_event) {
self.scrollToHash();
});
document.querySelectorAll(`
.module-name > a,
.member-name a[href^='#']
`).forEach(function(title) {
title.innerHTML =
title.innerHTML.replace(/([A-Z])|([_/])/g, "$2$1");
});
};
/* Initialise */
init();
return self;
}();