Popover

<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
  • Content:
    .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;
      }
    
    
    }
    
  • URL: /components/raw/popover/_popover.scss
  • Filesystem Path: src/components/demo/popover/_popover.scss
  • Size: 1.2 KB
  • Content:
    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();
    
  • URL: /components/raw/popover/popover.js
  • Filesystem Path: src/components/demo/popover/popover.js
  • Size: 7.3 KB

No notes defined.