<div class="popover-demo__wrapper">
<h1>Popovers Playground</h1>
<div class="popover-demo__controls-container">
</div>
<div class="popover-demo__trigger-container">
<button class="bux-popover__trigger bux-context-menu__trigger bux-context-menu__trigger--icon-button" data-stay-open="true">
<span class="visually-hidden">example popover trigger</span>
<span aria-hidden="true" class="icon icon-dots-h"></span>
</button>
<div class="bux-popover__container bux-context-menu__container container--position-above-trigger container--justify-caret-left">
<div class="bux-popover__caret caret--justify-trigger-center">
<svg viewBox="0 0 10 10">
<path class="caret--chevron"></path>
</svg>
</div>
<div class="bux-context-menu__active-item-indicator" aria-hidden="true"></div>
<ul class="bux-popover__body">
<li class="bux-context-menu__item">
<a class="item__link" href="#">
Level 1
</a>
</li>
<li class="bux-context-menu__item">
<a class="item__link" href="#">
Level 2
</a>
</li>
</ul>
</div>
</div>
</div>
<div class="popover-demo__wrapper">
<h1>Popovers Playground</h1>
<div class="popover-demo__controls-container">
</div>
<div class="popover-demo__trigger-container">
{% set vars = {
trigger_icon: "dots-h",
container_position: "above",
caret_justify_to_trigger: "center",
container_justify_to_caret: "left",
label: "example popover trigger",
stay_open: "true",
items: [
{
text: "Level 1",
href: "#",
},
{
text: "Level 2",
href: "#"
}
]
} %}
{% include '@context-menu' with vars %}
</div>
</div>
site_name_prefix: Office of
site_name: Learning Relations Excellence
site_slogan: Additional text or site slogan
address_1: 100 Building Name
address_2: 1 Oval Mall
city: Columbus
state: OH
zip: '43210'
contact_email: email@osu.edu
contact_phone: 614-292-OHIO
contact_tty: 614-688-8605
.popover-demo__wrapper {
display: grid;
margin: 0;
padding: 32px;
grid-template-columns: repeat(auto-fill, minmax(300px, 1fr));
grid-template-rows: max-content 1fr;
gap: 1rem;
h1 {
grid-row: 1;
grid-column: 1 / span 2;
}
.popover-demo__controls-container {
grid-row: 2;
}
h2.control-group__header {
font-size: 1.25rem;
line-height: 1.25;
}
.control-group {
display: flex;
flex-direction: column;
}
.popover-demo__trigger-container {
display: grid;
border: 1px solid $gray-light-60;
grid-row: 2;
place-items: center;
.bux-popover__trigger {
display: grid;
cursor: pointer;
transition-timing-function: cubic-bezier(.4, 0, .2, 1);
transition-duration: 300ms;
transition-property: background-color, color;
border: 1px solid $gray-dark-80;
background-color: $white;
& span {
transform: translateY(3px);
}
&:hover {
color: $white;
background-color: $gray-dark-80;
}
&:focus {
outline: 2px solid $focus;
outline-offset: 2px;
}
}
}
.hidden {
display: none;
}
}
function popoverPlayground() {
const playgroundControls = document.querySelector(
'.popover-demo__controls-container');
if (!playgroundControls) return;
const container = document.querySelector('.bux-popover__container');
const caret = document.querySelector('.bux-popover__caret');
if (!container || !caret) {
return;
}
const createRadioInput = (groupName, label, value) => {
const labelElement = document.createElement('label');
labelElement.classList.add('radio-input');
const labelTextElement = document.createElement('span');
labelTextElement.appendChild(document.createTextNode(label));
labelTextElement.classList.add('radio-input__label-text');
const inputElement = document.createElement('input');
inputElement.classList.add('radio-input__input-element');
inputElement.setAttribute('type', 'radio');
inputElement.setAttribute('value', value);
inputElement.setAttribute('name', groupName);
labelElement.appendChild(inputElement);
labelElement.appendChild(labelTextElement);
return labelElement;
};
const createControls = (groupName, group) => Object.entries(group)
.map(([name, className]) => createRadioInput(groupName, name, className));
const containerPositionControls = createControls('container-position',
$popoverConfig.classNames.container.position);
const containerCaretAlignControls = createControls('container-caret-align',
$popoverConfig.classNames.container.caret.align);
const containerCaretJustifyControls = createControls('container-caret-justify',
$popoverConfig.classNames.container.caret.justify);
const caretAlignControls = createControls('caret-align',
$popoverConfig.classNames.caret.align);
const caretJustifyControls = createControls('caret-justify',
$popoverConfig.classNames.caret.justify);
const createControlsGroup = (header, controls) => {
const groupElement = document.createElement('div');
groupElement.classList.add('control-group');
const headerElement = document.createElement('h2');
headerElement.classList.add('control-group__header');
headerElement.appendChild(document.createTextNode(header));
groupElement.appendChild(headerElement);
controls.forEach((control) => {
groupElement.appendChild(control);
});
playgroundControls.appendChild(groupElement);
return groupElement;
};
const positionGroup = createControlsGroup('Container position',
containerPositionControls);
const containerAlignGroup = createControlsGroup('Container alignment to caret',
containerCaretAlignControls);
const containerJustifyGroup = createControlsGroup(
'Container justification to caret',
containerCaretJustifyControls);
const caretAlignGroup = createControlsGroup('Caret alignment to trigger',
caretAlignControls);
const caretJustifyGroup = createControlsGroup('Caret justification to trigger',
caretJustifyControls);
const showJustifyGroups = () => {
containerJustifyGroup.classList.remove('hidden');
caretJustifyGroup.classList.remove('hidden');
};
const showAlignGroups = () => {
containerAlignGroup.classList.remove('hidden');
caretAlignGroup.classList.remove('hidden');
};
const hideJustifyGroups = () => {
containerJustifyGroup.classList.add('hidden');
caretJustifyGroup.classList.add('hidden');
};
const hideAlignGroups = () => {
containerAlignGroup.classList.add('hidden');
caretAlignGroup.classList.add('hidden');
};
const removeAlignChoices = () => {
containerCaretAlignControls.forEach((alignControl) => {
alignControl.querySelector('input').checked = false;
container.classList.remove(alignControl.querySelector('input').value);
});
caretAlignControls.forEach((alignControl) => {
alignControl.querySelector('input').checked = false;
caret.classList.remove(alignControl.querySelector('input').value);
});
};
const removeJustifyChoices = () => {
containerCaretJustifyControls.forEach((justifyControl) => {
justifyControl.querySelector('input').checked = false;
container.classList.remove(justifyControl.querySelector('input').value);
});
caretJustifyControls.forEach((justifyControl) => {
justifyControl.querySelector('input').checked = false;
caret.classList.remove(justifyControl.querySelector('input').value);
});
};
const setDefaultJustifyChoices = () => {
containerCaretJustifyControls[1].querySelector('input').checked = true;
container.classList.add($popoverConfig.classNames.container.caret.justify.center);
caretJustifyControls[1].querySelector('input').checked = true;
caret.classList.add($popoverConfig.classNames.caret.justify.triggerCenter);
};
const setDefaultAlignChoices = () => {
containerCaretAlignControls[1].querySelector('input').checked = true;
container.classList.add($popoverConfig.classNames.container.caret.align.center);
caretAlignControls[1].querySelector('input').checked = true;
caret.classList.add($popoverConfig.classNames.caret.align.triggerCenter);
};
const setDefaultPositionChoices = () => {
containerPositionControls[1].querySelector('input').checked = true;
container.classList.remove(...Object.values($popoverConfig.classNames.container.position));
container.classList.add($popoverConfig.classNames.container.position.below);
switchToAboveBelow();
};
const switchToAboveBelow = () => {
hideAlignGroups();
showJustifyGroups();
removeAlignChoices();
removeJustifyChoices();
setDefaultJustifyChoices();
};
const switchToLeftRight = () => {
hideJustifyGroups();
showAlignGroups();
removeJustifyChoices();
removeAlignChoices();
setDefaultAlignChoices();
};
containerPositionControls.forEach((control) => {
control.querySelector('input').addEventListener('change', (e) => {
if (!e.target.checked) return;
if (['container--position-above-trigger', 'container--position-below-trigger'].includes(
e.target.value)) {
switchToAboveBelow();
} else {
switchToLeftRight();
}
container.classList.remove(...Object.values($popoverConfig.classNames.container.position));
container.classList.add(e.target.value);
window.dispatchEvent(new Event('bux:popover:update-position'));
});
});
const addControlListeners = (group, classNameGroup, targetElement) => {
group.forEach((radio) => {
radio.addEventListener('change', (e) => {
if (!e.target.checked) return;
Object.values(classNameGroup).forEach((className) => {
targetElement.classList.remove(className);
});
targetElement.classList.add(e.target.value);
window.dispatchEvent(new Event('bux:popover:update-position'));
});
});
};
addControlListeners(containerCaretAlignControls,
$popoverConfig.classNames.container.caret.align,
container);
addControlListeners(containerCaretJustifyControls,
$popoverConfig.classNames.container.caret.justify,
container);
addControlListeners(caretAlignControls,
$popoverConfig.classNames.caret.align,
caret);
addControlListeners(caretJustifyControls,
$popoverConfig.classNames.caret.justify,
caret);
setDefaultPositionChoices();
}
popoverPlayground();
No notes defined.