<div id="user-menu-26758-68381" class="overlay overlay--slim" aria-label="Benutzermenü" aria-labelledby="" data-destroy-after-close="false" data-redirect-after-close="false" data-overlay="user-menu" data-menu-tracking-category="user-menu">
    <div class="overlay__backdrop"></div>

    <div class="overlay__overlay u-inverted" role="document">
        <div class="overlay__bar">

            <button class="overlay__close" type="button" title="Schließen">
                <svg class="icon icon--cross" viewBox="0 0 200 200" aria-hidden="true">
                    <use xlink:href="/assets/icons/icons.3bafb6df0d.svg#cross"></use>
                </svg> </button>
        </div>

        <div class="overlay__content">
            <div class="user-menu">
                <div class="user-menu__menu" id="user-menu-26758-68381-menu" aria-hidden="false">

                    <div class="user-menu__menu-user">
                        <svg class="icon icon--profile-image user-menu__menu-user-icon" viewBox="0 0 200 200" aria-hidden="true">
                            <use xlink:href="/assets/icons/icons.3bafb6df0d.svg#profile-image"></use>
                        </svg>
                        <div class="user-menu__menu-user-headline">
                            <div class="headline headline--3"><span class="headline__text">Willkommen</span></div>
                        </div>

                        <div class="user-menu__menu-user-status">Logge dich ein um alle Angebote von e-fellows.net zu nutzen</div>

                    </div>

                    <div class="user-menu__menu-login">
                        <div class="user-menu__menu-login-button">
                            <a class="button u-underline" href="#">Jetzt einloggen</a>
                        </div>

                        <div class="user-menu__menu-login-text">Neu hier? <a class="link link--internal" href="#"><span class="link__text u-underline">Kostenlos anmelden</span></a>
                        </div>
                    </div>

                </div>

            </div>

        </div>

    </div>
</div>
{% set id = id ??? html_id('user-menu') -%}

