//@ts-check /** * Creates a document state object that can toggle between exclusive states. * All passed states' css classnames will be prepended with `mode-`. * @param {string[]} states */ export const documentState = (states) => { const all = states.map((state) => `mode-${state}`); /** * @param {any} state * @returns {state is number} */ const isValidIndex = (state) => typeof state === "number" && state >= 0 && state < all.length; /** * @param {number} state */ const is = (state) => isValidIndex(state) && document.body.classList.contains(all[state]); /** * @param {number|undefined|null|false} state */ const set = (state = false) => { document.body.classList.remove(...all); isValidIndex(state) && document.body.classList.add(all[state]); }; return { set, is }; }; export default documentState;