<div id="user-menu-66517-74042" 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-66517-74042-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
}
.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);
}
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);
});
});
No notes defined.