Sidecap
Sidecap
Basic example
<div class="overlay show">
<a href="#" onclick="event.preventDefault();sidecaps.open(sidecaps.elements[0])">Toggle Sidecap component</a>
<div role="dialog" aria-modal="true" tabindex="-1" class="sidecap">
<div>
<div>
123
</div>
<div>
<a href="#" onclick="event.preventDefault();sidecaps.close(sidecaps.elements[0])" class="btn blank">
<svg width="16" fill="none" viewBox="0 0 24 24" stroke-width="1.5" stroke="currentColor"><path stroke-linecap="round" stroke-linejoin="round" d="M6 18L18 6M6 6l12 12"></path></svg>
</a>
</div>
</div>
<div>
444
</div>
<div>
333
</div>
</div>
</div>
@use '~/styles/app.scss' as app;
$overlay: app.get-theme(app.$theme, 'components.overlay');
@include app.generate-component(
$overlay,
'overlay',
app.$config,
app.$theme
);
$button: app.get-theme(app.$theme, 'components.button');
@include app.generate-component(
$button,
'btn',
app.$config,
app.$theme
);
$sidecap: app.get-theme(app.$theme, 'components.sidecap');
@include app.generate-component(
$sidecap,
'sidecap',
app.$config,
app.$theme
);
const sidecap = (elements, options) => {
const defaults = {
};
// @TODO add scroll lock
// @TODO add ontransitionend
// Options
const settings = Object.assign({}, defaults, options);
const _close = (sidecap) => {
sidecap.classList.remove('open');
}
const _open = (sidecap) => {
sidecap.classList.add('open');
}
const _add_event_listeners_dom = () => {
document.addEventListener('keydown', event => {
if (event.key === 'Escape' || event.keyCode === 27) {
[].forEach.call(elements, (sidecap) => {
_close(sidecap);
})
}
});
}
const _add_event_listeners = (sidecap) => {
sidecap.addEventListener('click', (e) => {
e.preventDefault();
})
}
const _init = () => {
_add_event_listeners_dom();
[].forEach.call(elements, (sidecap) => {
_add_event_listeners(sidecap);
})
};
// Initiating the accordion
if(sidecap) {
_init();
}
return ({
elements : elements,
open : (element) => {
document.body.toggleAttribute('scroll-lock');
_open(element);
},
close : (element) => {
document.body.toggleAttribute('scroll-lock');
_close(element);
}
})
}
const sidecaps = sidecap(document.querySelectorAll('.sidecap'), {
});