{% embed '@overlay' with {
  id: id,
  open: open ?? false,
  closeUrl: closeUrl ?? false,
  label: 'User Menu' | t('site'),
  slim: true,
  destroyAfterClose: false,
  attrs: {
    'data-overlay': 'user-menu',
    'data-menu-tracking-category': 'user-menu',
  },
} %}
  {% macro menu(menuId, menu, level = 1, visible = false, parentItem = null) %}
    <div {{ html_attributes({
      class: 'user-menu__menu',
      id: menuId,
      'aria-hidden': visible ? 'false' : 'true',
    }) }}>
      {% if level > 1 %}
        <div class="user-menu__menu-headline">
          {% if menu.icon|default %}
            {% include '@icon' with {
              icon: menu.icon,
              class: 'user-menu__menu-headline-icon',
            } only %}
          {% endif %}

          {% include '@headline' with {
            text: menu.text,
            size: 4,
            tag: 'span',
          } %}
        </div>
      {% endif %}

      {% if menu.user|default %}
        <div class="user-menu__menu-user">
          {% if menu.user.image|default %}
            <img {{ html_attributes({
              class: 'user-menu__menu-user-image',
              src: menu.user.image,
              width: 100,
              height: 100,
              alt: '',
              role: 'presentation',
            }) }}>
          {% else %}
            {% include '@icon' with {
              icon: 'profile-image',
              class: 'user-menu__menu-user-icon',
            } only %}
          {% endif %}

          <div class="user-menu__menu-user-headline">
            {% include '@headline' with {
              text: menu.user.headline,
              size: 3,
              tag: 'div',
            } only %}
          </div>

          {% if menu.user.status|default %}
            <div class="user-menu__menu-user-status">
              {{- menu.user.status -}}
            </div>
          {% endif %}

          {% if menu.user.alert|default %}
            <div class="user-menu__menu-user-alert">
              {% include '@icon-with-text' with {
                icon: 'info-alt',
              } | merge(menu.user.alert) only %}
            </div>
          {% endif %}
        </div>
      {% endif %}

      {% if menu.items|default and menu.items|length > 0 %}
        <ul class="user-menu__menu-items" role="list">
          {% for item in menu.items %}
            {% set hasSubMenu = (item.items is defined and item.items|length > 0) or item.content is defined %}
            {% set subMenuId = "submenu-#{loop.index}" | namespaceInputId(menuId) %}
            {% set label = parentItem ? "#{parentItem}:#{item.text}" : item.text %}

            <li class="user-menu__menu-item">
              <div class="user-menu__link">
                {% include '@icon-button' with {
                  link: item.link ?? false,
                  text: item.text,
                  icon: item.icon ??? 'arrow-right',
                  count: item.count ?? false,
                  target: item.target ?? null,
                  attrs: hasSubMenu ? {
                    'aria-haspopup': 'true',
                    'aria-expanded': 'false',
                    'aria-controls': subMenuId,
                    'data-navigation-link': { level: level, label: label, position: loop.index },
                  } : {
                    'data-navigation-link': { level: level, label: label, position: loop.index },
                  },
                } only %}
              </div>

              {% if hasSubMenu %}
                {{ _self.menu(subMenuId, item, level + 1, false, label) }}
              {% endif %}
            </li>
          {% endfor %}
        </ul>
      {% endif %}

      {% if menu.content|default %}
        <div class="user-menu__menu-content">
          {% include menu.content.use with menu.content.configuration | merge({
            id: 'content' | namespaceInputId(menuId),
          }) only %}
        </div>
      {% endif %}

      {% if menu.login|default %}
        <div class="user-menu__menu-login">
          <div class="user-menu__menu-login-button">
            {% include '@button' with menu.login only %}
          </div>

          {% if menu.loginText|default %}
            <div class="user-menu__menu-login-text">
              {{- menu.loginText | componentize -}}
            </div>
          {% endif %}
        </div>
      {% endif %}

      {% if menu.logoutForm|default %}
        <form {{ html_attributes({
          class: 'user-menu__menu-logout',
          action: menu.logoutForm.action ??? '',
          method: menu.logoutForm.method ??? 'post',
          enctype: 'multipart/form-data',
          'accept-charset': 'utf-8',
        }, menu.logoutForm.attrs ?? {}) }}>
          {{ menu.logoutForm.csrf|default ? csrfInput({ autocomplete: 'false' }) }}
          {{ menu.logoutForm.actionUrl|default ? actionInput(menu.logoutForm.actionUrl) }}
          {{ menu.logoutForm.redirectUrl|default ? redirectInput(menu.logoutForm.redirectUrl) }}

          {% for name, value in menu.logoutForm.hiddenInputs|default %}
            {{ value ? hiddenInput(name, value) }}
          {% endfor %}

          {% include '@button' with menu.logoutForm.button | merge({
            type: 'submit',
          }) only %}
        </form>
      {% endif %}

      {% if level > 1 %}
        <div class="user-menu__menu-back">
          {% include '@icon-button' with {
            icon: 'arrow-left',
            text: 'Back' | t('site'),
            attrs: {
              'data-overlay-close': 'user-menu',
            },
          } only %}
        </div>
      {% endif %}
    </div>
  {% endmacro %}

  {% block content %}
    <div class="user-menu">
      {{ _self.menu('menu' | namespaceInputId(id), menus[0] ?? menu, 1, true) }}
    </div>
  {% endblock %}
{% endembed %}
{
  "open": true,
  "menus": [
    {
      "user": {
        "headline": "Willkommen",
        "status": "Logge dich ein um alle Angebote von e-fellows.net zu nutzen"
      },
      "login": {
        "link": "#",
        "text": "Jetzt einloggen"
      },
      "loginText": "Neu hier? <a href=\"#\">Kostenlos anmelden</a>\n"
    }
  ]
}
  • Content:
    .user-menu {
      --underline-height: 2px;
      --underline-color--enter: var(--color-orange);
      --underline-offset: 0.75rem;
    
      display: flex;
      flex-grow: 1;
      inline-size: calc(100% + var(--overlay-content-padding-inline, 0) * 2);
      margin-inline: calc(var(--overlay-content-padding-inline, 0) * -1);
      position: relative;
    }
    
    .user-menu__menu {
      --focus-outline-offset: -3px;
    
      background-color: var(--menu-background-color, var(--color-midnight));
      display: flex;
      flex-direction: column;
      inline-size: 100%;
      inset: 0;
      overflow-x: hidden;
      overflow-y: auto;
      padding-block: var(--overlay-content-padding-inline);
      padding-inline: var(--overlay-content-padding-inline);
      position: absolute;
      z-index: 3;
    
      &[aria-hidden='true'] {
        display: none;
      }
    }
    
    .user-menu__menu--with-open-submenu {
      overflow-y: hidden;
    }
    
    .user-menu__menu .user-menu__menu {
      animation: slide-from-right var(--duration-default);
      background-color: var(--menu-submenu-background-color, var(--color-midnight-offset));
      inset-block-end: 0;
      inset-block-start: var(--overlay-bar-height);
      inset-inline-end: 0;
      inset-inline-start: auto;
      margin-block-start: 0;
      max-inline-size: var(--overlay-max-width);
      padding-block-start: calc(var(--overlay-bar-height) + 1rem);
      position: fixed;
    
      .user-menu__menu-items {
        padding-block-end: var(--overlay-content-padding-inline);
      }
    }
    
    .user-menu__menu-back {
      --icon-button-background-color: transparent;
      --icon-button-background-color-active: transparent;
      --icon-button-border-color: transparent;
      --icon-button-border-color-active: transparent;
      --icon-button-icon-color: var(--color-orange);
      --icon-button-icon-color-active: var(--color-orange);
      --icon-button-size: 2.6rem;
      --icon-button-icon-size: 2.6rem;
      --icon-button-gap: 0.6rem;
      --icon-button-font-weight: var(--font-weight-regular);
      --icon-button-underline-height: 1px;
      --icon-button-text-size: 1.6rem;
    
      align-items: center;
      backdrop-filter: blur(10px);
      background-color: rgba(#1f1c31, 0.8);
      block-size: var(--overlay-bar-height);
      display: flex;
      flex-shrink: 0;
      inset-block-start: calc((var(--overlay-bar-height) + 1rem) * -1);
      margin-block-end: 1rem;
      margin-block-start: calc((var(--overlay-bar-height) + 1rem) * -1);
      margin-inline: calc(var(--overlay-content-padding-inline) * -1);
      order: -1;
      padding-inline: var(--overlay-content-padding-inline);
      position: sticky;
      z-index: 2;
    }
    
    .user-menu__menu-headline {
      margin-block-end: 3rem;
    }
    
    .user-menu__menu-headline-icon {
      vertical-align: -0.2em;
    }
    
    .user-menu__menu-user {
      border-block-end: 2px solid rgba(#fff, 0.1);
      margin-block-end: 4rem;
      padding-block-end: 4rem;
      text-align: center;
    }
    
    .user-menu__menu-user-image {
      block-size: 10rem;
      border-radius: 50%;
      inline-size: 10rem;
      object-fit: cover;
      overflow: hidden;
    }
    
    .user-menu__menu-user-icon {
      color: var(--color-orange);
      font-size: 10rem;
      line-height: 0;
    }
    
    .user-menu__menu-user-headline {
      align-items: center;
      display: flex;
      flex-wrap: wrap;
      justify-content: center;
    
      &:not(:first-child) {
        margin-block-start: 2rem;
      }
    }
    
    .user-menu__menu-user-status {
      font-size: 1.6rem;
      inline-size: 75%;
      line-height: var(--line-height-body);
      margin-inline: auto;
      max-inline-size: 40rem;
    
      &:not(:first-child) {
        margin-block-start: 0.8rem;
      }
    }
    
    .user-menu__menu-user-alert {
      --icon-with-text-icon-color: var(--color-orange);
    
      border: 2px solid var(--color-orange);
      font-size: 1.4rem;
      padding: 1.5rem;
      text-align: start;
    
      &:not(:first-child) {
        margin-block-start: 3rem;
      }
    }
    
    .user-menu__menu-items {
      --focus-outline-offset: 5px;
    
      display: grid;
      gap: 3rem;
    }
    
    .user-menu__menu-item {
      display: block;
    }
    
    .user-menu__menu-login {
      text-align: center;
    }
    
    .user-menu__menu-login-text {
      margin-block-start: 2rem;
    }
    
    .user-menu__menu-logout {
      border-block-start: 2px solid rgba(#fff, 0.1);
      margin-block-start: 4rem;
      padding-block-start: 4rem;
    }
    
    .user-menu__link {
      --icon-button-background-color: transparent;
      --icon-button-background-color-active: transparent;
      --icon-button-border-color: transparent;
      --icon-button-border-color-active: transparent;
      --icon-button-icon-color: var(--color-orange);
      --icon-button-icon-color-active: var(--color-orange);
      --icon-button-size: 3rem;
      --icon-button-icon-size: 3rem;
      --icon-button-gap: 1.5rem;
      --icon-button-font-weight: var(--font-weight-regular);
      --icon-button-underline-height: 2px;
      --icon-button-underline-focus-color: var(--color-orange);
    }
    
  • URL: /components/raw/user-menu/user-menu.scss
  • Filesystem Path: src/components/3-organisms/user-menu/user-menu.scss
  • Size: 4.5 KB
  • Content:
    import { disableBodyScroll, enableBodyScroll } from 'body-scroll-lock';
    import { on } from 'delegated-events';
    import moveFocus from '../../../javascripts/utils/moveFocus';
    
    let $activeFocus: HTMLElement | null = null;
    
    const getTrackingCategory = ($element: HTMLElement) => {
      const $base = $element.closest<HTMLElement>('[data-menu-tracking-category]');
      return $base?.dataset.menuTrackingCategory ?? 'menu';
    };
    
    on('click', '[data-navigation-link]', (event) => {
      const { currentTarget: $target } = event;
      const { navigationLink = '{}' } = $target.dataset;
      const {
        label = $target.textContent ?? undefined,
        level = 0,
        context = 'n_a',
        position = undefined,
      } = JSON.parse(navigationLink);
    
      // Get type of click
      let eventSubcategory = 'clickthrough';
      if ($target.hasAttribute('aria-controls')) {
        eventSubcategory =
          $target.getAttribute('aria-expanded') === 'false'
            ? 'level_down'
            : 'level_up';
      }
    
      // Send tracking information
      window.dataLayer = window.dataLayer || [];
      window.dataLayer.push({
        event: 'nav_menu_interaction',
        eventCategory: getTrackingCategory($target),
        eventSubcategory,
        eventSubcategory2: context,
        eventSubcategory3: `level_${level}`,
        eventLocation: 'text_link',
        eventInnerLocation: position,
        eventLabel: label,
        eventTargetUrl: $target.getAttribute('href') ?? undefined,
      });
    });
    
    on('click', '.user-menu__menu-item [aria-controls]', (event) => {
      const { currentTarget: $target } = event;
    
      event.preventDefault();
    
      const controls = $target.getAttribute('aria-controls') as string;
      const $panel = document.getElementById(controls);
      const $menu = $target.closest('.user-menu__menu');
    
      if (!$panel || !$menu) {
        return;
      }
    
      if ($target.getAttribute('aria-expanded') === 'false') {
        $menu.classList.add('user-menu__menu--with-open-submenu');
        $target.setAttribute('aria-expanded', 'true');
        $panel.setAttribute('aria-hidden', 'false');
    
        $activeFocus = $target;
        moveFocus($panel);
      } else {
        $target.setAttribute('aria-expanded', 'false');
        $panel.setAttribute('aria-hidden', 'true');
        $menu.classList.remove('user-menu__menu--with-open-submenu');
    
        if ($activeFocus) {
          moveFocus($activeFocus);
          $activeFocus = null;
        }
      }
    });
    
    on('click', '[data-overlay-close="user-menu"]', (event) => {
      const { currentTarget: $target } = event;
    
      event.preventDefault();
    
      $target
        .closest('.user-menu__menu-item')
        ?.querySelector<HTMLAnchorElement>('[aria-controls]')
        ?.click();
    });
    
    on('overlay:show', '[data-overlay="user-menu"]', (event) => {
      const { currentTarget: $overlay } = event;
      const trackingCategory = 'profile_menu';
    
      // Send tracking information
      window.dataLayer = window.dataLayer || [];
      window.dataLayer.push({
        event: 'nav_menu_interaction',
        eventCategory: trackingCategory,
        eventSubcategory: 'open',
        eventLabel: `${trackingCategory}_open`,
      });
    
      // Disable scrolling for every menu panel
      $overlay.querySelectorAll('.user-menu__menu').forEach(($submenu) => {
        disableBodyScroll($submenu);
      });
    });
    
    on('overlay:hide', '[data-overlay="user-menu"]', (event) => {
      const { currentTarget: $overlay } = event;
    
      $overlay.querySelectorAll('.user-menu__menu').forEach(($submenu) => {
        enableBodyScroll($submenu);
      });
    });
    
  • URL: /components/raw/user-menu/user-menu.ts
  • Filesystem Path: src/components/3-organisms/user-menu/user-menu.ts
  • Size: 3.4 KB

No notes defined.