Skip to content

Instantly share code, notes, and snippets.

@leMaur
Last active April 26, 2020 15:29
Show Gist options
  • Save leMaur/4de364603aa74444ac5ffd788087c66a to your computer and use it in GitHub Desktop.
Save leMaur/4de364603aa74444ac5ffd788087c66a to your computer and use it in GitHub Desktop.
require('./Toggleable');
[hidden] { display: none !important; }
(function(window, document) {
const rand = Math.random().toString(36).substr(2, 10);
const openClassName = 'opened';
const componentName = 'toggleable';
const triggerName = 'toggleable-trigger';
const wrapperName = 'toggleable-content';
const addToggleButton = wrapper => {
const button = document.createElement('button');
const trigger = document.querySelector(`[${triggerName}]`);
button.innerHTML = trigger.innerHTML;
button.className = trigger.className;
trigger.remove();
wrapper.prepend(button);
return button;
}
const makeToggleable = wrapper => {
const button = addToggleButton(wrapper);
button.setAttribute('aria-expanded', 'false');
const toggleable = document.querySelector(`[${wrapperName}]`);
toggleable.hidden = true;
const toggle = function (open) {
if (open !== undefined) {
button.setAttribute('aria-expanded', open);
toggleable.hidden = !open;
open ? wrapper.classList.add(openClassName) : wrapper.classList.remove(openClassName);
} else {
let toggled = toggleable.hidden;
button.setAttribute('aria-expanded', toggled);
toggleable.hidden = !toggled;
toggled ? wrapper.classList.add(openClassName) : wrapper.classList.remove(openClassName);
}
}
if (! toggleable.id) {
toggleable.id = `${wrapperName}-${rand}`;
}
button.setAttribute('aria-controls', toggleable.id);
button.addEventListener('click', () => { toggle() })
toggleable.removeAttribute(wrapperName);
wrapper.removeAttribute(componentName);
wrapper.id = `${componentName}-${rand}`;
wrapper.classList.add(componentName);
return { toggle };
}
const components = [...document.querySelectorAll(`[${componentName}]`)];
components.forEach((comp, i) => { makeToggleable(comp) });
})(window, document);
<div toggleable>
<div toggleable-trigger>
<!-- -->
</div>
<div toggleable-content hidden>
<!-- -->
</div>
</div>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment